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 環境でアプリケーションを開発するをご覧ください。

Console

  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. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows APIs.

    Enable the APIs

  5. Create a service account:

    1. In the Google Cloud console, go to the Create service account page.

      Go to Create service account
    2. Select your project.
    3. 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.

    4. Click Create and continue.
    5. Grant the following roles to the service account: Cloud Run Admin, Eventarc Event Receiver, Logs Writer, 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.

    6. Click Continue.
    7. Click Done to finish creating the service account.

  6. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  7. Make sure that billing is enabled for your Google Cloud project.

  8. Enable the Artifact Registry, Cloud Build, Cloud Run, Cloud Storage, Eventarc, and Workflows APIs.

    Enable the APIs

  9. Create a service account:

    1. In the Google Cloud console, go to the Create service account page.

      Go to Create service account
    2. Select your project.
    3. 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.

    4. Click Create and continue.
    5. Grant the following roles to the service account: Cloud Run Admin, Eventarc Event Receiver, Logs Writer, 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.

    6. Click Continue.
    7. Click Done to finish creating the service account.

  10. Cloud Storage からの直接イベントのトリガーを作成する前に、Cloud Storage サービス エージェントに 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)をサービス エージェントに付与します。それ以外の場合、このロールはデフォルトで付与されます。
    1. Google Cloud コンソールの [IAM] ページに移動します。

      [IAM] に移動

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

    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.

  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, and 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 からの直接イベントのトリガーを作成する前に、Cloud Storage サービス エージェントに Pub/Sub パブリッシャーのロールroles/pubsub.publisher)を付与します。

    SERVICE_ACCOUNT="$(gcloud storage service-agent --project=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)をサービス エージェントに付与します。それ以外の場合、このロールはデフォルトで付与されます。
    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, and 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 サービス エージェントに 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)をサービス エージェントに付与します。それ以外の場合、このロールはデフォルトで付与されます。
    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 バケットを作成します。

    Console

    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 標準リポジトリを作成します。

    Console

    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 ジョブを作成します。

    Console

    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. デフォルトの Cloud Run リージョンを設定します。

      gcloud config set run/region us-central1
    2. 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"

    # 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. [デプロイ] をクリックします。

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 トリガーを作成します。

Console

  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
    gcloud storage cp input_file.txt gs://input-PROJECT_ID/input_file.txt

    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

次のステップ