本頁說明如何解決使用 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 金鑰不存在,或是身分與存取權管理 (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 專案中,且具備必要角色:
- 前往 Google Cloud 控制台的「IAM」頁面。
- 在「按照主體查看」分頁中,選取「包含 Google 提供的角色授予項目」核取方塊。
在主體清單中,找出 Eventarc 服務代理程式,格式如下:
service-PROJECT_NUMBER@gcp-sa-eventarc.iam.gserviceaccount.com- 確認服務代理程式是否具備「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()\"}]}]}}}"
詳情請參閱「轉換收到的事件」。