Workflows を使用して Cloud Run ジョブを実行する


Workflows を使用すると、ワークフローの一部として Cloud Run ジョブを実行し、より複雑なデータ処理を行う、または既存のジョブのシステムをオーケストレートします。

このチュートリアルでは、Workflows を使用して、Cloud Storage のイベントに応答して環境変数としてジョブに渡されるデータを処理する Cloud Run ジョブを実行する方法について説明します。

イベントデータは、Cloud Storage バケットに保存することもできます。これにより、顧客管理の暗号鍵を使用してデータを暗号化できます。詳細については、Cloud Storage に保存されているイベントデータを処理する Cloud Run ジョブを実行するをご覧ください。

目標

このチュートリアルの内容は次のとおりです。

  1. Cloud Storage バケット内のデータファイルを処理する Cloud Run ジョブを作成します。
  2. 次の処理を行うワークフローをデプロイします。
    1. 引数として Cloud Storage イベントを受け入れます。
    2. イベントで指定された Cloud Storage バケットが Cloud Run ジョブで使用されるバケットと同じかどうかを確認します。
    3. その場合は、Cloud Run Admin API コネクタを使用して Cloud Run ジョブを実行します。
  3. Cloud Storage バケットに影響するイベントに応答してワークフローを実行する Eventarc トリガーを作成します。
  4. Cloud Storage バケットの入力データファイルを更新して、ワークフローをトリガーします。

費用

このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

始める前に

組織で定義されているセキュリティの制約により、次の手順を完了できない場合があります。トラブルシューティング情報については、制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。

コンソール

  1. 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.
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Artifact Registry、Cloud Build、Cloud Run、Cloud Storage、Eventarc、Workflows API を有効にします。

    API を有効にする

  5. サービス アカウントを作成します。

    1. Google Cloud コンソールで [サービス アカウントの作成] ページに移動します。

      [サービス アカウントの作成] に移動
    2. プロジェクトを選択します。
    3. [サービス アカウント名] フィールドに名前を入力します。Google Cloud コンソールでは、この名前に基づいて [サービス アカウント ID] フィールドに値が設定されます。

      [サービス アカウントの説明] フィールドに説明を入力します。例: Service account for quickstart

    4. [作成して続行] をクリックします。
    5. サービス アカウントに次のロールを付与します: Cloud Run Admin, Eventarc Event Receiver, Logs Writer, Workflows Invoker.

      ロールを付与するには、[ロールを選択] リストを見つけてロールを選択します。

      追加のロールを付与するには、 [別のロールを追加] をクリックして各ロールを追加します。

    6. [続行] をクリックします。
    7. [完了] をクリックして、サービス アカウントの作成を完了します。

  6. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  7. Google Cloud プロジェクトで課金が有効になっていることを確認します

  8. Artifact Registry、Cloud Build、Cloud Run、Cloud Storage、Eventarc、Workflows API を有効にします。

    API を有効にする

  9. サービス アカウントを作成します。

    1. Google Cloud コンソールで [サービス アカウントの作成] ページに移動します。

      [サービス アカウントの作成] に移動
    2. プロジェクトを選択します。
    3. [サービス アカウント名] フィールドに名前を入力します。Google Cloud コンソールでは、この名前に基づいて [サービス アカウント ID] フィールドに値が設定されます。

      [サービス アカウントの説明] フィールドに説明を入力します。例: Service account for quickstart

    4. [作成して続行] をクリックします。
    5. サービス アカウントに次のロールを付与します: Cloud Run Admin, Eventarc Event Receiver, Logs Writer, Workflows Invoker.

      ロールを付与するには、[ロールを選択] リストを見つけてロールを選択します。

      追加のロールを付与するには、 [別のロールを追加] をクリックして各ロールを追加します。

    6. [続行] をクリックします。
    7. [完了] をクリックして、サービス アカウントの作成を完了します。

  10. Cloud Storage からの直接イベントのトリガーを作成する前に、Google Cloud のサービス エージェン(Google 管理のサービス アカウント)に Cloud Pub/Sub パブリッシャーのロールroles/pubsub.publisher)を付与します。
    1. Google Cloud コンソールの [IAM] ページに移動します。

      [IAM] に移動

    2. [Google 提供のロール付与を含みます] チェックボックスをオンにします。
    3. [プリンシパル] 列で、service-PROJECT_NUMBER@gs-project-accounts.iam.gserviceaccount.com 形式の Cloud Storage サービス エージェントを探します。次に、対応する行の [プリンシパルを編集します] をクリックします。
    4. [ロールを追加] または [別のロールを追加] をクリックします。
    5. [ロールを選択] リストで [Pub/Sub パブリッシャー] をフィルタし、ロールを選択します。
    6. [保存] をクリックします。
  11. 2021 年 4 月 8 日以前に、認証済みの Pub/Sub push リクエストをサポートするために Cloud Pub/Sub サービス エージェントを有効にした場合は、サービス アカウント トークン作成者のロールroles/iam.serviceAccountTokenCreator)を Google マネージド サービス アカウントに付与します。それ以外の場合、このロールはデフォルトで付与されます。
    1. Google Cloud コンソールの [IAM] ページに移動します。

      [IAM] に移動

    2. [Google 提供のロール付与を含みます] チェックボックスをオンにします。
    3. [名前] 列で、Cloud Pub/Sub サービス アカウントを見つけて、対応する行にある [プリンシパルを編集します] をクリックします。
    4. [ロールを追加] または [別のロールを追加] をクリックします。
    5. [ロールを選択] リストで [サービス アカウント トークン作成者] をフィルタし、ロールを選択します。
    6. [保存] をクリックします。
  12. Google Cloud コンソールで、「Cloud Shell をアクティブにする」をクリックします。

    Cloud Shell をアクティブにする

    Google Cloud コンソールの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

  13. Cloud Shell は、このチュートリアルで疑似乱数を生成する /dev/urandom コマンドをサポートします。

