バスと登録を作成してイベントを公開、受信する
このクイックスタートでは、Eventarc アドバンスト バスを作成し、Google Cloud プロジェクトに登録して、イベント メッセージをパブリッシュして受信する方法について説明します。
バスを使用すると、システム内のメッセージのフローを集中管理し、ルータとして機能できます。メッセージ ソースから、またはプロバイダによって公開されたイベントを受信し、登録に従って評価します。
登録は、特定のバスへのサブスクリプションを識別し、メッセージの一致条件を定義して、それに応じて 1 つ以上の宛先にルーティングします。
このクイックスタートでは、以下の操作を行います。
サブネットを作成し、限定公開の Google アクセスを有効にします。
ネットワーク アタッチメントを作成する。
イベント レシーバ サービスを Cloud Run にデプロイする。
Eventarc Advanced バスを作成する。
Eventarc の Advanced 登録を作成する。
イベント メッセージをバスにパブリッシュします。
Cloud Run のログでイベントデータを確認します。
このクイックスタートでは Google Cloud CLI を使用します。
始める前に
組織で定義されているセキュリティの制約により、次の手順を完了できない場合があります。トラブルシューティング情報については、制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, Compute Engine, and Eventarc APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com compute.googleapis.com eventarc.googleapis.com eventarcpublishing.googleapis.com run.googleapis.com - Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, Compute Engine, and Eventarc APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com compute.googleapis.com eventarc.googleapis.com eventarcpublishing.googleapis.com run.googleapis.com gcloud
コンポーネントを更新します。gcloud components update
- アカウントを使用してログインします。
gcloud auth login
- このクイックスタートで使用する構成変数を設定します。
REGION=REGION
REGION
は、バスのサポートされているロケーションに置き換えます。 -
プロジェクト作成者には、オーナーロール(
roles/owner
)が付与されます。デフォルトでは、この Identity and Access Management(IAM)ロールには、ほとんどの Google Cloud リソースへの完全アクセス権に必要な権限が含まれており、この手順は省略できます。プロジェクト作成者でない場合は、プロジェクトで適切なプリンシパルに必要な権限を付与する必要があります。プリンシパルは Google アカウント(エンドユーザーの場合)やサービス アカウント(アプリケーションとコンピューティング ワークロードの場合)になることもあります。
デフォルトでは、Cloud Build の権限には、Artifact Registry アーティファクトをアップロードおよびダウンロードするための権限が含まれています。
必要な権限
このクイックスタートを完了するために必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。
-
Cloud Build 編集者(
roles/cloudbuild.builds.editor
) -
Cloud Run 管理者(
roles/run.admin
) -
Eventarc デベロッパー (
roles/eventarc.developer
) -
Eventarc メッセージバス管理者 (
roles/eventarc.messageBusAdmin
) -
ログ表示アクセス者(
roles/logging.viewAccessor
) -
プロジェクト IAM 管理者(
roles/resourcemanager.projectIamAdmin
) - サービス アカウント管理者(
roles/iam.serviceAccountAdmin
) -
サービス アカウント ユーザー(
roles/iam.serviceAccountUser
) - Service Usage 管理者(
roles/serviceusage.serviceUsageAdmin
)
ロールの付与については、プロジェクト、フォルダ、組織へのアクセスを管理するをご覧ください。
-
Cloud Build 編集者(
- プロジェクトに対する次のロールを Compute Engine のデフォルト サービス アカウントに付与します。コンテナ イメージのビルドとデプロイには、次のロールが必要です。
- Artifact Registry Writer: Artifact Registry アーティファクトをアップロードする
- ログ書き込み: Cloud Logging にログを書き込みます。
- Storage オブジェクト ユーザー: Cloud Storage オブジェクトにアクセスします。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/artifactregistry.writer gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/logging.logWriter gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/storage.objectUser
PROJECT_NUMBER
は、実際の Google Cloud プロジェクトの番号に置き換えます。プロジェクト番号は、Google Cloud コンソールの [ようこそ] ページで確認できます。また、次のコマンドで確認することもできます。gcloud projects describe PROJECT_ID --format='value(projectNumber)'
- デフォルトでは、Cloud Run サービスを呼び出すことができるのは、プロジェクト オーナー、プロジェクト編集者、Cloud Run 管理者、起動元のみです。認証を設定するには、Google Cloud プロジェクトの Cloud Run 起動元ロール(
run.invoker
)をサービス アカウントに付与します。- サービス アカウントを作成します。テスト目的で、このサービス アカウントを Eventarc Advanced パイプラインに関連付けて、パイプラインの ID を示すようにします。
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
SERVICE_ACCOUNT_NAME
は、サービス アカウントの名前に置き換えます。 - サービス アカウントに
roles/run.invoker
IAM ロールを付与します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" \ --role=roles/run.invoker
Cloud Run サービスにアクセスできるユーザーは、次のいずれかの方法で構成できます。
- サービス アカウントまたはグループを選択して、サービスへのアクセスを許可する権限を付与します。すべてのリクエストには、いずれかの承認済みサービス アカウント用に Google によって署名された OpenID Connect トークンを含む HTTP 認証ヘッダーが必要です。このクイックスタートでは、アクセスがこのように構成されます。
- 認証されていないアクセスを許可するには、
allUsers
に権限を付与します。
詳細については、Cloud Run のアクセス制御をご覧ください。
- サービス アカウントを作成します。テスト目的で、このサービス アカウントを Eventarc Advanced パイプラインに関連付けて、パイプラインの ID を示すようにします。
サブネットを作成し、限定公開の Google アクセスを有効にする
禁止する組織のポリシーを作成しない限り、新しい Google Cloud プロジェクトは、各リージョンに 1 つのサブネットワーク(サブネット)を持つデフォルトの Virtual Private Cloud(VPC)ネットワーク(自動モードの VPC ネットワーク)が設定された状態で開始されます。サブネットには IP アドレス範囲が関連付けられています。
DNS アドレスを使用して Cloud Run の宛先にメッセージを転送するため、ネットワーク アタッチメントで使用されるサブネットで限定公開の Google アクセスを有効にする必要があります。そうしないと、DNS アドレスを解決できません。プライベート ネットワーキングと Cloud Run の詳細については、VPC ネットワークからリクエストを受信するをご覧ください。
プロジェクトのデフォルト ネットワークにサブネットを作成し、--enable-private-ip-google-access
フラグを使用して限定公開の Google アクセスを有効にします。
gcloud compute networks subnets create SUBNET_NAME \
--network=default \
--range=10.8.0.0/24 \
--region=$REGION \
--enable-private-ip-google-access
SUBNET_NAME
は、サブネットの名前に置き換えます(例: my-subnet
)。
サブネットの IP 範囲は一意である必要があり、VPC ネットワークやピアリングした VPC ネットワーク内で重複してはいけません。サブネットの種類と有効なサブネット範囲の詳細については、サブネットをご覧ください。
ネットワーク アタッチメントを作成する
ネットワーク アタッチメントは、プロデューサー VPC ネットワークがコンシューマー VPC ネットワークへの接続を開始できるようにするリソースです。イベントを公開するために、Eventarc Advanced はネットワーク アタッチメントを使用して、VPC ネットワークでホストされているエンドポイントとの接続を確立します。
イベントの宛先エンドポイントを含むネットワークとリージョンにネットワーク アタッチメントを作成します。このネットワーク アタッチメントは、ネットワーク アタッチメントを参照する Private Service Connect インターフェースからの接続を自動的に受け入れます。
gcloud compute network-attachments create ATTACHMENT_NAME \
--region=$REGION \
--connection-preference=ACCEPT_AUTOMATIC \
--subnets=SUBNET_NAME
ATTACHMENT_NAME
は、ネットワーク アタッチメントの名前に置き換えます(例: my-network-attachment
)。
Artifact Registry 標準リポジトリを作成する
コンテナ イメージを保存する Artifact Registry 標準リポジトリを作成します。
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=$REGION
REPOSITORY
は、Artifact Registry リポジトリの一意の名前(my-repo
など)に置き換えます。
イベント レシーバー サービスを Cloud Run にデプロイする
イベントの内容をログに記録する Cloud Run サービスをデプロイします。このサービスには、同じプロジェクト内の VPC ネットワークからのみアクセスできます。サービスは認証された呼び出しのみを許可するため、サービス URL に直接アクセスすることはできません。
GitHub リポジトリのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/eventarc-samples.git
Cloud Run のサンプルコードが含まれているディレクトリに移動します。
cd eventarc-samples/eventarc-advanced-quickstart/
Docker コンテナ イメージをビルドし、イメージをリポジトリに push します。
gcloud builds submit \ --tag $REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/log-events:v1
コンテナ イメージを Cloud Run にデプロイします。
gcloud run deploy SERVICE_NAME \ --image $REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/log-events:v1 \ --platform managed \ --ingress internal \ --no-allow-unauthenticated \ --region=$REGION
SERVICE_NAME
は、サービスの名前に置き換えます(例:my-service
)。
Cloud Run サービスの URL が表示されたら、デプロイは完了しています。後のステップで使用できるように、この URL をメモします。
Eventarc Advanced バスを作成する
gcloud beta eventarc message-buses create
コマンドを使用して、プロジェクトに Eventarc Advanced バスを作成します。
gcloud beta eventarc message-buses create BUS_NAME \ --location=$REGION
BUS_NAME
は、バスの ID または完全修飾 ID に置き換えます(例: my-bus
)。
詳細については、メッセージを転送するバスを作成するをご覧ください。
Eventarc Advanced の登録を作成する
登録により、宛先に転送されるメッセージが決まります。また、メッセージが転送されるパイプラインも指定します。このパイプラインは、イベント メッセージの宛先を構成するために使用されます。
詳細については、イベントを受信する登録を作成するをご覧ください。
gcloud CLI を使用する場合は、まずパイプラインを作成してから、登録を作成します。
gcloud beta eventarc pipelines create
コマンドを使用してパイプラインを作成します。gcloud beta eventarc pipelines create PIPELINE_NAME \ --destinations=http_endpoint_uri='CLOUD_RUN_SERVICE_URL',network_attachment=ATTACHMENT_NAME,google_oidc_authentication_service_account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --location=$REGION
次のように置き換えます。
PIPELINE_NAME
: パイプラインの ID または完全修飾名。CLOUD_RUN_SERVICE_URL
: Cloud Run サービスの完全修飾 URL(例:https://SERVICE_NAME-abcdef-uc.a.run.app
)。これは、イベント メッセージの宛先です。
google_oidc_authentication_service_account
キーには、OIDC トークンの生成に使用されるサービス アカウントのメールアドレスを指定します。gcloud beta eventarc enrollments create
コマンドを使用して登録を作成します。gcloud beta eventarc enrollments create ENROLLMENT_NAME \ --cel-match=MATCH_EXPRESSION \ --destination-pipeline=PIPELINE_NAME \ --message-bus=BUS_NAME \ --message-bus-project=PROJECT_ID \ --location=$REGION
次のように置き換えます。
ENROLLMENT_NAME
: 登録の ID または完全修飾名。MATCH_EXPRESSION
: CEL を使用したこの登録のマッチング式(例:"message.type == 'hello-world-type'"
)。
イベント メッセージをバスにパブリッシュする
メッセージをバスに直接パブリッシュするには、gcloud beta eventarc message-buses publish
コマンドを使用するか、Eventarc Publishing REST API にリクエストを送信します。詳細については、イベントを直接公開するをご覧ください。
メッセージは、イベントデータを一般的な方法で記述するための仕様である CloudEvents 形式である必要があります。data
要素はイベントのペイロードです。このフィールドには、適切に形式が整えられた JSON を指定できます。CloudEvents コンテキスト属性の詳細については、イベント形式をご覧ください。
以下は、Eventarc Advanced バスにイベントを直接パブリッシュする例です。
例 1
イベントをバスにパブリッシュするには、gcloud CLI と --event-data
などのイベント属性フラグを使用します。
gcloud beta eventarc message-buses publish BUS_NAME \
--event-data='{"key": "hello-world-data"}' \
--event-id=hello-world-id-1234 \
--event-source=hello-world-source \
--event-type=hello-world-type \
--event-attributes="datacontenttype=application/json" \
--location=$REGION
例 2
gcloud CLI と --json-message
フラグを使用して、イベントを JSON メッセージとしてバスにパブリッシュできます。
gcloud beta eventarc message-buses publish BUS_NAME \
--location=$REGION \
--json-message='{"id": "hello-world-id-1234", "type":
"hello-world-type", "source":
"hello-world-source", "specversion": "1.0", "data":
{"key": "hello-world-data"}}'
イベントを公開すると、[イベントが正常に公開されました] というメッセージが表示されます。
Cloud Run のログでイベントデータを確認する
Eventarc Advanced バスにイベントをパブリッシュしたら、Cloud Run サービスのログを確認して、イベントが想定どおりに受信されたことを確認できます。
gcloud logging read
コマンドを使用して、ログエントリをフィルタして出力を返します。gcloud logging read 'textPayload: "hello-world-data"'
次のようなログエントリを探します。
insertId: 670808e70002b5c6477709ae labels: instanceId: 007989f2a10a4a33c21024f2c8e06a9de65d9b4fdc2ee27697a50379b3fab2f975b9233dc357d50b06270829b9b479d5a1ee54a10fa2cb2d98c5f77a0895e2be0f9e6e4b20 logName: projects/PROJECT_ID/logs/run.googleapis.com%2Fstderr receiveTimestamp: '2024-10-10T17:03:35.424659450Z' resource: labels: ... type: cloud_run_revision textPayload: "[2024-10-21 15:33:19,581] INFO in server: Body: b'{\"value\":\"hello-world-data\"\ }'" timestamp: '2024-10-10T17:03:35.177606Z'
Eventarc Advanced バスと登録を正常に作成し、イベント メッセージをバスにパブリッシュし、イベント レシーバ サービスのログで想定される結果を確認しました。
クリーンアップ
このクイックスタートで説明するタスクが完了したら、作成したリソースを削除すると、それ以上の請求は発生しません。
Eventarc Advanced リソースを削除します。
また、Google Cloud プロジェクトを削除して、料金が発生しないようにすることもできます。Google Cloud プロジェクトを削除すると、そのプロジェクト内で使用されているすべてのリソースに対する課金が停止します。
Delete a Google Cloud project:
gcloud projects delete PROJECT_ID