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、Workflows)をさまざまなソースからのイベントに簡単に接続できます。これにより、マイクロサービスが疎結合で分散されたイベント ドリブン アーキテクチャを構築できます。また、イベントの取り込み、配信、セキュリティ、認可、エラー処理も自動的に行われるため、デベロッパーのアジリティとアプリケーションの復元力が向上します。

この 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 のソース

Gmail、ハングアウト、Android Management などの Google 所有のプロダクトであるイベントソース

カスタムソース

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

作成

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

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

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

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 Console で Cloud Run サービスのログを確認すると、受信したイベントが表示されます。

904cfc93bb8e8df1.png

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

Cloud Storage イベントをリッスンするには Cloud Storage トリガーを使用する方が適していますが、この手順では、同じ処理を行う Cloud Audit Logs トリガーを作成します。

セットアップ

サービスからイベントを受信するには、Cloud Audit Logs を有効にする必要があります。Cloud Console で、左上のメニューから 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 Console で 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 を探索する