gcloud

  1. gcloud CLI がすでに設定されているオンライン ターミナルを使用するには、Cloud Shell をアクティブにします。

    このページの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。セッションが初期化されるまで数秒かかることがあります。

    Cloud Shell は、このチュートリアルで疑似乱数を生成する /dev/urandom コマンドをサポートしています。

  2. Google Cloud プロジェクトを作成または選択します。
    • Google Cloud プロジェクトを作成する

      gcloud projects create PROJECT_ID
    • 作成した Google Cloud プロジェクトを選択します。

      gcloud config set project PROJECT_ID
  3. Google Cloud プロジェクトで課金が有効になっていることを確認します
  4. Artifact Registry、Cloud Build、Cloud Run、Cloud Storage、Eventarc、Workflows API を有効にします。
    gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        eventarc.googleapis.com \
        run.googleapis.com \
        storage.googleapis.com \
        workflows.googleapis.com
  5. 他の Google Cloud サービスでの認証に使用するワークフローのサービス アカウントを作成し、適切なロールを付与します。
    1. サービス アカウントを作成します。
      gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
      

      SERVICE_ACCOUNT_NAME をサービス アカウントの名前に置き換えます。

    2. 前のステップで作成したユーザー管理のサービス アカウントにロールを付与します。次の IAM ロールごとに次のコマンドを 1 回実行します。また、単一のコマンドで --role フラグを複数回使用することもできます。
      • roles/eventarc.eventReceiver: イベントを受信します
      • roles/logging.logWriter: ログを書き込みます
      • roles/run.admin: Cloud Run ジョブを実行します
      • roles/workflows.invoker: ワークフローを呼び出します
      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \
          --role=ROLE
      

      以下を置き換えます。

      • PROJECT_ID: サービス アカウントを作成したプロジェクト ID
      • ROLE: ユーザー管理のサービス アカウントに付与するロール
  6. Cloud Storage からの直接イベントのトリガーを作成する前に、Google Cloud のサービス エージェン(Google 管理のサービス アカウント)に Cloud Pub/Sub パブリッシャーのロールroles/pubsub.publisher)を付与します。

    SERVICE_ACCOUNT="$(gsutil kms serviceaccount -p PROJECT_ID)"
    
    gcloud projects add-iam-policy-binding PROJECT_ID \
        --member="serviceAccount:${SERVICE_ACCOUNT}" \
        --role='roles/pubsub.publisher'
    
  7. 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
  8. PROJECT_NUMBER は、実際の Google Cloud プロジェクトの番号に置き換えます。プロジェクト番号は、Google Cloud コンソールの [ようこそ] ページで確認できます。また、次のコマンドで確認することもできます。

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'

