Eventarc イベントで Cloud Run をトリガーする

1. はじめに

894762ebb681671c.png

Cloud Run を使用すると、フルマネージド環境でステートレス コンテナを実行できます。オープンソースの Knative から構築されており、Cloud Run を使用してフルマネージド型でコンテナを実行するか、Cloud Run for Anthos を使用して Google Kubernetes Engine クラスタ内でコンテナを実行するかを選択できます。

cb762f29e9183a3f.png

Eventarc を使用すると、さまざまなサービス(Cloud Run、Cloud Functions、Workfklows)をさまざまなソースからのイベントに簡単に接続できます。マイクロサービスが疎結合かつ分散されたイベント ドリブン アーキテクチャを構築できます。また、イベントの取り込み、配信、セキュリティ、認可、エラー処理も行うため、デベロッパーのアジリティとアプリケーションの復元力が向上します。

この Codelab では、Eventarc について学びます。具体的には、Eventarc を使用して Pub/Sub、Cloud Storage、Cloud Audit Logs のイベントをリッスンし、Cloud Run サービスに渡します。

学習内容

  • Eventarc のビジョン
  • Eventarc でイベントを検出する
  • Cloud Run シンクを作成する
  • Pub/Sub のトリガーを作成する
  • Cloud Storage のトリガーを作成する
  • Cloud Audit Logs のトリガーを作成する
  • Eventarc UI を探索する

2. Eventarc のビジョン

Eventarc は、さまざまな Google、Google Cloud、サードパーティのイベントソースから Google Cloud イベントの宛先にイベントを配信することを目的としています。

59b147dc030b2b0b.png

Google Cloud のソース

Google Cloud が所有するプロダクトであるイベントソース

Google のソース

Google が所有するサービス(Gmail、ハングアウト、Android の管理など)のイベントソース

カスタムソース

Google が所有するサービスではなく、エンドユーザー自身が作成したイベントソース

サードパーティのソース

Google が所有するイベントソースまたは顧客作成イベントソースではない。これには、サードパーティのプロバイダやパートナーが所有および管理する Check Point CloudGuard、Datadog、ForgeRock、Lacework などの一般的なイベントソースが含まれます。

イベントは、サービス間の相互運用性を確保するために CloudEvents v1.0 形式に正規化されます。CloudEvents はベンダーに依存しないオープン仕様で、イベントデータを一般的な形式で記述し、サービス、プラットフォーム、システム間の相互運用性を実現します。

3. 設定と要件

セルフペース型の環境設定

  1. Google Cloud Console にログインして、プロジェクトを新規作成するか、既存のプロジェクトを再利用します。Gmail アカウントも Google Workspace アカウントもまだお持ちでない場合は、アカウントを作成してください。

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • プロジェクト名は、このプロジェクトの参加者に表示される名称です。Google API では使用されない文字列で、いつでも更新できます。
  • プロジェクト ID は、すべての Google Cloud プロジェクトにおいて一意でなければならず、不変です(設定後は変更できません)。Cloud Console により一意の文字列が自動生成されます(通常は内容を意識する必要はありません)。ほとんどの Codelab では、プロジェクト ID を参照する必要があります(通常、プロジェクト ID は「PROJECT_ID」の形式です)。好みの文字列でない場合は、別のランダムな ID を生成するか、独自の ID を試用して利用可能であるかどうかを確認することができます。プロジェクトの作成後、ID は「フリーズ」されます。
  • 3 つ目の値として、一部の API が使用するプロジェクト番号があります。これら 3 つの値について詳しくは、こちらのドキュメントをご覧ください。
  1. 次に、Cloud のリソースや API を使用するために、Cloud Console で課金を有効にする必要があります。この Codelab の操作をすべて行って、費用が生じたとしても、少額です。このチュートリアルを終了した後に課金が発生しないようにリソースをシャットダウンするには、Codelab の最後にある「クリーンアップ」の手順を行います。Google Cloud の新規ユーザーは、300 米ドル分の無料トライアル プログラムをご利用いただけます。

Cloud Shell の起動

