バスと登録を作成してイベントをパブリッシュし、受信する(gcloud CLI)
このクイックスタートでは、 Google Cloudプロジェクトで Eventarc Advanced バスを作成して登録し、イベント メッセージをパブリッシュして受信する方法について説明します。
バスは中央ルーターとして機能し、イベントソースからメッセージを受信するか、プロバイダによって公開されたメッセージを受信します。
登録は、バスで受信したメッセージを処理パイプラインを介して 1 つ以上の宛先にルーティングします。
このクイックスタートでは、以下の操作を行います。
Artifact Registry 標準リポジトリを作成します。
イベント レシーバ サービスを Cloud Run にデプロイする。
Eventarc Advanced バスを作成します。
Eventarc Advanced 登録を作成します。
イベント メッセージをバスにパブリッシュします。
Cloud Run のログでイベントデータを確認します。
このクイックスタートでは gcloud CLI を使用します。 Google Cloud コンソールを使用して手順を完了するには、バスと登録を作成してイベントを公開および受信する(コンソール)をご覧ください。
始める前に
組織で定義されているセキュリティの制約により、次の手順を完了できない場合があります。トラブルシューティング情報については、制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。
- Google Cloud アカウントにログインします。 Google Cloudを初めて使用する場合は、 アカウントを作成して、実際のシナリオで Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分も差し上げます。
-
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず フェデレーション ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init -
Google Cloud プロジェクトを作成または選択します。
プロジェクトの選択または作成に必要なロール
- プロジェクトを選択する: プロジェクトの選択に特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトであれば、どのプロジェクトでも選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、
resourcemanager.projects.create権限を含むプロジェクト作成者ロール(roles/resourcemanager.projectCreator)が必要です。詳しくは、ロールを付与する方法をご覧ください。
-
Google Cloud プロジェクトを作成します。
gcloud projects create PROJECT_ID
PROJECT_IDは、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_IDは、 Google Cloud プロジェクトの名前に置き換えます。
Artifact Registry、Cloud Build、Cloud Run、Compute Engine、Eventarc の各 API を有効にします(有効になっていない場合)。
API を有効にするために必要なロール
API を有効にするには、
serviceusage.services.enable権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を通じてこの権限がすでに付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を通じてこの権限を取得できます。ロールを付与する方法を確認する。gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com compute.googleapis.com eventarc.googleapis.com eventarcpublishing.googleapis.com run.googleapis.com -
Google Cloud CLI をインストールします。
-
外部 ID プロバイダ(IdP)を使用している場合は、まず フェデレーション ID を使用して gcloud CLI にログインする必要があります。
-
gcloud CLI を初期化するには、次のコマンドを実行します。
gcloud init -
Google Cloud プロジェクトを作成または選択します。
プロジェクトの選択または作成に必要なロール
- プロジェクトを選択する: プロジェクトの選択に特定の IAM ロールは必要ありません。ロールが付与されているプロジェクトであれば、どのプロジェクトでも選択できます。
-
プロジェクトを作成する: プロジェクトを作成するには、
resourcemanager.projects.create権限を含むプロジェクト作成者ロール(roles/resourcemanager.projectCreator)が必要です。詳しくは、ロールを付与する方法をご覧ください。
-
Google Cloud プロジェクトを作成します。
gcloud projects create PROJECT_ID
PROJECT_IDは、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_IDは、 Google Cloud プロジェクトの名前に置き換えます。
Artifact Registry、Cloud Build、Cloud Run、Compute Engine、Eventarc の各 API を有効にします(有効になっていない場合)。
API を有効にするために必要なロール
API を有効にするには、
serviceusage.services.enable権限が必要です。プロジェクトを作成した場合は、オーナーロール(roles/owner)を通じてこの権限がすでに付与されている可能性があります。それ以外の場合は、Service Usage 管理者ロール(roles/serviceusage.serviceUsageAdmin)を通じてこの権限を取得できます。ロールを付与する方法を確認する。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 編集者 (
- テスト用にサービス アカウントを作成し、このクイックスタートを完了するために必要なロールを付与します。
- サービス アカウントを作成します。
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
SERVICE_ACCOUNT_NAMEをサービス アカウントの名前に置き換えます。 - コンテナ イメージのビルドとデプロイ、Eventarc Advanced パイプラインの ID の表現に必要なロールを付与します。
- Artifact Registry 書き込み: Artifact Registry アーティファクトをアップロードする
- ログ書き込み: Cloud Logging にログを書き込みます
- ストレージ管理者: Cloud Storage オブジェクトにアクセスする
- Cloud Run 起動元: Cloud Run を呼び出す
gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" \ --role=roles/artifactregistry.writer gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" \ --role=roles/logging.logWriter gcloud projects add-iam-policy-binding PROJECT_ID \ --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" \ --role=roles/storage.admin 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 のアクセス制御をご覧ください。
- サービス アカウントを作成します。
Artifact Registry 標準リポジトリを作成する
コンテナ イメージを保存する Artifact Registry 標準リポジトリを作成します。
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=$REGION
REPOSITORY は、Artifact Registry リポジトリの一意の名前に置き換えます(例: my-repo)。
イベント レシーバ サービスを Cloud Run にデプロイする
イベントの内容をログに記録する Cloud Run サービスをデプロイします。Pub/Sub トピック、Workflows、HTTP エンドポイントなど、他のイベント宛先もサポートされています。詳細については、イベント プロバイダと宛先をご覧ください。
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 \ --service-account=projects/PROJECT_ID/serviceAccounts/SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --default-buckets-behavior=regional-user-owned-bucket
コンテナ イメージを Cloud Run にデプロイします。
gcloud run deploy SERVICE_NAME \ --image $REGION-docker.pkg.dev/PROJECT_ID/REPOSITORY/log-events:v1 \ --platform managed \ --ingress all \ --no-allow-unauthenticated \ --region=$REGION
SERVICE_NAMEは、サービスの名前(my-serviceなど)に置き換えます。allの Ingress 設定では、インターネットからrun.appURL に直接送信されるリクエストを含むすべてのリクエストが許可されます。詳細については、Cloud Run のネットワーク上り(内向き)を制限するをご覧ください。--no-allow-unauthenticatedフラグは、認証された呼び出しのみを許可するようにサービスを構成します。
Cloud Run サービスの URL が表示されたら、デプロイは完了しています。後のステップで使用できるように、この URL をメモします。
Eventarc Advanced バスを作成する
バスは、メッセージ ソースからイベント メッセージを受信するか、プロバイダによって公開されたイベント メッセージを受信し、メッセージ ルーターとして機能します。
詳細については、メッセージをルーティングするバスを作成するをご覧ください。
gcloud eventarc message-buses create コマンドを使用して、プロジェクトに Eventarc Advanced バスを作成します。
gcloud eventarc message-buses create BUS_NAME \ --location=$REGION
BUS_NAME は、バスの ID または完全修飾 ID に置き換えます(例: my-bus)。
Eventarc Advanced の登録を作成する
登録では、宛先にルーティングされるメッセージを決定し、イベント メッセージの宛先を構成するために使用されるパイプラインも指定します。
詳細については、イベントを受信する登録を作成するをご覧ください。
gcloud CLI を使用する場合は、まずパイプラインを作成してから登録を作成します。
gcloud eventarc pipelines createコマンドを使用してパイプラインを作成します。gcloud eventarc pipelines create PIPELINE_NAME \ --destinations=http_endpoint_uri='CLOUD_RUN_SERVICE_URL',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 eventarc enrollments createコマンドを使用して登録を作成します。gcloud 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 eventarc message-buses publish コマンドを使用するか、Eventarc Publishing REST API にリクエストを送信します。詳細については、イベントを直接パブリッシュするをご覧ください。
メッセージは、イベントデータを一般的な方法で記述するための仕様である CloudEvents 形式である必要があります。data 要素は、イベントのペイロードです。このフィールドには、整形式の JSON を入力できます。CloudEvents コンテキスト属性の詳細については、イベント形式をご覧ください。
次の例は、Eventarc Advanced バスにイベントを直接パブリッシュする例です。
例 1
gcloud CLI と --event-data フラグなどのイベント属性フラグを使用して、イベントをバスにパブリッシュできます。
gcloud 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 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 プロジェクトを削除すると、そのプロジェクト内で使用されているすべてのリソースに対する課金が停止します。
Google Cloud プロジェクトを削除する:
gcloud projects delete PROJECT_ID