Terraform

  1. gcloud CLI がすでに設定されているオンライン ターミナルを使用するには、Cloud Shell をアクティブにします。

    このページの下部で Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。セッションが初期化されるまで数秒かかることがあります。

    Cloud Shell は、このチュートリアルで疑似乱数を生成する /dev/urandom コマンドをサポートしています。

  2. Google Cloud プロジェクトを作成または選択します。
    • Google Cloud プロジェクトを作成する

      gcloud projects create PROJECT_ID
    • 作成した Google Cloud プロジェクトを選択します。

      gcloud config set project PROJECT_ID
  3. Google Cloud プロジェクトで課金が有効になっていることを確認します
  4. Artifact Registry、Cloud Build、Cloud Run、Cloud Storage、Eventarc、Workflows API を有効にします。
    gcloud services enable artifactregistry.googleapis.com \
        cloudbuild.googleapis.com \
        eventarc.googleapis.com \
        run.googleapis.com \
        storage.googleapis.com \
        workflows.googleapis.com
  5. 他の Google Cloud サービスでの認証に使用するワークフローのサービス アカウントを作成し、適切なロールを付与します。また、Cloud Storage からの直接イベントをサポートするために、Cloud Storage サービス エージェント(Google 管理のサービス アカウント)に Pub/Sub パブリッシャーのロール(roles/pubsub.publisher)を付与します。

    次のサンプルに示すように main.tf ファイルを変更します。詳細については、Terraform の Google プロバイダのドキュメントをご覧ください。

    Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。

    一般的な Terraform ワークフローでは、プラン全体を一度に適用します。ですが、このチュートリアルでは、特定のリソースをターゲットにできます。次に例を示します。

    terraform apply -target="google_service_account.workflows"

    # Used to retrieve project information later
    data "google_project" "project" {}
    
    # Create a dedicated service account
    resource "google_service_account" "workflows" {
      account_id   = "workflows-run-job-sa"
      display_name = "Workflows Cloud Run Job Service Account"
    }
    
    # Grant permission to receive Eventarc events
    resource "google_project_iam_member" "eventreceiver" {
      project = data.google_project.project.id
      role    = "roles/eventarc.eventReceiver"
      member  = "serviceAccount:${google_service_account.workflows.email}"
    }
    
    # Grant permission to write logs
    resource "google_project_iam_member" "logwriter" {
      project = data.google_project.project.id
      role    = "roles/logging.logWriter"
      member  = "serviceAccount:${google_service_account.workflows.email}"
    }
    
    # Grant permission to execute Cloud Run jobs
    resource "google_project_iam_member" "runadmin" {
      project = data.google_project.project.id
      role    = "roles/run.admin"
      member  = "serviceAccount:${google_service_account.workflows.email}"
    }
    
    # Grant permission to invoke workflows
    resource "google_project_iam_member" "workflowsinvoker" {
      project = data.google_project.project.id
      role    = "roles/workflows.invoker"
      member  = "serviceAccount:${google_service_account.workflows.email}"
    }
    
    # Grant the Cloud Storage service agent permission to publish Pub/Sub topics
    data "google_storage_project_service_account" "gcs_account" {}
    resource "google_project_iam_member" "pubsubpublisher" {
      project = data.google_project.project.id
      role    = "roles/pubsub.publisher"
      member  = "serviceAccount:${data.google_storage_project_service_account.gcs_account.email_address}"
    }
    
  6. 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
  7. PROJECT_NUMBER は、実際の Google Cloud プロジェクトの番号に置き換えます。プロジェクト番号は、Google Cloud コンソールの [ようこそ] ページで確認できます。また、次のコマンドで確認することもできます。

    gcloud projects describe PROJECT_ID --format='value(projectNumber)'

