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 トリガーを使用してイベントを転送し、ワークフローを実行できるように、サービス アカウントに必要なロールと権限を付与する必要があります。
Cloud Shell を使用してこのチュートリアルを試している場合は、Compute Engine のデフォルトのサービス アカウントに追加のロールを付与する必要が生じることがあります。詳細については、このドキュメントの Cloud Run ジョブを作成するをご覧ください。
Console
- 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.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Compute Engine, Eventarc, and Workflows APIs.
-
Create a service account:
-
In the Google Cloud console, go to the Create service account page.
Go to Create service account - Select your project.
-
In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.
In the Service account description field, enter a description. For example,
Service account for quickstart
. - Click Create and continue.
-
Grant the following roles to the service account: Cloud Run Admin, Eventarc Event Receiver, Logs Writer, Storage Object Creator, Workflows Invoker.
To grant a role, find the Select a role list, then select the role.
To grant additional roles, click
Add another role and add each additional role. - Click Continue.
-
Click Done to finish creating the service account.
-
-
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 Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Compute Engine, Eventarc, and Workflows APIs.
-
Create a service account:
-
In the Google Cloud console, go to the Create service account page.
Go to Create service account - Select your project.
-
In the Service account name field, enter a name. The Google Cloud console fills in the Service account ID field based on this name.
In the Service account description field, enter a description. For example,
Service account for quickstart
. - Click Create and continue.
-
Grant the following roles to the service account: Cloud Run Admin, Eventarc Event Receiver, Logs Writer, Storage Object Creator, Workflows Invoker.
To grant a role, find the Select a role list, then select the role.
To grant additional roles, click
Add another role and add each additional role. - Click Continue.
-
Click Done to finish creating the service account.
-
- 2021 年 4 月 8 日以前に、認証済みの Pub/Sub push リクエストをサポートするために Cloud Pub/Sub サービス エージェントを有効にした場合は、サービス アカウント トークン作成者のロール(
roles/iam.serviceAccountTokenCreator
)をサービス エージェントに付与します。それ以外の場合、このロールはデフォルトで付与されます。- Google Cloud コンソールの [IAM] ページに移動します。
- [Google 提供のロール付与を含みます] チェックボックスをオンにします。
- [名前] 列で、Cloud Pub/Sub サービス アカウントを見つけて、対応する行にある [プリンシパルを編集します] をクリックします。
- [ ロールを追加] または [ 別のロールを追加] をクリックします。
- [ロールを選択] リストで、[サービス アカウント トークン作成者] でフィルタして、ロールを選択します。
- [保存] をクリックします。
- Google Cloud コンソールの [IAM] ページに移動します。
-
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.
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.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Compute Engine, Eventarc, and Workflows APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com compute.googleapis.com run.googleapis.com storage.googleapis.com eventarc.googleapis.com workflows.googleapis.com -
Set up authentication:
-
Create the service account:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
Replace
SERVICE_ACCOUNT_NAME
with a name for the service account. -
Grant roles to the service account. Run the following command once for each of the following IAM roles:
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
Replace the following:
SERVICE_ACCOUNT_NAME
: the name of the service accountPROJECT_ID
: the project ID where you created the service accountROLE
: the role to grant
-
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Compute Engine, Eventarc, and Workflows APIs:
gcloud services enable artifactregistry.googleapis.com
cloudbuild.googleapis.com compute.googleapis.com run.googleapis.com storage.googleapis.com eventarc.googleapis.com workflows.googleapis.com -
Set up authentication:
-
Create the service account:
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
Replace
SERVICE_ACCOUNT_NAME
with a name for the service account. -
Grant roles to the service account. Run the following command once for each of the following IAM roles:
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
Replace the following:
SERVICE_ACCOUNT_NAME
: the name of the service accountPROJECT_ID
: the project ID where you created the service accountROLE
: the role to grant
-
- 2021 年 4 月 8 日以前に、認証済みの Pub/Sub push リクエストをサポートするために Cloud Pub/Sub サービス エージェントを有効にした場合は、サービス アカウント トークン作成者のロール(
roles/iam.serviceAccountTokenCreator
)をサービス エージェントに付与します。それ以外の場合、このロールはデフォルトで付与されます。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 バケットに保存されているイベントデータを読み取り、そのイベントデータを出力します。
Cloud Shell でデプロイ スクリプトを実行している場合や、Compute Engine のデフォルトのサービス アカウントに編集者ロールが設定されていない場合は、Compute Engine のデフォルト サービス アカウントにプロジェクトに対する次のロールを付与します。(この手順をスキップして、次のステップでサンプルアプリ リポジトリのクローンを作成することもできます。)
Artifact Registry 書き込みロール(
roles/artifactregistry.writer
)を付与します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/artifactregistry.writer
PROJECT_NUMBER
は、実際の Google Cloud プロジェクトの番号に置き換えます。プロジェクト番号は、Google Cloud コンソールの [ようこそ] ページで確認できます。また、次のコマンドで確認することもできます。gcloud projects describe PROJECT_ID --format='value(projectNumber)'
Storage オブジェクト ユーザー ロール(
roles/storage.objectUser
)を付与します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/storage.objectUser
Logging ログ書き込みロール(
roles/logging.logWriter
)を付与します。gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --role=roles/logging.logWriter
ローカルマシンにサンプルアプリのリポジトリのクローンを作成して、サンプルコードを取得します。
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 ジョブを実行してイベントデータを処理します。
Console
Google Cloud コンソールの [ワークフロー] ページに移動します。
[
作成] をクリックします。新しいワークフローの名前を入力します(例:
message-payload-workflow
)。適切なリージョン(例:
us-central1
)を選択します。[サービス アカウント] フィールドで、先ほど作成したサービス アカウントを選択します。
サービス アカウントはワークフローの ID として機能します。次のロールがサービス アカウントにすでに付与されている必要があります。
- Cloud Run 管理者: Cloud Run ジョブを実行します
- ログ書き込み: ログエントリを書き込みます
- Storage オブジェクト作成者: Cloud Storage にオブジェクトを作成します
[次へ] をクリックします。
ワークフロー エディタで、次のワークフローの定義を入力します。
[デプロイ] をクリックします。
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 ジョブがイベントデータを処理できるようにする方法を示すために使用されます。
Console
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 トピックに書き込まれるたびに、イベントによってワークフローの実行がトリガーされます。
Console
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 ジョブが実行されます。この処理には 1 分ほどかかることがあります。
ジョブ実行を表示して、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 バケット オブジェクトのイベントデータを表示することで、結果が想定どおりであることを確認できます。
バケット名を取得します。
gcloud storage ls
出力は次のようになります。
gs://message-payload-PROJECT_ID/
バケット内のオブジェクトを一覧表示します。
gcloud storage ls gs://message-payload-PROJECT_ID/** --recursive
出力例を以下に示します。
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.
チュートリアル リソースの削除
このチュートリアルで作成したリソースを削除します。