排解問題

本頁說明如何解決使用 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 錯誤

如果管道將訊息傳送至使用 DNS 位址的 Google 目的地 (例如 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()\"}]}]}}}"

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

後續步驟