Cloud Run ジョブを作成する

このチュートリアルでは、GitHub のサンプル Cloud Run ジョブを使用します。このジョブは、Cloud Storage の入力ファイルからデータを読み取り、ファイル内の各行に対して任意の処理を実行します。

  1. ローカルマシンにサンプルアプリのリポジトリのクローンを作成して、サンプルコードを取得します。

    git clone https://github.com/GoogleCloudPlatform/jobs-demos.git
    

    または、サンプルを ZIP ファイルとしてダウンロードし、ファイルを抽出することもできます。

  2. サンプルコードが入っているディレクトリに移動します。

    cd jobs-demos/parallel-processing
    
  3. 書き込みが可能でイベントをトリガーできる入力ファイルを保存するための Cloud Storage バケットを作成します。

    コンソール

    1. Google Cloud コンソールで、Cloud Storage の [バケット] ページに移動します。

      [バケット] に移動

    2. add [作成] をクリックします。
    3. [バケットの作成] ページで、バケットの名前を入力します。
      input-PROJECT_ID
      PROJECT_ID は、Google Cloud プロジェクトの ID に置き換えます。
    4. 他の値はデフォルトのままにします。
    5. [作成] をクリックします。

    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"

    # Cloud Storage bucket names must be globally unique
    resource "random_id" "bucket_name_suffix" {
      byte_length = 4
    }
    
    # Create a Cloud Storage bucket
    resource "google_storage_bucket" "default" {
      name                        = "input-${data.google_project.project.name}-${random_id.bucket_name_suffix.hex}"
      location                    = "us-central1"
      storage_class               = "STANDARD"
      force_destroy               = false
      uniform_bucket_level_access = true
    }
  4. コンテナ イメージを保存できる Artifact Registry 標準リポジトリを作成します。

    コンソール

    1. Google Cloud コンソールで、Artifact Registry の [リポジトリ] ページに移動します。

      [リポジトリ] に移動

    2. [リポジトリを作成] をクリックします。

    3. リポジトリの名前を入力します(例: my-repo)。プロジェクト内のリポジトリのロケーションごとに、リポジトリ名は一意でなければなりません。

    4. デフォルトの形式(Docker)のままにします。

    5. デフォルト モード(Standard)のままにします。

    6. リージョンに、[us-central1(アイオワ)] を選択します。

    7. その他すべてのデフォルトはそのままにします。

    8. [作成] をクリックします。

    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"

    # Create an Artifact Registry repository
    resource "google_artifact_registry_repository" "default" {
      location      = "us-central1"
      repository_id = "my-repo"
      format        = "docker"
    }
  5. デフォルトの 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 リポジトリの名前に置き換えます。

    ビルドが完了するまで数分かかることがあります。

  6. コンテナ イメージをデプロイする Cloud Run ジョブを作成します。

    コンソール

    1. Google Cloud コンソールで [Cloud Run] ページに移動します。

      [Cloud Run] に移動

    2. [ジョブを作成] をクリックして、[ジョブを作成] フォームを表示します。

      1. フォームで、Artifact Registry コンテナ イメージの URL として us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/parallel-job:latest を選択します。
      2. (省略可)ジョブ名に「parallel-job」と入力します。
      3. (省略可)リージョンに、[us-central1(アイオワ)] を選択します。
      4. ジョブで実行するタスクの数として、「10」と入力します。ジョブが成功するには、すべてのタスクが成功する必要があります。デフォルトでは、タスクは並行して実行されます。
    3. [コンテナ、変数とシークレット、接続、セキュリティ] セクションを開き、次の設定を除き、すべてのデフォルトのままにします。

      1. [全般] タブをクリックします。

        1. コンテナ コマンドに「python」と入力します。
        2. コンテナ引数に「process.py」と入力します。
      2. [変数とシークレット] タブをクリックします。

        1. [変数を追加] をクリックし、名前に「INPUT_BUCKET」、値に「input-PROJECT_ID」と入力します。
        2. [変数を追加] をクリックし、名前に「INPUT_FILE」、値に「input_file.txt」と入力します。
    4. ジョブを作成するには、[作成] をクリックします。

    gcloud

    1. 次のコマンドを実行します。

      gcloud run jobs create parallel-job \
          --image us-central1-docker.pkg.dev/PROJECT_ID/REPOSITORY/parallel-job \
          --command python \
          --args process.py \
          --tasks 10 \
          --set-env-vars=INPUT_BUCKET=input-PROJECT_ID,INPUT_FILE=input_file.txt

      ジョブの作成時に使用可能なオプションの一覧については、gcloud run jobs create コマンドライン ドキュメントをご覧ください。

    2. ジョブが作成されると、成功したことを示すメッセージが表示されます。

    Terraform

    Cloud Run ジョブを作成するには、google_cloud_run_v2_job リソースを使用して、次のサンプルに示すように main.tf ファイルを変更します。

    一般的な Terraform ワークフローでは、プラン全体を一度に適用します。ですが、このチュートリアルでは、特定のリソースをターゲットにできます。次に例を示します。

    terraform apply -target="google_cloud_run_v2_job.default"

    # Create a Cloud Run job
    resource "google_cloud_run_v2_job" "default" {
      name     = "parallel-job"
      location = "us-central1"
    
      template {
        task_count = 10
        template {
          containers {
            image   = "us-central1-docker.pkg.dev/${data.google_project.project.name}/${google_artifact_registry_repository.default.repository_id}/parallel-job:latest"
            command = ["python"]
            args    = ["process.py"]
            env {
              name  = "INPUT_BUCKET"
              value = google_storage_bucket.default.name
            }
            env {
              name  = "INPUT_FILE"
              value = "input_file.txt"
            }
          }
        }
      }
    }

