このドキュメントでは、Terraform と google_eventarc_trigger
リソースを使用して、次の Google Cloud宛先の Eventarc トリガーを作成する方法について説明します。
Terraform の使用方法の詳細については、 Google Cloudの Terraform のドキュメントをご覧ください。
このガイドのコードサンプルでは、Cloud Storage からの直接イベントを転送しますが、任意のイベント プロバイダに適用できます。たとえば、Pub/Sub から Cloud Run に直接イベントを転送する方法については、Terraform のクイックスタートをご覧ください。
始める前に
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Cloud Resource Manager and Identity and Access Management (IAM) APIs.
-
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Terraform は Cloud Shell 環境に統合されているため、Terraform をインストールしなくても、Cloud Shell を使用して Terraform リソースをデプロイできます。
Terraform のデプロイを準備する
Terraform リソースをデプロイする前に、Terraform 構成ファイルを作成する必要があります。Terraform 構成ファイルを使用すると、Terraform 構文を使用してインフラストラクチャの望ましい最終状態を定義できます。
Cloud Shell を準備する
Cloud Shell で、Terraform 構成を適用するデフォルトの Google Cloud プロジェクトを設定します。このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
PROJECT_ID
は、 Google Cloud プロジェクトの ID に置き換えます。
Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。
ディレクトリを準備する
各 Terraform 構成ファイルには独自のディレクトリ(ルート モジュールとも呼ばれます)が必要です。Cloud Shell で、ディレクトリを作成し、そのディレクトリ内に新しいファイルを作成します。
mkdir DIRECTORY && cd DIRECTORY && touch main.tf
ファイル名の拡張子は .tf
にする必要があります。たとえば、このドキュメントでは、ファイルは main.tf
と呼ばれます。
Terraform 構成を定義する
該当する Terraform コードサンプルを新しく作成した main.tf
ファイルにコピーします。必要に応じて、GitHub からコードをコピーします。Terraform スニペットがエンドツーエンドのソリューションの一部である場合は、この方法をおすすめします。
通常は、構成全体を一度に適用します。ただし、特定のリソースをターゲットにすることもできます。次に例を示します。
terraform apply -target="google_eventarc_trigger.default"
Terraform コードサンプルでは、参照変数、リソースの属性、関数の呼び出しなどの代入に補間を使用しています。
API を有効にする
Terraform のサンプルでは通常、必要な API がGoogle Cloud プロジェクトで有効になっていることを前提としています。次のコードを使用して API を有効にします。
Cloud Run
GKE
Workflows
サービス アカウントを作成してアクセスを構成する
すべての Eventarc トリガーは、トリガーの作成時に IAM サービス アカウントに関連付けられます。次のコードを使用して専用のサービス アカウントを作成し、ユーザー マネージド サービス アカウントにイベントを管理するための特定の Identity and Access Management ロールを付与します。
Cloud Run
Pub/Sub サービス エージェントは、Pub/Sub API が有効になると自動的に作成されます。Pub/Sub サービス エージェントが 2021 年 4 月 8 日以前に作成され、サービス アカウントに Cloud Pub/Sub サービス エージェントのロール(roles/pubsub.serviceAgent
)が付与されていない場合は、サービス エージェントにサービス アカウント トークン作成者のロール(roles/iam.serviceAccountTokenCreator
)を付与します。詳細については、ロールを作成してサービス エージェントに付与するをご覧ください。
resource "google_project_iam_member" "tokencreator" { project = data.google_project.project.id role = "roles/iam.serviceAccountTokenCreator" member = "serviceAccount:service-${data.google_project.project.number}@gcp-sa-pubsub.iam.gserviceaccount.com" }
GKE
サービス アカウントを作成する前に、Eventarc が GKE クラスタを管理できるようにします。
サービス アカウントを作成します。
Workflows
Pub/Sub サービス エージェントは、Pub/Sub API が有効になると自動的に作成されます。Pub/Sub サービス エージェントが 2021 年 4 月 8 日以前に作成され、サービス アカウントに Cloud Pub/Sub サービス エージェントのロール(roles/pubsub.serviceAgent
)が付与されていない場合は、サービス エージェントにサービス アカウント トークン作成者のロール(roles/iam.serviceAccountTokenCreator
)を付与します。詳細については、ロールを作成してサービス エージェントに付与するをご覧ください。
resource "google_project_iam_member" "tokencreator" { project = data.google_project.project.id role = "roles/iam.serviceAccountTokenCreator" member = "serviceAccount:service-${data.google_project.project.number}@gcp-sa-pubsub.iam.gserviceaccount.com" }
イベント プロバイダとして Cloud Storage バケットを作成する
次のコードを使用して Cloud Storage バケットを作成し、Cloud Storage サービス エージェントに Pub/Sub パブリッシャーのロール(roles/pubsub.publisher
)を付与します。
Cloud Run
GKE
Workflows
イベント ターゲットとなるイベント レシーバーを作成する
次のいずれかの Terraform リソースを使用して、イベント受信側を作成します。
Cloud Run
Eventarc トリガーのイベントの宛先として Cloud Run サービスを作成します。
GKE
このガイドを簡素化するため、Terraform 構成を適用する間に、Terraform の外部でイベントの宛先として Google Kubernetes Engine サービスを作成します。
この Google Cloud プロジェクトでトリガーを作成していない場合は、次のコマンドを実行して Eventarc サービス エージェントを作成します。
gcloud beta services identity create --service eventarc.googleapis.com
GKE クラスタを作成します。
ビルド済みの Cloud Run イメージ
us-docker.pkg.dev/cloudrun/container/hello
を使用して、HTTP リクエストを受信し、イベントをログに記録する Kubernetes Service を GKE にデプロイします。クラスタとやり取りするために必要な認証情報を取得します。
gcloud container clusters get-credentials eventarc-cluster \ --region=us-central1
hello-gke
という名前の Deployment を作成します。kubectl create deployment hello-gke \ --image=us-docker.pkg.dev/cloudrun/container/hello
Deployment を Kubernetes Service として公開します。
kubectl expose deployment hello-gke \ --type ClusterIP --port 80 --target-port 8080
Pod が実行されていることを確認します。
kubectl get pods
出力例を以下に示します。
NAME READY STATUS RESTARTS AGE hello-gke-5b6574b4db-rzzcr 1/1 Running 0 2m45s
STATUS
がPending
またはContainerCreating
の場合、Pod はデプロイされています。デプロイが完了するまで 1 分ほど待ってから、もう一度ステータスを確認します。サービスが実行されていることを確認します。
kubectl get svc
出力例を以下に示します。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-gke ClusterIP 34.118.230.123 <none> 80/TCP 4m46s kubernetes ClusterIP 34.118.224.1 <none> 443/TCP 14m
Workflows
Cloud Storage バケットでオブジェクトが更新されたときに実行されるワークフローをデプロイします。
Eventarc トリガーを定義する
Eventarc トリガーは、イベント プロバイダからイベントの宛先にイベントを転送します。google_eventarc_trigger
リソースを使用して matching_criteria
で CloudEvents 属性を指定し、イベントをフィルタリングします。詳細については、特定のプロバイダ、イベントタイプ、宛先にトリガーを作成するの手順をご覧ください。すべてのフィルタに一致するイベントが宛先に送信されます。
Cloud Run
Cloud Storage イベントを hello-event
Cloud Run サービスに転送する Eventarc トリガーを作成します。
GKE
Cloud Storage イベントを hello-gke
GKE サービスに転送する Eventarc トリガーを作成します。
Workflows
Cloud Storage イベントを storage-workflow-tf
という名前のワークフローに転送する Eventarc トリガーを作成します。
Terraform を適用
Terraform CLI を使用して、構成ファイルに基づいてインフラストラクチャをプロビジョニングします。
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
Terraform を初期化します。これは、ディレクトリごとに 1 回だけ行います。
terraform init
必要に応じて、最新バージョンの Google プロバイダを使用するには、
-upgrade
オプションを使用します。terraform init -upgrade
構成を確認して、Terraform が作成または更新するリソースが想定どおりであることを確認します。
terraform plan
必要に応じて構成を修正します。
次のコマンドを実行し、プロンプトで「
yes
」と入力して、Terraform 構成を適用します。terraform apply
Terraform に「Apply complete!」というメッセージが表示されるまで待ちます。
リソースの作成を確認する
Cloud Run
サービスが作成されたことを確認します。
gcloud run services list --region us-central1
トリガーが作成されたことを確認します。
gcloud eventarc triggers list --location us-central1
出力例を以下に示します。
NAME: trigger-storage-cloudrun-tf TYPE: google.cloud.storage.object.v1.finalized DESTINATION: Cloud Run service: hello-events ACTIVE: Yes LOCATION: us-central1
GKE
サービスが作成されたことを確認します。
kubectl get service hello-gke
トリガーが作成されたことを確認します。
gcloud eventarc triggers list --location us-central1
出力例を以下に示します。
NAME: trigger-storage-gke-tf TYPE: google.cloud.storage.object.v1.finalized DESTINATION: GKE: hello-gke ACTIVE: Yes LOCATION: us-central1
Workflows
ワークフローが作成されたことを確認します。
gcloud workflows list --location us-central1
Eventarc トリガーが作成されたことを確認します。
gcloud eventarc triggers list --location us-central1
出力例を以下に示します。
NAME: trigger-storage-workflows-tf TYPE: google.cloud.storage.object.v1.finalized DESTINATION: Workflows: storage-workflow-tf ACTIVE: Yes LOCATION: us-central1
イベントを生成して表示する
イベントを生成し、Eventarc トリガーが期待どおりに動作していることを確認します。
前に作成した Cloud Storage バケットの名前を取得します。
gcloud storage ls
テキスト ファイルを Cloud Storage バケットにアップロードします。
echo "Hello World" > random.txt gcloud storage cp random.txt gs://BUCKET_NAME/random.txt
BUCKET_NAME
は、前の手順で取得した Cloud Storage バケット名に置き換えます。次に例を示します。gcloud storage cp random.txt gs://BUCKET_NAME/random.txt
アップロードによりイベントが生成され、イベント レシーバ サービスはイベントのメッセージをロギングします。
イベントが受信されたことを確認します。
Cloud Run
サービスによって作成されたログエントリをフィルタします。
gcloud logging read 'jsonPayload.message: "Received event of type google.cloud.storage.object.v1.finalized."'
次のようなログエントリを探します。
Received event of type google.cloud.storage.object.v1.finalized. Event data: { "kind": "storage#object", "id": "trigger-cloudrun-BUCKET_NAME/random.txt", ...}
GKE
Pod ID を見つけます。
POD_NAME=$(kubectl get pods -o custom-columns=":metadata.name" --no-headers)
このコマンドは、
kubectl
のフォーマットされた出力を使用します。Pod のログを確認します。
kubectl logs $POD_NAME
次のようなログエントリを探します。
{"severity":"INFO","eventType":"google.cloud.storage.object.v1.finalized","message": "Received event of type google.cloud.storage.object.v1.finalized. Event data: ...}
Workflows
直近の 5 つの実行を一覧表示して、Workflows の実行がトリガーされたことを確認します。
gcloud workflows executions list storage-workflow-tf --limit=5
出力には、
NAME
、STATE
、START_TIME
、END_TIME
の実行リストが含まれます。最新の実行の結果を取得します。
EXECUTION_NAME=$(gcloud workflows executions list storage-workflow-tf --limit=1 --format "value(name)") gcloud workflows executions describe $EXECUTION_NAME
出力は次のようになります。
... result: '"Received event google.cloud.storage.object.v1.finalized - BUCKET_NAME, random.txt"' startTime: '2024-12-13T17:23:50.451316533Z' state: SUCCEEDED ...
クリーンアップ
以前に Terraform 構成で適用されたリソースを削除するために、次のコマンドを実行してプロンプトで「yes
」と入力します。
terraform destroy
Google Cloud プロジェクトを削除して、料金が発生しないようにすることもできます。 Google Cloud プロジェクトを削除すると、そのプロジェクト内で使用されているすべてのリソースに対する課金が停止します。
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.