排解問題

本頁說明如何解決使用 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 金鑰不存在,或是身分與存取權管理 (IAM) 權限未正確設定。

解決方法:

如要解決透過 Cloud External Key Manager (Cloud EKM) 使用外部代管金鑰時可能遇到的問題,請參閱 Cloud EKM 錯誤參考資料。

HTTP 400 Bad Request 錯誤

如果管道發生一般 HTTP 400 Bad Request 錯誤,通常表示轉換或訊息繫結有問題,或是目標端點發生問題。請務必完成以下事項:

  • 檢查 CEL 運算式是否有語法或邏輯錯誤。舉例來說,請參閱本文的「轉換問題」一節。
  • 確認事件訊息符合預期結構定義。舉例來說,請參閱本文中的「要求格式無效」。
  • 如果事件目的地本身會傳回錯誤,請檢查目標端點。

HTTP 503 Service Unavailable 錯誤

如果管道將訊息傳送至 Google 目的地時,使用 DNS 位址 (例如 Cloud Run),並發生 HTTP 503 Service Unavailable 錯誤,請確認網路連結使用的子網路已啟用 Private Google Access,否則系統無法解析 DNS 位址。

使用 Eventarc 服務代理時權限遭拒

嘗試建立 Eventarc Advanced 資源時,如果遇到下列錯誤,請稍候幾分鐘 (可能需要七分鐘),然後再試一次:

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) 權限。

如果再次嘗試建立資源後,仍發生先前的錯誤,請完成下列步驟,確認 Eventarc 服務代理程式存在於 Google Cloud 專案中,且具備必要角色:

  1. 前往 Google Cloud 控制台的「IAM」頁面。

    前往「身分與存取權管理」頁面

  2. 在「按照主體查看」分頁標籤中,選取「包含 Google 提供的角色授予項目」核取方塊。
  3. 在主體清單中,找出 Eventarc 服務代理程式,格式如下:

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

  4. 確認服務代理程式是否具備「Eventarc 服務代理程式」角色。如果服務代理沒有該角色,請授予角色。

發布至 Cloud Run 作業的問題

本節說明如何解決將事件發布至 Cloud Run 作業時可能遇到的問題。如需端對端示範,請參閱快速入門導覽課程。

HTTP 403 Forbidden 錯誤

如果您嘗試執行會覆寫工作設定的 Cloud Run 工作 (例如定義訊息繫結),但遇到 HTTP 403 Forbidden 錯誤,請確認您已將「Cloud Run 開發人員」(roles/run.developer) 或「Cloud Run Jobs Executor With Overrides」(roles/run.jobsExecutorWithOverrides) IAM 角色授予 Eventarc 管道使用的 OAuth 服務帳戶。詳情請參閱「為特定執行作業覆寫工作設定」。

要求格式無效

定義訊息繫結時,您必須使用 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()\"}]}]}}}"

詳情請參閱「轉換收到的事件」。

後續步驟