Cloud Run ジョブを実行するワークフローをデプロイする

作成した Cloud Run ジョブを実行するワークフローを定義してデプロイします。ワークフロー定義は、ワークフロー構文を使用して説明した一連のステップで構成されています。

Console

  1. Google Cloud コンソールの [ワークフロー] ページに移動します。

    [ワークフロー] に移動

  2. [ 作成] をクリックします。

  3. 新しいワークフローの名前を入力します(例: cloud-run-job-workflow)。

  4. リージョンに、[us-central1(アイオワ)] を選択します。

  5. [サービス アカウント] フィールドで、先ほど作成したサービス アカウントを選択します。

    サービス アカウントは、ワークフローの ID として機能します。ワークフローで Cloud Run ジョブを実行できるように、サービス アカウントに Cloud Run 管理者のロールがすでに付与されている必要があります。

  6. [次へ] をクリックします。

  7. ワークフロー エディタで、次のワークフローの定義を入力します。

    main:
        params: [event]
        steps:
            - init:
                assign:
                    - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                    - event_bucket: ${event.data.bucket}
                    - event_file: ${event.data.name}
                    - target_bucket: ${"input-" + project_id}
                    - job_name: parallel-job
                    - job_location: us-central1
            - check_input_file:
                switch:
                    - condition: ${event_bucket == target_bucket}
                      next: run_job
                    - condition: true
                      next: end
            - run_job:
                call: googleapis.run.v1.namespaces.jobs.run
                args:
                    name: ${"namespaces/" + project_id + "/jobs/" + job_name}
                    location: ${job_location}
                    body:
                        overrides:
                            containerOverrides:
                                env:
                                    - name: INPUT_BUCKET
                                      value: ${event_bucket}
                                    - name: INPUT_FILE
                                      value: ${event_file}
                result: job_execution
            - finish:
                return: ${job_execution}
  8. [Deploy] をクリックします。

