Workflows を使用して、より複雑なデータ処理を行うワークフローや、既存のジョブのシステムをオーケストレートするワークフローの一部として Cloud Run ジョブを実行できます。
このチュートリアルでは、Workflows を使用して Cloud Storage バケットに保存されているイベントデータを処理する Cloud Run ジョブを実行する方法について説明します。イベント ペイロードを Cloud Storage バケットに保存すると、顧客管理の暗号鍵を使用してデータの暗号化が可能です。これは、Cloud Run ジョブへ環境変数としてイベントデータを渡す場合には不可能です。
次の図は、その概要を示しています。
目標
このチュートリアルの内容は次のとおりです。
- Cloud Storage バケットに保存されるイベントデータを処理する Cloud Run ジョブを作成します。
- 次の処理を行うワークフローをデプロイします。
- 引数としてイベントを受け取ります。
- イベント ペイロード データを Cloud Storage バケットに書き込みます。
- Cloud Run Admin API コネクタを使用して Cloud Run ジョブを実行します。
- Pub/Sub トピックを作成して、メッセージをパブリッシュできるようにします。このチュートリアルでは、Workflows を使用してイベントをルーティングする方法の例として Pub/Sub イベントを使用し、Cloud Run ジョブがイベントデータを処理できるように Cloud Storage にイベントを保存します。
- Pub/Sub トピックにメッセージが書き込まれたときにワークフローを実行する Eventarc トリガーを作成します。
- Pub/Sub トピックにメッセージを書き込むことで、ワークフローをトリガーします。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
組織で定義されているセキュリティの制約により、次の手順を完了できない場合があります。トラブルシューティング情報については、制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。
このチュートリアルを始める前に、特定の API を有効にし、ユーザー管理のサービス アカウントを作成する必要があります。Eventarc トリガーを使用してイベントをルーティングし、ワークフローを実行できるように、サービス アカウントに必要なロールと権限を付与する必要があります。
コンソール
- 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.
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows API を有効にします。
-
サービス アカウントを作成します。
-
Google Cloud コンソールで [サービス アカウントの作成] ページに移動します。
[サービス アカウントの作成] に移動 - プロジェクトを選択します。
-
[サービス アカウント名] フィールドに名前を入力します。Google Cloud コンソールでは、この名前に基づいて [サービス アカウント ID] フィールドに値が設定されます。
[サービス アカウントの説明] フィールドに説明を入力します。例:
Service account for quickstart
- [作成して続行] をクリックします。
-
サービス アカウントに次のロールを付与します: Cloud Run Admin, Eventarc Event Receiver, Logs Writer, Storage Object Creator, Workflows Invoker.
ロールを付与するには、[ロールを選択] リストを見つけてロールを選択します。
追加のロールを付与するには、
[別のロールを追加] をクリックして各ロールを追加します。 - [続行] をクリックします。
-
[完了] をクリックして、サービス アカウントの作成を完了します。
-
-
Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。
-
Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows API を有効にします。
-
サービス アカウントを作成します。
-
Google Cloud コンソールで [サービス アカウントの作成] ページに移動します。
[サービス アカウントの作成] に移動 - プロジェクトを選択します。
-
[サービス アカウント名] フィールドに名前を入力します。Google Cloud コンソールでは、この名前に基づいて [サービス アカウント ID] フィールドに値が設定されます。
[サービス アカウントの説明] フィールドに説明を入力します。例:
Service account for quickstart
- [作成して続行] をクリックします。
-
サービス アカウントに次のロールを付与します: Cloud Run Admin, Eventarc Event Receiver, Logs Writer, Storage Object Creator, Workflows Invoker.
ロールを付与するには、[ロールを選択] リストを見つけてロールを選択します。
追加のロールを付与するには、
[別のロールを追加] をクリックして各ロールを追加します。 - [続行] をクリックします。
-
[完了] をクリックして、サービス アカウントの作成を完了します。
-
- 2021 年 4 月 8 日以前に、認証済みの Pub/Sub push リクエストをサポートするために Cloud Pub/Sub サービス エージェントを有効にした場合は、サービス アカウント トークン作成者のロール(
roles/iam.serviceAccountTokenCreator
)を Google マネージド サービス アカウントに付与します。それ以外の場合、このロールはデフォルトで付与されます。- Google Cloud コンソールの [IAM] ページに移動します。
- [Google 提供のロール付与を含みます] チェックボックスをオンにします。
- [名前] 列で、Cloud Pub/Sub サービス アカウントを見つけて、対応する行にある [プリンシパルを編集します] をクリックします。
- [ロールを追加] または [別のロールを追加] をクリックします。
- [ロールを選択] リストで [サービス アカウント トークン作成者] をフィルタし、ロールを選択します。
- [保存] をクリックします。
- Google Cloud コンソールの [IAM] ページに移動します。
-
Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。
Google Cloud コンソールの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。
Cloud Shell は、このチュートリアルのコマンドライン手順をサポートしています。
gcloud
- 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.
- Google Cloud CLI をインストールします。
-
gcloud CLI を初期化するには:
gcloud init
-
Google Cloud プロジェクトを作成または選択します。
-
Google Cloud プロジェクトを作成します。
gcloud projects create PROJECT_ID
PROJECT_ID
は、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_ID
は、実際の Google Cloud プロジェクト名に置き換えます。
-
-
Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows API を有効にします。
gcloud services enable cloudbuild.googleapis.com
run.googleapis.com storage.googleapis.com eventarc.googleapis.com workflows.googleapis.com -
認証を設定します。
-
サービス アカウントを作成します。
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
SERVICE_ACCOUNT_NAME
をサービス アカウントの名前に置き換えます。 -
サービス アカウントにロールを付与します。次の IAM ロールごとに次のコマンドを 1 回実行します。
roles/eventarc.eventReceiver, roles/logging.logWriter, roles/run.admin, roles/storage.objectCreator, roles/workflows.invoker
gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE
次のように置き換えます。
SERVICE_ACCOUNT_NAME
: サービス アカウントの名前PROJECT_ID
: サービス アカウントを作成したプロジェクト IDROLE
: 付与するロール
-
- Google Cloud CLI をインストールします。
-
gcloud CLI を初期化するには:
gcloud init
-
Google Cloud プロジェクトを作成または選択します。
-
Google Cloud プロジェクトを作成します。
gcloud projects create PROJECT_ID
PROJECT_ID
は、作成する Google Cloud プロジェクトの名前に置き換えます。 -
作成した Google Cloud プロジェクトを選択します。
gcloud config set project PROJECT_ID
PROJECT_ID
は、実際の Google Cloud プロジェクト名に置き換えます。
-
-
Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows API を有効にします。
gcloud services enable cloudbuild.googleapis.com
run.googleapis.com storage.googleapis.com eventarc.googleapis.com workflows.googleapis.com -
認証を設定します。
-
サービス アカウントを作成します。
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
SERVICE_ACCOUNT_NAME
をサービス アカウントの名前に置き換えます。 -
サービス アカウントにロールを付与します。次の IAM ロールごとに次のコマンドを 1 回実行します。
roles/eventarc.eventReceiver, roles/logging.logWriter, roles/run.admin, roles/storage.objectCreator, roles/workflows.invoker
gcloud projects add-iam-policy-binding PROJECT_ID --member="serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com" --role=ROLE
次のように置き換えます。
SERVICE_ACCOUNT_NAME
: サービス アカウントの名前PROJECT_ID
: サービス アカウントを作成したプロジェクト IDROLE
: 付与するロール
-
- 2021 年 4 月 8 日以前に、認証済みの Pub/Sub push リクエストをサポートするために Cloud Pub/Sub サービス エージェントを有効にした場合は、サービス アカウント トークン作成者のロール(
roles/iam.serviceAccountTokenCreator
)を Google マネージド サービス アカウントに付与します。それ以外の場合、このロールはデフォルトで付与されます。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountTokenCreator
PROJECT_NUMBER
は、実際の Google Cloud プロジェクトの番号に置き換えます。プロジェクト番号は、Google Cloud コンソールの [ようこそ] ページで確認できます。また、次のコマンドで確認することもできます。
gcloud projects describe PROJECT_ID --format='value(projectNumber)'
Cloud Run ジョブを作成する
このチュートリアルでは、GitHub で入手可能なサンプルコードを使用します。このデプロイ スクリプトがコンテナ イメージをビルドし、Cloud Run ジョブを作成します。このスクリプトは、Cloud Storage バケットも作成します。Cloud Run ジョブは、Cloud Storage バケットに保存されているイベントデータを読み取り、そのイベントデータを出力します。
ローカルマシンにサンプルアプリのリポジトリのクローンを作成して、サンプルコードを取得します。
git clone https://github.com/GoogleCloudPlatform/workflows-demos.git
または、zip 形式のサンプルをダウンロードすることもできます。
サンプルコードが入っているディレクトリに移動します。
cd workflows-demos/cloud-run-jobs-payload-gcs/message-payload-job
デプロイ スクリプトを実行して Cloud Run ジョブを作成します。
./deploy-job.sh
このスクリプトは、message-payload-PROJECT_ID
という名前の Cloud Storage バケットを作成します。ここで、PROJECT_ID
は、Google Cloud プロジェクトの ID です。message-payload-job
という名前の Cloud Run ジョブも作成されます。
Cloud Run ジョブを実行するワークフローをデプロイする
作成した Cloud Run ジョブを実行するワークフローを定義してデプロイします。ワークフロー定義は、Workflows 構文を使用して説明した一連のステップで構成されています。
ワークフローはイベントを受信し、イベントデータを Cloud Storage バケットに保存してから、Cloud Run ジョブを実行してイベントデータを処理します。
コンソール
Google Cloud コンソールの [ワークフロー] ページに移動します。
[
作成] をクリックします。新しいワークフローの名前を入力します(例:
message-payload-workflow
)。適切なリージョン(例:
us-central1
)を選択します。[サービス アカウント] フィールドで、先ほど作成したサービス アカウントを選択します。
サービス アカウントは、ワークフローの ID として機能します。サービス アカウントには次のロールがすでに付与されている必要があります。
- Cloud Run 管理者: Cloud Run ジョブを実行します
- ログ書き込み: ログエントリを書き込みます
- Storage オブジェクト作成者: Cloud Storage にオブジェクトを作成します
[次へ] をクリックします。
ワークフロー エディタで、次のワークフローの定義を入力します。
[Deploy] をクリックします。
gcloud
ワークフローのソースコード ファイルを作成します。
touch message-payload-workflow.yaml
次のワークフロー定義を
message-payload-workflow.yaml
にコピーします。次のコマンドを入力してワークフローをデプロイします。
gcloud workflows deploy message-payload-workflow \ --location=us-central1 \ --source=message-payload-workflow.yaml \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
以下を置き換えます。
SERVICE_ACCOUNT_NAME
: 先ほど作成したサービス アカウントの名前PROJECT_ID
: Google Cloud プロジェクトの ID
サービス アカウントは、ワークフローの ID として機能します。サービス アカウントには次のロールがすでに付与されている必要があります。
roles/logging.logWriter
: ログエントリを書き込みますroles/run.admin
: Cloud Run ジョブを実行しますroles/storage.objectCreator
: Cloud Storage にオブジェクトを作成します
ワークフローは、次のことを行います。
init
ステップ - イベントを引数として受け取り、必要な変数を設定します。log_event
ステップ - 関数 sys.log を使用して、Cloud Logging にログエントリを作成します。write_payload_to_gcs
ステップ - HTTPPOST
リクエストを行い、イベント ペイロード データを Cloud Storage バケット ファイルに書き込みます。run_job_to_process_payload
ステップ - Cloud Run Admin API コネクタ メソッドgoogleapis.run.v1.namespaces.jobs.run
を使用して、ジョブを実行します。Cloud Storage バケットとデータファイル名が、ワークフローからジョブにオーバーライド変数として渡されます。finish
ステップ - ワークフローの結果としてジョブの実行に関する情報を返します。
Pub/Sub トピックの作成
Pub/Sub トピックを作成して、メッセージをパブリッシュできるようにします。Pub/Sub イベントは、Workflows を使用してイベントをルーティングし、Cloud Storage にイベントを保存して、Cloud Run ジョブがイベントデータを処理できるようにする方法を示すために使用されます。
コンソール
Google Cloud コンソールの トピック ページに移動します。
[
トピックを作成] をクリックします。[トピック ID] フィールドに、トピックの ID(
message-payload-topic
など)を入力します。[デフォルトのサブスクリプションを追加] オプションは、そのまま保持します。
他のオプションは選択しないでください。
[作成] をクリックします。
gcloud
ID message-payload-topic
を含むトピックを作成するには、gcloud pubsub topics create
コマンドを実行します。
gcloud pubsub topics create message-payload-topic
イベントをワークフローにルーティングする Eventarc トリガーを作成する
ワークフローを自動的に実行して、Cloud Run ジョブを実行するには、Pub/Sub イベントに応答し、イベントをワークフローにルーティングする Eventarc トリガーを作成します。Pub/Sub トピックにメッセージが書き込まれるたびに、イベントによりワークフローの実行がトリガーされます。
コンソール
Google Cloud コンソールの [ワークフロー] ページに移動します。
ワークフローの名前(
message-payload-workflow
など)をクリックします。[ワークフローの詳細] ページで [
編集] をクリックします。[ワークフローの編集] ページの [トリガー] セクションで、[新しいトリガーを追加] > [Eventarc] の順にクリックします。
[Eventarc トリガー] ペインが開きます。
[トリガー名] フィールドに、トリガーの名前を入力します(例:
message-payload-trigger
)。[イベント プロバイダ] リストから、[Cloud Pub/Sub] を選択します。
[イベント] リストから [google.cloud.pubsub.topic.v1.messagePublished] を選択します。
[Cloud Pub/Sub トピックを選択してください] リストから、前に作成した Pub/Sub トピックを選択します。
[サービス アカウント] フィールドで、先ほど作成したサービス アカウントを選択します。
サービス アカウントがトリガーの ID として機能します。サービス アカウントには次のロールがすでに付与されている必要があります。
- Eventarc イベント受信者: イベントを受信します
- Workflows 起動元: Workflows を実行します
[トリガーを保存] をクリックします。
Eventarc トリガーは、[ワークフローの編集] ページの [トリガー] セクションに表示されます。
[次へ] をクリックします。
[デプロイ] をクリックします。
gcloud
次のコマンドを実行して、Eventarc トリガーを作成します。
gcloud eventarc triggers create message-payload-trigger \ --location=us-central1 \ --destination-workflow=message-payload-workflow \ --destination-workflow-location=us-central1 \ --event-filters="type=google.cloud.pubsub.topic.v1.messagePublished" \ --transport-topic=projects/PROJECT_ID/topics/message-payload-topic \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
以下を置き換えます。
PROJECT_ID
: Google Cloud プロジェクトの IDSERVICE_ACCOUNT_NAME
: 先ほど作成したサービス アカウントの名前
サービス アカウントがトリガーの ID として機能します。サービス アカウントには次のロールがすでに付与されている必要があります。
roles/eventarc.eventReceiver
: イベントを受信しますroles/workflows.invoker
: Workflows を実行します
ワークフローをトリガーする
Pub/Sub トピックにメッセージを公開し、イベントを生成することで、エンドツーエンド システムをテストします。詳細については、イベントまたは Pub/Sub メッセージでワークフローをトリガーするをご覧ください。
Pub/Sub トピックにメッセージをパブリッシュしてイベントを生成します。
gcloud pubsub topics publish message-payload-topic --message="Hello World"
イベントはワークフローに転送され、イベント メッセージがログに記録され、イベントデータが Cloud Storage バケットに保存されて、Cloud Storage に保存されたデータを処理する Cloud Run ジョブが実行されます。これには数分かかることがあります。
ジョブ実行を表示して、Cloud Run ジョブが想定どおりに実行されたことを確認します。
gcloud run jobs executions list --job=message-payload-job
新しいジョブの実行が出力に表示されます。
ワークフローのトリガーによって作成されたイベント関連のログエントリを表示するには、次のコマンドを実行します。
gcloud logging read "resource.type=cloud_run_job AND textPayload:Payload"
次のようなログエントリを探します。
textPayload: "Payload: {'message': {'data': 'SGVsbG8gV29ybGQ=', 'messageId': '8834108235224238',\ \ 'publishTime': '2023-09-20T17:07:52.921Z'}, 'subscription': 'projects/MY_PROJECT/subscriptions/eventarc-us-central1-message-payload-trigger-sub-741'}" ... resource: labels: job_name: message-payload-job location: us-central1 project_id: MY_PROJECT type: cloud_run_job textPayload: Processing message payload gs://message-payload-MY_PROJECT/8254002311197919.data.json
Cloud Storage バケット オブジェクトのイベントデータを表示することで、結果が想定どおりであることを確認できます。
バケット名を取得します。
gsutil ls
出力は次のようになります。
gs://message-payload-PROJECT_ID/
バケット内のオブジェクトを一覧表示します。
gsutil ls -r gs://message-payload-PROJECT_ID/**
出力例を以下に示します。
gs://message-payload-PROJECT_ID/OBJECT_ID.data.json
OBJECT_ID
をメモします。これは次の手順で使用します。バケット内のオブジェクトをファイルとしてダウンロードします。
gcloud storage cp gs://message-payload-PROJECT_ID/OBJECT_ID.data.json message-event.txt
OBJECT_ID
を前の手順で返された ID に置き換えます。テキスト エディタで
message-event.txt
ファイルを開きます。ファイルに書き込まれるイベント本文は、次のようになります。{ "message": { "data": "SGVsbG8gV29ybGQ=", "messageId": "8254002311197919", "publishTime": "2023-09-20T16:54:29.312Z" }, "subscription": "projects/MY_PROJECT/subscriptions/eventarc-us-central1-message-payload-trigger-sub-741" }
SGVsbG8gV29ybGQ=
のデータ値を Base64 形式からデコードすると、「Hello World」が返されます。
クリーンアップ
このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルで変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。
プロジェクトの削除
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- 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.
チュートリアル リソースの削除
このチュートリアルで作成したリソースを削除します。