本页面介绍如何解决在使用 Eventarc Advanced 时可能遇到的问题。
CMEK 问题
您可以使用客户管理的加密密钥 (CMEK) 来保护 Eventarc。 密钥通过 Cloud Key Management Service (Cloud KMS) 创建和管理。下表介绍了将 Cloud KMS 与 Eventarc 搭配使用时可能会遇到的不同 CMEK 问题以及如何解决这些问题。创建或更新 Eventarc 资源时出现的问题
| CMEK 问题 | 错误消息 | 说明 |
|---|---|---|
| 已停用的密钥 | $KEY is not enabled, current state is: DISABLED |
提供的 Cloud KMS 密钥已针对 Eventarc 资源停用。与资源关联的活动或消息不再受到保护。 解决方案:
|
| 超出配额 | Quota exceeded for limit |
您已达到 Cloud KMS 请求的配额上限。 解决方案:
|
| 区域不匹配 | Key region $REGION must match the resource to be protected |
提供的 KMS 密钥区域与资源的区域不同。 解决方案: 使用来自同一区域的 Cloud KMS 密钥。 |
| 组织政策限制条件 | project/PROJECT_ID violated org policy constraint |
Eventarc 集成了以下两种组织政策限制条件,以帮助确保在整个组织范围内使用 CMEK。任何现有 Eventarc 资源都不受在资源创建后设置的政策约束;不过,更新资源可能会失败。
|
活动递送期间出现的问题
| CMEK 问题 | 错误消息 | 说明 |
|---|---|---|
| 已停用的密钥 | $KEY is not enabled, current state is: DISABLED |
提供的 Cloud KMS 密钥已针对 Eventarc 资源停用。与资源关联的活动或消息不再受到保护。 解决方案:
|
| 超出配额 | Quota exceeded for limit |
您已达到 Cloud KMS 请求的配额上限。 解决方案:
|
| 权限错误 | Permission 'cloudkms.cryptoKeyVersions.useToEncrypt' denied on
resource $KEY (or it may not exist) |
提供的 Cloud KMS 密钥不存在,或者 Identity and Access Management (IAM) 权限未正确配置。 解决方案:
|
如需解决通过 Cloud External Key Manager (Cloud EKM) 使用外部管理的密钥时可能遇到的问题,请参阅 Cloud EKM 错误参考。
HTTP 400 Bad Request 错误
如果流水线遇到一般性 HTTP 400 Bad Request 错误,通常表示存在转换或消息绑定问题,或者与目标端点相关的问题。请务必执行以下操作:
HTTP 503 Service Unavailable 错误
如果您遇到 HTTP 503 Service Unavailable 错误,并且流水线使用 DNS 地址(例如 Cloud Run)将消息路由到 Google 目的地,请确保在网络连接中使用的子网上启用了专用 Google 访问通道;否则,DNS 地址将无法解析。
使用 Eventarc 服务代理时权限遭拒
如果您在尝试创建 Eventarc Advanced 资源时遇到以下错误,请等待几分钟(可能需要 7 分钟),然后再次尝试创建资源:
Permission denied while using the Eventarc Service Agent. If you recently started to use Eventarc, it may take a few minutes before all necessary permissions are propagated to the Service Agent. Otherwise, verify that it has Eventarc Service Agent role.
服务代理充当特定项目的给定 Google Cloud 服务的身份。如需了解详情,请参阅服务代理并查看 Eventarc 服务代理角色 (roles/eventarc.serviceAgent) 的 Identity and Access Management (IAM) 权限。
如果您在尝试重新创建资源后仍然遇到之前的错误,请完成以下步骤,验证您的 Google Cloud 项目中是否存在 Eventarc 服务代理以及该代理是否具有必要的角色:
发布到 Cloud Run 作业的问题
本部分介绍了如何解决在向 Cloud Run 作业发布事件时可能遇到的问题。如需查看端到端演示,请参阅快速入门。
HTTP 403 Forbidden 错误
如果您在尝试执行替换作业配置(例如通过定义消息绑定)的 Cloud Run 作业时遇到 HTTP 403 Forbidden 错误,请确保您已向 Eventarc 流水线使用的 OAuth 服务账号授予 Cloud Run Developer (roles/run.developer) 或 Cloud Run Jobs Executor With Overrides (roles/run.jobsExecutorWithOverrides) IAM 角色。如需了解详情,请参阅替换特定执行的作业配置。
请求格式无效
定义消息绑定时,您必须使用 http_endpoint_message_binding_template 键将事件转换为 Cloud Run Admin API 所需的格式,例如:{"body": ""}。
如果键缺失或为空,路由到作业的事件消息将不符合 Cloud Run 作业端点的预期架构,这会阻止事件消息成功触发作业执行。
转换问题
如果在指定消息绑定时,您的事件数据无法按预期进行转换,请确保 CEL 表达式的语法正确无误。
CEL 表达式不正确
例如,在以下表达式中,带引号的字符串替换(例如 \"${message.data}\")用于在应使用 CEL 扩展函数时评估和插入变量值:
cel_expression: "{\"body\":{\"overrides\":{\"containerOverrides\":[{\"env\":[{\"name\":\"CLOUD_EVENT_PAYLOAD\",\"value\":\"${message.data}\"},{\"name\":\"CLOUD_EVENT_ATTRIBUTES\",\"value\":\"${message.attributes}\"}]}]}}}"
此外,事件属性是消息对象中的顶级字段,不包含在单独的属性字段(例如 message.attributes)中。应使用 message.key 值访问传入 CloudEvents 消息的每个属性,其中 key 是属性的名称。
正确的 CEL 表达式
如需解决这些问题,请将 toJsonString() 函数直接附加到对象,以将消息数据作为 JSON 字符串传递。如需捕获事件属性(以 JSON 字符串形式),同时排除载荷,请使用 message.removeFields(["data"]).toJsonString()。例如:
cel_expression: "{\"body\":{\"overrides\":{\"containerOverrides\":[{\"env\":[{\"name\":\"CLOUD_EVENT_PAYLOAD\",\"value\":\"message.data.toJsonString()\"},{\"name\":\"CLOUD_EVENT_ATTRIBUTES\",\"value\":\"message.removeFields(['data']).toJsonString()\"}]}]}}}"
如需了解详情,请参阅转换已接收事件。