gcloud

  1. ワークフローのソースコード ファイルを作成します。

    touch cloud-run-job-workflow.yaml
    
  2. 次のワークフロー定義をソースコード ファイルにコピーします。

    main:
        params: [event]
        steps:
            - init:
                assign:
                    - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                    - event_bucket: ${event.data.bucket}
                    - event_file: ${event.data.name}
                    - target_bucket: ${"input-" + project_id}
                    - job_name: parallel-job
                    - job_location: us-central1
            - check_input_file:
                switch:
                    - condition: ${event_bucket == target_bucket}
                      next: run_job
                    - condition: true
                      next: end
            - run_job:
                call: googleapis.run.v1.namespaces.jobs.run
                args:
                    name: ${"namespaces/" + project_id + "/jobs/" + job_name}
                    location: ${job_location}
                    body:
                        overrides:
                            containerOverrides:
                                env:
                                    - name: INPUT_BUCKET
                                      value: ${event_bucket}
                                    - name: INPUT_FILE
                                      value: ${event_file}
                result: job_execution
            - finish:
                return: ${job_execution}
  3. 次のコマンドを入力してワークフローをデプロイします。

    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"

# Create a workflow
resource "google_workflows_workflow" "default" {
  name        = "cloud-run-job-workflow"
  region      = "us-central1"
  description = "Workflow that routes a Cloud Storage event and executes a Cloud Run job"

  # Note that $$ is needed for Terraform
  source_contents = <<EOF
  main:
      params: [event]
      steps:
          - init:
              assign:
                  - project_id: $${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                  - event_bucket: $${event.data.bucket}
                  - event_file: $${event.data.name}
                  - target_bucket: "${google_storage_bucket.default.name}"
                  - job_name: parallel-job
                  - job_location: us-central1
          - check_input_file:
              switch:
                  - condition: $${event_bucket == target_bucket}
                    next: run_job
                  - condition: true
                    next: end
          - run_job:
              call: googleapis.run.v1.namespaces.jobs.run
              args:
                  name: $${"namespaces/" + project_id + "/jobs/" + job_name}
                  location: $${job_location}
                  body:
                      overrides:
                          containerOverrides:
                              env:
                                  - name: INPUT_BUCKET
                                    value: $${event_bucket}
                                  - name: INPUT_FILE
                                    value: $${event_file}
              result: job_execution
          - finish:
              return: $${job_execution}
  EOF
}

ワークフローは、次のことを行います。

  1. init ステップ - Cloud Storage イベントを引数として受け取り、必要な変数を設定します。

  2. check_input_file ステップ - イベントで指定された Cloud Storage バケットが、Cloud Run ジョブで使用されるバケットかどうかを確認します。

    • 「はい」の場合、ワークフローは run_job ステップに進みます。
    • 「いいえ」の場合、ワークフローは終了し、それ以上の処理を停止します。
  3. run_job ステップ - Cloud Run Admin API コネクタの googleapis.run.v1.namespaces.jobs.run メソッドを使用してジョブを実行します。Cloud Storage のバケット名とデータファイル名は、ワークフローからジョブにオーバーライド変数として渡されます。

  4. finish ステップ - ワークフローの結果としてジョブの実行に関する情報を返します。

ワークフローの Eventarc トリガーを作成する

入力データファイルが更新されるたびに自動的にワークフローを実行し、次に Cloud Run ジョブを実行するには、入力データファイルを含むバケットの Cloud Storage イベントに応答する Eventarc トリガーを作成します。

コンソール

  1. Google Cloud コンソールの [ワークフロー] ページに移動します。

    [ワークフロー] に移動

  2. ワークフローの名前(cloud-run-job-workflow など)をクリックします。

  3. [ワークフローの詳細] ページで [ 編集] をクリックします。

  4. [ワークフローの編集] ページの [トリガー] セクションで、[新しいトリガーを追加] > [Eventarc] の順にクリックします。

    [Eventarc トリガー] ペインが開きます。

  5. [トリガー名] フィールドに、トリガーの名前を入力します(例: cloud-run-job-workflow-trigger)。

  6. [イベント プロバイダ] リストで、[Cloud Storage] を選択します。

  7. [イベント] リストから [google.cloud.storage.object.v1.finalized] を選択します。

  8. [バケット] フィールドで、入力データファイルを含むバケットを選択します。バケット名の形式は input-PROJECT_ID です。

  9. [サービス アカウント] フィールドで、先ほど作成したサービス アカウントを選択します。

    サービス アカウントがトリガーの ID として機能します。サービス アカウントには次のロールがすでに付与されている必要があります。

    • Eventarc イベント受信者: イベントを受信します
    • Workflows 起動元: Workflows を実行します
  10. [トリガーを保存] をクリックします。

    Eventarc トリガーは、[ワークフローの編集] ページの [トリガー] セクションに表示されます。

  11. [次へ] をクリックします。

  12. [デプロイ] をクリックします。

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 プロジェクトの ID
  • SERVICE_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"

# Create an Eventarc trigger that routes Cloud Storage events to Workflows
resource "google_eventarc_trigger" "default" {
  name     = "cloud-run-job-trigger"
  location = google_workflows_workflow.default.region

  # Capture objects changed in the bucket
  matching_criteria {
    attribute = "type"
    value     = "google.cloud.storage.object.v1.finalized"
  }
  matching_criteria {
    attribute = "bucket"
    value     = google_storage_bucket.default.name
  }

  # Send events to Workflows
  destination {
    workflow = google_workflows_workflow.default.id
  }

  service_account = google_service_account.workflows.email

}

入力データファイルを含む Cloud Storage バケットでファイルがアップロードまたは上書きされるたびに、ワークフローは対応する Cloud Storage イベントを引数として実行されます。

ワークフローをトリガーする

Cloud Storage の入力データファイルを更新して、エンドツーエンドのシステムをテストします。

  1. 入力ファイルの新しいデータを生成し、Cloud Run ジョブによって想定される Cloud Storage 内の場所にアップロードします。

    base64 /dev/urandom | head -c 100000 >input_file.txt
    gsutil cp input_file.txt gs://BUCKET_NAME/input_file.txt
    

    BUCKET_NAME は Cloud Storage バケットの名前で置き換えてください。

    Terraform を使用して Cloud Storage バケットを作成した場合は、次のコマンドを実行してバケットの名前を取得できます。

    gcloud storage buckets list gs://input*
    

    Cloud Run ジョブの実行には数分かかる場合があります。

  2. ジョブ実行を表示して、Cloud Run ジョブが想定どおりに実行されたことを確認します。

    gcloud config set run/region us-central1
    gcloud run jobs executions list --job=parallel-job
    

    ジョブの実行が成功したことが出力に示され、10/10 タスクが完了したことが示されます。

詳細については、イベントまたは Pub/Sub メッセージでワークフローをトリガーするをご覧ください。

クリーンアップ

このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルで変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。

プロジェクトの削除

課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。

プロジェクトを削除するには:

  1. In the Google Cloud console, go to the Manage resources page.

    Go to Manage resources

  2. In the project list, select the project that you want to delete, and then click Delete.
  3. In the dialog, type the project ID, and then click Shut down to delete the project.

チュートリアル リソースの削除

このチュートリアルで作成したリソースを削除します。

  1. Eventarc トリガーを削除します。

    gcloud eventarc triggers delete cloud-run-job-workflow-trigger --location=us
    
  2. ワークフローを削除します。

    gcloud workflows delete cloud-run-job-workflow --location=us-central1
    
  3. Cloud Run ジョブを削除します。

    gcloud run jobs delete parallel-job
    
  4. 入力データ用に作成された Cloud Storage バケットを削除します。

    gcloud storage rm --recursive gs://input-PROJECT_ID/
    
  5. Artifact Registry リポジトリを削除します。

    gcloud artifacts repositories delete REPOSITORY --location=us-central1
    

次のステップ