排查问题

本页面介绍如何解决在使用 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 资源停用。与资源关联的活动或消息不再受到保护。

解决方案

  1. 显示用于资源的密钥:
  2. 重新启用 Cloud KMS 密钥
超出配额 Quota exceeded for limit

您已达到 Cloud KMS 请求的配额上限。

解决方案

  • 限制 Cloud KMS 调用的数量。
  • 增加配额。
如需了解详情,请参阅监控和调整 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 资源都不受在资源创建后设置的政策约束;不过,更新资源可能会失败。

  • constraints/gcp.restrictNonCmekServices 会导致没有指定 Cloud KMS 密钥的所有资源创建请求失败。

    解决方案

    为 Eventarc 资源指定 Cloud KMS 密钥。如需了解详情,请参阅要求为新的 Eventarc 资源使用 CMEK

  • constraints/gcp.restrictCmekCryptoKeyProjects 限制了可用于保护 Eventarc 资源的 Cloud KMS 密钥。

    解决方案

    使用允许的 Eventarc 项目、文件夹或组织中的受支持 Cloud KMS 密钥。如需了解详情,请参阅为 Eventarc 项目限制 Cloud KMS 密钥

活动递送期间出现的问题

CMEK 问题 错误消息 说明
已停用的密钥 $KEY is not enabled, current state is: DISABLED

提供的 Cloud KMS 密钥已针对 Eventarc 资源停用。与资源关联的活动或消息不再受到保护。

解决方案

  1. 显示用于资源的密钥:
  2. 重新启用 Cloud KMS 密钥
超出配额 Quota exceeded for limit

您已达到 Cloud KMS 请求的配额上限。

解决方案

  • 限制 Cloud KMS 调用的数量。
  • 增加配额。
如需了解详情,请参阅监控和调整 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 错误,通常表示存在转换或消息绑定问题,或者与目标端点相关的问题。请务必执行以下操作:

  • 检查 CEL 表达式中是否存在语法或逻辑错误。例如,请参阅本文档中的转换问题
  • 验证事件消息是否符合预期架构。例如,请参阅本文档中的请求格式无效
  • 如果事件目标本身返回错误,请检查目标端点。

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 服务代理以及该代理是否具有必要的角色:

  1. 在 Google Cloud 控制台中,前往 IAM 页面。

    转到 IAM

  2. 按主账号查看标签页中,选中包括 Google 提供的角色授权复选框。
  3. 在主账号列表中,找到 Eventarc 服务代理,它们使用以下格式:

    service-PROJECT_NUMBER@gcp-sa-eventarc.iam.gserviceaccount.com

  4. 验证服务代理是否具有 Eventarc Service Agent 角色。如果服务代理没有该角色,请授予该角色

发布到 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()\"}]}]}}}"

如需了解详情,请参阅转换已接收事件

后续步骤