Google Cloud はノートパソコンからリモートで操作できますが、この Codelab では、Google Cloud Shell(Cloud 上で動作するコマンドライン環境)を使用します。

GCP Console で右上のツールバーにある Cloud Shell アイコンをクリックします。

55efc1aaa7a4d3ad.png

プロビジョニングと環境への接続にはそれほど時間はかかりません。完了すると、次のように表示されます。

7ffe5cbb04455448.png

この仮想マシンには、必要な開発ツールがすべて用意されています。永続的なホーム ディレクトリが 5 GB 用意されており、Google Cloud で稼働します。そのため、ネットワークのパフォーマンスと認証機能が大幅に向上しています。このラボでの作業はすべて、ブラウザから実行できます。

始める前に

Cloud Shell で、プロジェクト ID が設定されていることを確認します。

PROJECT_ID=your-project-id
gcloud config set project $PROJECT_ID

4. Cloud Run サービスをデプロイする

イベントを受信する Cloud Run サービスをデプロイする。CloudEvents のコンテンツをログに記録する Cloud Run の Hello コンテナをデプロイします。

まず、Cloud Run に必要なサービスを有効にします。

gcloud services enable run.googleapis.com

hello コンテナを Cloud Run にデプロイします。

REGION=us-central1
SERVICE_NAME=hello

gcloud run deploy $SERVICE_NAME \
  --allow-unauthenticated \
  --image=gcr.io/cloudrun/hello \
  --region=$REGION

成功すると、コマンドラインにサービス URL が表示されます。任意のブラウザ ウィンドウでサービス URL を開くと、サービスがデプロイされたことを再確認できます。

5. イベントの検出

Eventarc でトリガーを作成する前に、イベントソースの概要、イベントソースが出力できるイベントの種類、イベントソースを使用するためのトリガーの構成方法を確認できます。

さまざまな種類のアクティビティのリストを表示するには:

gcloud beta eventarc attributes types list

NAME                                           DESCRIPTION
google.cloud.audit.log.v1.written              Cloud Audit Log written
google.cloud.pubsub.topic.v1.messagePublished  Cloud Pub/Sub message published
google.cloud.storage.object.v1.archived         Cloud Storage: Sent when a live version of an (object versioned) object is archived or deleted.
google.cloud.storage.object.v1.deleted          Cloud Storage: Sent when an object has been permanently deleted.
google.cloud.storage.object.v1.finalized        Cloud Storage: Sent when a new object (or a new generation of an existing object).
google.cloud.storage.object.v1.metadataUpdated  Cloud Storage: Sent when the metadata of an existing object changes.

各イベントタイプの詳細情報を取得するには:

gcloud beta eventarc attributes types describe google.cloud.audit.log.v1.written

attributes: type,serviceName,methodName,resourceName
description: 'Cloud Audit Log: Sent when a log is written.'
name: google.cloud.audit.log.v1.written

特定のイベントタイプを出力するサービスのリストを表示するには:

gcloud beta eventarc attributes service-names list --type=google.cloud.audit.log.v1.written

SERVICE_NAME                                DISPLAY_NAME
accessapproval.googleapis.com               Access Approval
accesscontextmanager.googleapis.com         Access Context Manager
admin.googleapis.com                        Google Workspace Admin
aiplatform.googleapis.com                   AI Platform (under Vertex AI)
apigee.googleapis.com                       Apigee
apigeeconnect.googleapis.com                Apigee Connect
...
workflows.googleapis.com                    Workflows

各サービスが出力できるメソッド名(サブイベント)のリストを表示するには、次のコマンドを実行します。

gcloud beta eventarc attributes method-names list --type=google.cloud.audit.log.v1.written --service-name=workflows.googleapis.com

