Workflows を使用すると、ワークフローの一部として Cloud Run ジョブを実行し、より複雑なデータ処理を行う、または既存のジョブのシステムをオーケストレートします。
このチュートリアルでは、Workflows を使用して、Cloud Storage のイベントに応答して環境変数としてジョブに渡されるデータを処理する Cloud Run ジョブを実行する方法について説明します。
イベントデータを Cloud Storage バケットに保存することもできます。これにより、顧客管理の暗号鍵を使用してデータを暗号化できます。詳細については、Cloud Storage に保存されているイベントデータを処理する Cloud Run ジョブを実行するをご覧ください。
Cloud Run ジョブの作成
このチュートリアルでは、GitHub のサンプル Cloud Run ジョブを使用します。このジョブは、Cloud Storage の入力ファイルからデータを読み取り、ファイルの各行に対して任意の処理を実行します。
ローカルマシンにサンプルアプリのリポジトリのクローンを作成して、サンプルコードを取得します。
git clone https://github.com/GoogleCloudPlatform/jobs-demos.git
または、サンプルを ZIP ファイルとしてダウンロードし、ファイルを抽出することもできます。
サンプルコードが入っているディレクトリに移動します。
cd jobs-demos/parallel-processing
書き込みが可能でイベントをトリガーできる入力ファイルを保存するための Cloud Storage バケットを作成します。
コンソール
- Google Cloud コンソールで Cloud Storage の [バケット] ページに移動します。
- add [作成] をクリックします。
- [バケットの作成] ページで、バケットの名前を入力します。
input-PROJECT_ID
PROJECT_ID
は、 Google Cloud プロジェクトの ID に置き換えます。 - 他の値はデフォルトのままにします。
- [作成] をクリックします。
gcloud
gcloud storage buckets create
コマンドを実行します。gcloud storage buckets create gs://input-PROJECT_ID
リクエストが成功すると、コマンドから次のメッセージが返されます。
Creating gs://input-PROJECT_ID/...
Terraform
Cloud Storage バケットを作成するには、
google_storage_bucket
リソースを使用して、次のサンプルに示すようにmain.tf
ファイルを変更します。Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
一般的な Terraform ワークフローでは、プラン全体を一度に適用します。ですが、このチュートリアルでは、特定のリソースをターゲットにできます。次に例を示します。
terraform apply -target="random_id.bucket_name_suffix"
および
terraform apply -target="google_storage_bucket.default"
- Google Cloud コンソールで Cloud Storage の [バケット] ページに移動します。
コンテナ イメージを保存できる Artifact Registry 標準リポジトリを作成します。
コンソール
Google Cloud コンソールで、Artifact Registry の [リポジトリ] ページに移動します。
[リポジトリを作成] をクリックします。
リポジトリの名前を入力します(例:
my-repo
)。プロジェクト内のリポジトリのロケーションごとに、リポジトリ名は一意でなければなりません。デフォルトの形式(Docker)のままにします。
デフォルト モード(Standard)のままにします。
リージョンに、[us-central1(アイオワ)] を選択します。
その他すべてのデフォルトはそのままにします。
[作成] をクリックします。
gcloud
次のコマンドを実行します。
gcloud artifacts repositories create REPOSITORY \ --repository-format=docker \ --location=us-central1
REPOSITORY
は、リポジトリの一意の名前(my-repo
など)に置き換えます。プロジェクト内のリポジトリのロケーションごとに、リポジトリ名は一意でなければなりません。Terraform
Artifact Registry リポジトリを作成するには、
google_artifact_registry_repository
リソースを使用して、次のサンプルに示すようにmain.tf
ファイルを変更します。一般的な Terraform ワークフローでは、プラン全体を一度に適用します。ですが、このチュートリアルでは、特定のリソースをターゲットにできます。次に例を示します。
terraform apply -target="google_artifact_registry_repository.default"
デフォルトの Google Cloud Buildpack を使用してコンテナ イメージをビルドします。
export SERVICE_NAME=parallel-job gcloud builds submit \ --pack image=us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/${SERVICE_NAME}
REPOSITORY
を Artifact Registry リポジトリの名前に置き換えます。ビルドが完了するまで数分かかることがあります。
コンテナ イメージをデプロイする Cloud Run ジョブを作成します。
コンソール
Google Cloud コンソールで、[Cloud Run] ページに移動します。
[ジョブを作成] をクリックして、[ジョブを作成] フォームを表示します。
- フォームで、Artifact Registry コンテナ イメージの URL として
us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/parallel-job:latest
を選択します。 - (省略可)ジョブ名に「
parallel-job
」と入力します。 - (省略可)リージョンに、[us-central1(アイオワ)] を選択します。
- ジョブで実行するタスクの数として、「
10
」と入力します。ジョブが成功するには、すべてのタスクが成功する必要があります。デフォルトでは、タスクは並行して実行されます。
- フォームで、Artifact Registry コンテナ イメージの URL として
[コンテナ、変数とシークレット、接続、セキュリティ] セクションを開き、次の設定を除き、すべてのデフォルトのままにします。
[全般] タブをクリックします。
- コンテナ コマンドに「
python
」と入力します。 - コンテナ引数に「
process.py
」と入力します。
- コンテナ コマンドに「
[変数とシークレット] タブをクリックします。
- [変数を追加] をクリックし、名前に「
INPUT_BUCKET
」、値に「input-PROJECT_ID
」と入力します。 - [変数を追加] をクリックし、名前に「
INPUT_FILE
」、値に「input_file.txt
」と入力します。
- [変数を追加] をクリックし、名前に「
ジョブを作成するには、[作成] をクリックします。
gcloud
デフォルトの Cloud Run リージョンを設定します。
gcloud config set run/region us-central1
Cloud Run ジョブを作成します。
gcloud run jobs create parallel-job \ --image us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/parallel-job:latest \ --command python \ --args process.py \ --tasks 10 \ --set-env-vars=INPUT_BUCKET=input-PROJECT_ID,INPUT_FILE=input_file.txt
イメージタグを指定しない場合、Artifact Registry はデフォルトの
latest
タグが付いたイメージを探します。ジョブの作成時に使用可能なオプションの一覧については、gcloud run jobs create コマンドライン ドキュメントをご覧ください。
ジョブが作成されると、成功したことを示すメッセージが表示されます。
Terraform
Cloud Run ジョブを作成するには、
google_cloud_run_v2_job
リソースを使用して、次のサンプルに示すようにmain.tf
ファイルを変更します。一般的な Terraform ワークフローでは、プラン全体を一度に適用します。ですが、このチュートリアルでは、特定のリソースをターゲットにできます。次に例を示します。
terraform apply -target="google_cloud_run_v2_job.default"
Cloud Run ジョブを実行するワークフローをデプロイする
作成した Cloud Run ジョブを実行するワークフローを定義してデプロイします。ワークフロー定義は、ワークフロー構文を使用して説明した一連のステップで構成されています。
コンソール
Google Cloud コンソールで、[ワークフロー] ページに移動します。
[
作成] をクリックします。新しいワークフローの名前を入力します(例:
cloud-run-job-workflow
)。リージョンに、[us-central1(アイオワ)] を選択します。
[サービス アカウント] フィールドで、先ほど作成したサービス アカウントを選択します。
サービス アカウントは、ワークフローの ID として機能します。ワークフローで Cloud Run ジョブを実行できるようにするには、サービス アカウントに Cloud Run 管理者ロールがすでに付与されている必要があります。
[次へ] をクリックします。
ワークフロー エディタで、次のワークフローの定義を入力します。
[デプロイ] をクリックします。
gcloud
ワークフローのソースコード ファイルを作成します。
touch cloud-run-job-workflow.yaml
次のワークフロー定義をソースコード ファイルにコピーします。
次のコマンドを入力してワークフローをデプロイします。
gcloud workflows deploy cloud-run-job-workflow \ --location=us-central1 \ --source=cloud-run-job-workflow.yaml \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
以下を置き換えます。
SERVICE_ACCOUNT_NAME
: 先ほど作成したサービス アカウントの名前PROJECT_ID
:Google Cloud プロジェクトの ID
サービス アカウントは、ワークフローの ID として機能します。ワークフローで Cloud Run ジョブを実行できるようにするには、サービス アカウントに
roles/run.admin
のロールがすでに付与されている必要があります。
Terraform
ワークフローを作成するには、google_workflows_workflow
リソースを使用して、次のサンプルに示すように main.tf
ファイルを変更します。
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
一般的な Terraform ワークフローでは、プラン全体を一度に適用します。ですが、このチュートリアルでは、特定のリソースをターゲットにできます。次に例を示します。
terraform apply -target="google_workflows_workflow.default"
ワークフローは、次のことを行います。
init
ステップ - Cloud Storage イベントを引数として受け取り、必要な変数を設定します。check_input_file
ステップ - イベントで指定された Cloud Storage バケットが、Cloud Run ジョブで使用されているバケットであるかどうかを確認します。- 「はい」の場合、ワークフローは
run_job
ステップに進みます。 - 「いいえ」の場合、ワークフローは終了し、それ以上の処理は停止します。
- 「はい」の場合、ワークフローは
run_job
ステップ - Cloud Run Admin API コネクタのgoogleapis.run.v1.namespaces.jobs.run
メソッドを使用して、ジョブを実行します。Cloud Storage バケットとデータファイル名が、ワークフローからジョブにオーバーライド変数として渡されます。finish
ステップ - ワークフローの結果としてジョブの実行に関する情報を返します。
ワークフローの Eventarc トリガーを作成する
入力データファイルが更新されるたびに自動的にワークフローを実行し、次に Cloud Run ジョブを実行するには、入力データファイルを含むバケットの Cloud Storage イベントに応答する Eventarc トリガーを作成します。
コンソール
Google Cloud コンソールで、[ワークフロー] ページに移動します。
ワークフローの名前(
cloud-run-job-workflow
など)をクリックします。[ワークフローの詳細] ページで [
編集] をクリックします。[ワークフローの編集] ページの [トリガー] セクションで、[新しいトリガーを追加] > [Eventarc] の順にクリックします。
[Eventarc トリガー] ペインが開きます。
[トリガー名] フィールドに、トリガーの名前を入力します(例:
cloud-run-job-workflow-trigger
)。[イベント プロバイダ] リストで、[Cloud Storage] を選択します。
[イベント] リストから [google.cloud.storage.object.v1.finalized] を選択します。
[バケット] フィールドで、入力データファイルを含むバケットを選択します。バケット名の形式は
input-PROJECT_ID
です。[サービス アカウント] フィールドで、先ほど作成したサービス アカウントを選択します。
サービス アカウントは、トリガーの ID として機能します。サービス アカウントには、次のロールがすでに付与されているはずです。
- Eventarc イベント受信者: イベントを受信します
- Workflows 起動元: Workflows を実行します
[トリガーを保存] をクリックします。
Eventarc トリガーは、[ワークフローの編集] ページの [トリガー] セクションに表示されます。
[次へ] をクリックします。
[デプロイ] をクリックします。
gcloud
次のコマンドを実行して、Eventarc トリガーを作成します。
gcloud eventarc triggers create cloud-run-job-workflow-trigger \ --location=us \ --destination-workflow=cloud-run-job-workflow \ --destination-workflow-location=us-central1 \ --event-filters="type=google.cloud.storage.object.v1.finalized" \ --event-filters="bucket=input-PROJECT_ID" \ --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 を実行します
Terraform
トリガーを作成するには、google_eventarc_trigger
リソースを使用して、次のサンプルに示すように main.tf
ファイルを変更します。
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。
一般的な Terraform ワークフローでは、プラン全体を一度に適用します。ですが、このチュートリアルでは、特定のリソースをターゲットにできます。次に例を示します。
terraform apply -target="google_eventarc_trigger.default"
入力データファイルを含む Cloud Storage バケットでファイルがアップロードまたは上書きされるたびに、ワークフローは対応する Cloud Storage イベントを引数として実行されます。
ワークフローをトリガーする
Cloud Storage の入力データファイルを更新して、エンドツーエンド システムをテストします。
入力ファイルの新しいデータを生成し、Cloud Run ジョブによって想定される Cloud Storage 内の場所にアップロードします。
base64 /dev/urandom | head -c 100000 >input_file.txt gcloud storage cp input_file.txt gs://input-PROJECT_ID/input_file.txt
Terraform を使用して Cloud Storage バケットを作成した場合は、次のコマンドを実行してバケットの名前を取得できます。
gcloud storage buckets list gs://input*
Cloud Run ジョブの実行には数分かかる場合があります。
ジョブ実行を表示して、Cloud Run ジョブが想定どおりに実行されたことを確認します。
gcloud config set run/region us-central1 gcloud run jobs executions list --job=parallel-job
ジョブの実行が成功したことが出力に示され、
10/10
タスクが完了したことが示されます。
詳細については、イベントまたは Pub/Sub メッセージでワークフローをトリガーするをご覧ください。