問題のトラブルシューティング

このページでは、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 が使用されるように、次の 2 つの組織のポリシーの制約と統合されています。既存の 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 エラー

DNS アドレス(Cloud Run など)を使用してメッセージを Google の宛先に転送するパイプラインで HTTP 503 Service Unavailable エラーが発生した場合は、ネットワーク アタッチメントで使用されるサブネットでプライベート 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 サービスの ID として機能します。詳細については、サービス エージェントで、Eventarc サービス エージェントのロールroles/eventarc.serviceAgent)の Identity and Access Management(IAM)権限をご覧ください。

リソースの作成を再度試行しても、前のエラーが引き続き発生する場合は、次の手順に沿って、Eventarc サービス エージェントが Google Cloud プロジェクトに存在し、必要なロールが付与されていることを確認します。

  1. Google Cloud コンソールで、[IAM] ページに移動します。

    [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 エラーが発生した場合は、Eventarc パイプラインで使用される OAuth サービス アカウントに Cloud Run デベロッパーroles/run.developer)または Cloud Run ジョブのオーバーライド付き実行者roles/run.jobsExecutorWithOverrides)の IAM ロールが付与されていることを確認してください。詳細については、特定の実行のジョブ構成をオーバーライドするをご覧ください。

リクエスト形式が無効です

メッセージ バインディングを定義するときは、http_endpoint_message_binding_template キーを使用して、Cloud Run Admin API で想定される形式({"body": ""} など)にイベントを変換する必要があります。

キーがない場合や空の場合、ジョブに転送されるイベント メッセージは Cloud Run ジョブ エンドポイントの想定されるスキーマに準拠しないため、イベント メッセージがジョブの実行を正常にトリガーできません。

変換に関する問題

メッセージ バインディングを指定したときにイベントデータが期待どおりに変換されない場合は、CEL 式の構文が正しいことを確認してください。

CEL 式が正しくない

たとえば、次の式では、CEL 拡張関数を使用する必要がある場合に、引用符付きの文字列置換(\"${message.data}\" など)を使用して変数の値を評価して挿入します。

cel_expression: "{\"body\":{\"overrides\":{\"containerOverrides\":[{\"env\":[{\"name\":\"CLOUD_EVENT_PAYLOAD\",\"value\":\"${message.data}\"},{\"name\":\"CLOUD_EVENT_ATTRIBUTES\",\"value\":\"${message.attributes}\"}]}]}}}"

また、イベント属性はメッセージ オブジェクトの最上位フィールドであり、message.attributes などの個別の属性フィールドには含まれていません。受信した CloudEvents メッセージの各属性には、message.key 値を使用してアクセスする必要があります。ここで、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()\"}]}]}}}"

詳細については、受信したイベントを変換するをご覧ください。

次のステップ