METHOD_NAME
google.cloud.workflows.v1.Workflows.CreateWorkflow
google.cloud.workflows.v1.Workflows.DeleteWorkflow
google.cloud.workflows.v1.Workflows.GetWorkflow
google.cloud.workflows.v1.Workflows.ListWorkflows
google.cloud.workflows.v1.Workflows.UpdateWorkflow
google.cloud.workflows.v1beta.Workflows.CreateWorkflow
google.cloud.workflows.v1beta.Workflows.DeleteWorkflow
google.cloud.workflows.v1beta.Workflows.GetWorkflow
google.cloud.workflows.v1beta.Workflows.ListWorkflows
google.cloud.workflows.v1beta.Workflows.UpdateWorkflow

6. Pub/Sub トリガーを作成する

イベントを受信する方法の一つは、Cloud Pub/Sub を使用することです。すべてのアプリケーションが Pub/Sub にメッセージをパブリッシュでき、それらのメッセージは Eventarc 経由で Cloud Run に配信できます。

セットアップ

トリガーを作成する前に、Eventarc に必要なサービスを有効にします。

gcloud services enable eventarc.googleapis.com

トリガーで使用するサービス アカウントも必要です。サービス アカウントの作成:

SERVICE_ACCOUNT=eventarc-trigger-sa

gcloud iam service-accounts create $SERVICE_ACCOUNT

作成

デプロイした Cloud Run サービスに Pub/Sub トピックにパブリッシュされたイベントをフィルタするトリガーを作成します。

TRIGGER_NAME=trigger-pubsub

gcloud eventarc triggers create $TRIGGER_NAME \
  --destination-run-service=$SERVICE_NAME \
  --destination-run-region=$REGION \
  --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
  --location=$REGION \
  --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

テスト

Pub/Sub トリガーは、内部でトピックを作成します。これを見つけて、変数に代入しましょう。

TOPIC_ID=$(gcloud eventarc triggers describe $TRIGGER_NAME --location $REGION --format='value(transport.pubsub.topic)')

gcloud を使用して、トピックにメッセージをパブリッシュします。

gcloud pubsub topics publish $TOPIC_ID --message="Hello World"

Cloud Run サービスは、受信メッセージの本文をログに記録します。これは、Cloud Run インスタンスの [ログ] セクションで確認できます。

69e0177e04a0d1af.png

既存の Pub/Sub トピックを使用して作成する

デフォルトでは、Pub/Sub トリガーを作成すると、Eventarc によってトピックが内部で作成され、アプリケーションと Cloud Run サービス間のトランスポート トピックとして使用できます。これは Pub/Sub を基盤とするトリガーを簡単かつ迅速に作成するのに便利ですが、既存のトピックを使用したい場合もあります。Eventarc では、--transport-topic gcloud フラグを使用して、同じプロジェクト内の既存の Pub/Sub トピックを指定できます。

この仕組みを確認するために、トランスポート トピックとして使用する Pub/Sub トピックを作成します。

TOPIC_ID=eventarc-topic

gcloud pubsub topics create $TOPIC_ID

トリガーを作成する

TRIGGER_NAME=trigger-pubsub-existing

gcloud eventarc triggers create $TRIGGER_NAME \
  --destination-run-service=$SERVICE_NAME \
  --destination-run-region=$REGION \
  --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \
  --location=$REGION \
  --transport-topic=projects/$PROJECT_ID/topics/$TOPIC_ID \
  --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

トピックにメッセージを送信してトリガーをテストできます。

gcloud pubsub topics publish $TOPIC_ID --message="Hello again"

7. Cloud Storage トリガーを作成する

このステップでは、Cloud Storage からのイベントをリッスンするトリガーを作成します。

セットアップ

まず、以下からイベントを受信するバケットを作成します。

BUCKET_NAME=eventarc-gcs-$PROJECT_ID

gsutil mb -l $REGION gs://$BUCKET_NAME

eventarc.eventReceiver ロールを付与して、Cloud Storage トリガーでサービス アカウントを使用できるようにします。

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --role roles/eventarc.eventReceiver \
  --member serviceAccount:$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

Cloud Storage トリガー用の Cloud Storage サービス アカウントに pubsub.publisher ロールを追加する必要もあります。

SERVICE_ACCOUNT_STORAGE=$(gsutil kms serviceaccount -p $PROJECT_ID)

