Eventarc のロケーションについて

イベントソース、イベント ターゲット、Eventarc トリガーにはそれぞれ独自のロケーションがあります。これらのロケーションが一致しなければならない場合と、そうでない場合があります。詳細については、Eventarc のロケーションをご覧ください。

ソースの場所

多くの場合、イベントソースのロケーションによってトリガーのロケーションが決まります。次の例では、Cloud Storage バケットが europe-west1 リージョンにあるため、トリガーも europe-west1 に配置する必要があります。

gcloud eventarc triggers create trigger-storage \
    --destination-run-service=hello \
    --destination-run-region=us-central1 \
    --location=europe-west1 \
    --event-filters="type=google.cloud.storage.object.v1.finalized" \
    --event-filters="bucket=my-bucket-in-europe-west1-region" \
    --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com

ターゲットのロケーション

イベント ターゲット(Cloud Run サービスなど)をデプロイするときに、サポートされているリージョンをロケーションとして選択します。通常、レイテンシやデータの局所性の理由から、イベントソースと同じリージョンに配置するのが適切です。ただし、これは必須ではありません。上記の例では、イベントソースが europe-west1 にあり、--destination-run-region フラグでイベント ターゲットのロケーションが us-central1 に指定されています。

トリガーのロケーション

また、作成する Eventarc トリガーのタイプは、‑‑location フラグで指定されたトリガーのロケーションに影響します。

Cloud Audit Logs

Cloud Audit Logs のトリガーを使用すると、監査ログを出力するイベントソースをイベント ターゲットに接続できます。Cloud Audit Logs トリガーは単一リージョンのロケーションで使用できます。グローバル Eventarc トリガーを作成することもできますが、デュアルリージョンとマルチリージョンのロケーションでトリガーはサポートされません。

イベントソースのロケーションによってトリガーのロケーションが決まります。通常、これは単一リージョンのロケーションです。たとえば、監査ログのトリガーを使用して、europe-west1 リージョンのバケットから Cloud Storage イベントをキャプチャするには、同じロケーションにトリガーを作成します。

gcloud eventarc triggers create trigger-auditlog \
    --destination-run-service=hello \
    --destination-run-region=us-central1 \
    --location=europe-west1 \
    --event-filters="type=google.cloud.audit.log.v1.written" \
    --event-filters="serviceName=storage.googleapis.com" \
    --event-filters="methodName=storage.objects.create" \
    --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com

Cloud Audit Logs トリガーを使用している場合はバケットでフィルタリングされないため、europe-west1 リージョン内のすべてのバケットと一致します(バケットでフィルタリングするには、代わりに Cloud Storage トリガーを直接使用します)。

また、eu などのデュアルリージョンまたはマルチリージョン バケットと一致するには、global のロケーションを指定してトリガーを作成します。これにより、イベント フィルタが一致するすべてのリージョンのすべてのバケットと一致します。

gcloud eventarc triggers create trigger-storage \
    --destination-run-service=hello \
    --destination-run-region=us-central1 \
    --location=global \
    --event-filters="type=google.cloud.storage.object.v1.finalized" \
    --event-filters="bucket=my-bucket-in-europe-west1-region" \
    --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com

Cloud Storage

Cloud Storage トリガーは、オブジェクトの作成、削除、アーカイブ、メタデータ更新など、Cloud Storage バケット内のイベントに応答します。Cloud Storage トリガーは、シングルリージョン、デュアルリージョン、マルチリージョンのロケーションで使用できますが、グローバル Eventarc トリガーは作成できません。

Cloud Storage バケットのロケーションによって、Eventarc トリガーのロケーションが決まります。これらは必ず一致している必要があります。次の例では、トリガーのロケーションは Cloud Storage バケット(eu マルチリージョン ロケーション)と一致します。

gcloud eventarc triggers create trigger-storage \
    --destination-run-service=hello \
    --destination-run-region=us-central1 \
    --location=eu \
    --event-filters="type=google.cloud.storage.object.v1.finalized" \
    --event-filters="bucket=my-bucket-in-eu-multi-region" \
    --service-account=$PROJECT_NUMBER-compute@developer.gserviceaccount.com

バケットとトリガーのリージョンが一致しない場合、次のようなエラーが表示されます。

ERROR: (gcloud.eventarc.triggers.create) INVALID_ARGUMENT: The request was
invalid: Bucket "my-bucket-in-eu-multi-region" location "eu" does not match
trigger location "europe-west1". Try again by creating the trigger in "eu".

Pub/Sub

Pub/Sub トリガーは、Pub/Sub トピックをイベント ターゲットに接続します。Pub/Sub トリガーは単一リージョンのロケーションでのみ使用できます。グローバル Eventarc トリガーを作成することはできません。

Pub/Sub トピックはグローバルであり、単一リージョンに関連付けられていませんが、Pub/Sub トリガーを作成するときに、--location フラグを使用してリージョンを指定する必要があります。

gcloud eventarc triggers create trigger-pubsub \
    --destination-run-service=hello \
    --destination-run-region=us-central1 \
    --location=us-central1 \
    --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
    --transport-topic=projects/your-projectid/topics/your-topic

Eventarc は、Pub/Sub イベントが指定のロケーションでのみ保持されるようにジオフェンスを構成します。また、リージョンの Pub/Sub サービス エンドポイントを使用してトピックに公開することで、すべてのデータが単一リージョン内にとどまるようにすることもできます。

マルチリージョンのデプロイとメッセージの重複

Pub/Sub トピックの Eventarc トリガーを作成すると、Eventarc はその特定のトリガーに対して一意の基盤となる Pub/Sub サブスクリプションを自動的に作成します。これにより、Eventarc はサブスクリプションのライフサイクル、権限、データ所在地コンプライアンスを管理できます。

同じグローバル Pub/Sub トピックを指す同じトリガーを複数のリージョンにデプロイすると、各トリガーは個別のサブスクライバーとして機能します。Pub/Sub はすべての有効なサブスクリプションにメッセージを配信するため(ファンアウト)、すべてのリージョンのサービスが同じメッセージを受信して処理し、重複が発生します。

メッセージの重複なしでマルチリージョン デプロイを実現するには、イベントの取り込みをリージョン処理から切り離します。単一のリージョンに単一の Eventarc トリガーを作成し、グローバル外部アプリケーション ロードバランサを指すようにトリガーを構成します。次に、リージョン バックエンド(複数のリージョンの Cloud Run サービスなど)にトラフィックを転送するようにロードバランサを構成します。

このアプローチにより、メッセージはロードバランサに 1 回だけ配信され、ロードバランサはイベントをリージョン間で分散します。トリガーはジオフェンシングを満たすためにリージョンに残りますが、ターゲットはグローバルなリーチを提供します。

アーキテクチャに関係なく、Eventarc は at-least-once(1 回以上)のイベント配信を行うため、イベント ハンドラが重複を処理できるように、イベント ハンドラがべき等であることを確認してください。

次のステップ

  • Google Cloud プロジェクト間でイベントをルーティングする方法については、チュートリアルをご覧ください。