gcloud projects add-iam-policy-binding $PROJECT_ID \
    --member serviceAccount:$SERVICE_ACCOUNT_STORAGE \
    --role roles/pubsub.publisher

作成

新しいファイル作成イベントをバケットからサービスに転送するトリガーを作成します。

TRIGGER_NAME=trigger-storage

gcloud eventarc triggers create $TRIGGER_NAME \
  --destination-run-service=$SERVICE_NAME \
  --destination-run-region=$REGION \
  --event-filters="type=google.cloud.storage.object.v1.finalized" \
  --event-filters="bucket=$BUCKET_NAME" \
  --location=$REGION \
  --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

テスト

すべてのトリガーを一覧表示して、トリガーが正常に作成されたことを確認します。

gcloud eventarc triggers list

Cloud Storage バケットにファイルをアップロードします。

echo "Hello World" > random.txt
gsutil cp random.txt gs://$BUCKET_NAME/random.txt

Cloud コンソールで Cloud Run サービスのログを確認すると、受信したイベントがあるはずです。

904cfc93bb8e8df1.png

8. Cloud Audit Logs トリガーを作成する

Cloud Storage イベントをリッスンするには Cloud Storage トリガーのほうが適していますが、このステップでは同じ処理を行うために Cloud Audit Logs トリガーを作成します。

セットアップ

サービスからイベントを受信するには、Cloud Audit Logs を有効にする必要があります。Cloud コンソールで、左上のメニューから IAM & AdminAudit Logs を選択します。サービスのリストで Google Cloud Storage を確認します。

3c654597faed237c.png

右側で AdminReadWrite が選択されていることを確認し、[Save] をクリックします。

1deb3ad78f11dd5f.png

作成

新しいファイル作成イベントをバケットからサービスに転送するトリガーを作成します。

TRIGGER_NAME=trigger-auditlog-storage

gcloud eventarc triggers create $TRIGGER_NAME\
  --destination-run-service=$SERVICE_NAME \
  --destination-run-region=$REGION \
  --event-filters="type=google.cloud.audit.log.v1.written" \
  --event-filters="serviceName=storage.googleapis.com" \
  --event-filters="methodName=storage.objects.create" \
  --event-filters-path-pattern="resourceName=/projects/_/buckets/$BUCKET_NAME/objects/*" \
  --location=$REGION \
  --service-account=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com

テスト

監査ログトリガーの初期化には少し時間がかかります。すべてのトリガーを一覧表示すると、トリガーが作成されたことを確認できます。

gcloud eventarc triggers list

ACTIVE フィールドが Yes になっていることがわかります。

NAME                          TYPE                                       DESTINATION               ACTIVE
trigger-auditlog-storage  google.cloud.audit.log.v1.written              Cloud Run service: hello  Yes

前と同じファイルを Cloud Storage バケットにアップロードします。

gsutil cp random.txt gs://$BUCKET_NAME/random.txt

Cloud コンソールで Cloud Run サービスのログを確認すると、受信したイベントがあるはずです。

7be7859bcc8976f8.png

9. Eventarc UI を探索する

このステップでは、Google Cloud コンソールの Eventarc UI を確認します。Eventarc UI では、Google Cloud コンソールからすべてのトリガーの概要の表示、編集と削除、新しいトリガーの作成を行うことができます。

Google Cloud の [Eventarc] セクションに移動します。

81e139f17e0d29bf.png

前に作成したトリガーのリストが表示されます。

3240c7c830398718.png

トリガーをクリックすると、そのトリガーの詳細を表示したり、トリガーを編集または削除したりできます。

b4d8bbc6601a8b9e.png

[Create trigger] を選択してトリガーの詳細を入力して、新しいトリガーを作成することもできます。

3ee290ec72f130d5.png

10. 完了

以上で、この Codelab は完了です。

学習した内容

  • Eventarc のビジョン
  • Eventarc でイベントを検出する
  • Cloud Run シンクを作成する
  • Pub/Sub のトリガーを作成する
  • Cloud Storage のトリガーを作成する
  • Cloud Audit Logs のトリガーを作成する
  • Eventarc UI を探索する