Workflowsからコネクタを用いてCloud Runジョブを起動する

Workflowsからコネクタを用いてCloud Runジョブを起動する

WorkflowsからCloud Run ジョブをコネクタで起動する方法について記事にしてみました。
Clock Icon2024.08.27

概要

WorkflowsにはGoogle Cloudのリソースを使用するためのさまざまなコネクタが用意されています。
サポートされているコネクタに関しては以下に一覧の記載があります。
https://cloud.google.com/workflows/docs/reference/googleapis#list_of_supported_connectors

もちろん、Cloud Run ジョブを起動するためのコネクタ(以下)も用意されています。
googleapis.run.v1.namespaces.jobs.run

今回はこのコネクタを用いて、Cloud Run ジョブをWorkflowsから起動してみます。

そもそもコネクタとは

コネクタとはGoogle Cloudの各種リソースに対して簡単にアクセスできるように用意されたものです。
call: コネクタの形式で呼び出すことができ、各コネクタごとにさまざまなパラメータの設定が可能です。
コネクタを用いるとGoogle Cloudの各種リソースをWorkflowsから呼び出すことが容易になります。
各種設定値をYAMLまたはJSONにて記載することでリソース呼び出し時の設定を実装することができます。各コネクタごとにリファレンスも整備されていて、容易にリソース呼び出しをすることができます。
以下はCloud Storageのコネクタのサンプルリファレンスです。
https://cloud.google.com/workflows/docs/reference/googleapis/storage/Overview#storage-sample

注意点

Cloud Run関数(旧:Cloud Functions関数)等の呼び出し時に用いるHTTPリクエストとコネクタ呼び出しは異なるものです。リファレンスにも以下の通り記載があります。

注: ワークフロー コネクタによって推進される API オペレーションは、Cloud Functions や Cloud Run などの Google Cloud サービスの呼び出しと混同しないでください。これは HTTP リクエストを介して行われます。

※引用:コネクタを理解する

WorkflowsからCloud Run関数(旧:Cloud Functions関数)を起動する際に用いる命令は
call: http.getcall: http.postですがこれらはコネクタではなく Workflowsのライブラリのhttp.xxxによってHTTPリクエストが実行されます。
https://cloud.google.com/workflows/docs/http-requests?hl=ja

コネクタの場合はcall: コネクタ名となります。例えばCloud Run ジョブを起動する場合は
call: googleapis.run.v1.namespaces.jobs.run
となります。

実際にCloud Run ジョブをコネクタで起動する方法

準備:Cloud Run ジョブの作成

まずWorkflowsから起動するCloud Run ジョブを作成します。
Cloud Run ジョブの内容は簡素なもので、Workflowsから起動されると、Workflowsから渡した環境変数の値を出力するというものです。

以下のファイルを作成します。

  • deploy.sh : デプロイ用スクリプト
  • Dockerfile
  • script.sh : 環境変数出力用スクリプト
deploy.sh
gcloud run jobs deploy workflows-cloud-run-job \
--source . \
--region=asia-northeast1 \
--tasks=1 \
--cpu=1 \
--max-retries=0 \
--memory=512Mi \
--parallelism=1 \
--task-timeout=600 \
--set-env-vars "ENV_VAR=DEFAULT_VALUE"  \
--region asia-northeast1

動作確認用のため最低限のスペック・並列数で作成しています。

Dockerfile
FROM google/cloud-sdk:latest
COPY ./script.sh .
ENV ENV_VAR=DOCKERFILE_VAR
RUN chmod +x ./script.sh
CMD ["./script.sh"]
script.sh
#!/bin/bash
echo "----環境変数開始----"
echo $ENV_VAR
echo "----環境変数終了----"

上記をローカルのフォルダに作成したら、以下のようにdeploy.shをshコマンドで実行します。(gcloudコマンドをコンソールで実行しても構いません)

sh deploy.sh

実行して少し待つと、Cloud Run ジョブのコンソールにジョブが作成されています。
スクリーンショット 2024-08-27 19.59.14

準備:Workflowsの作成

Workflowsの準備をします。Workflowsの実装ですが、当然Cloud Run ジョブを起動するコネクタを用います。以下が実装です。

workflows.yaml
main:
  steps:
  - init:
      assign:
      - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
      - job_name: cloud-run-job-test
      - job_location: asia-northeast1
  - callCloudRunJobStep:
      steps:
        - cloudRunJobsCall:
            call: googleapis.run.v1.namespaces.jobs.run
            args:
                name: ${"namespaces/" + project_id + "/jobs/" + job_name}
                location: ${job_location}
                body:
                  overrides:
                    containerOverrides:
                      env:
                        - name: ENV_VAR
                          value: "Call From Workflows"
                connector_params:
                  timeout: 3600

上記の処理の流れとしては以下となります。

  1. 環境変数からプロジェクトIDを取得、ジョブ名とジョブがあるリージョンを設定します
  2. cloudRunJobsCallステップで、Cloud Runジョブを実行します。Cloud Run ジョブ起動のコネクタであるAPIエンドポイントgoogleapis.run.v1.namespaces.jobs.runを呼び出し、引数で指定したジョブを実行します。
  3. ジョブの実行時に環境変数ENV_VARを "Call From Workflows" に設定(オーバーライド)します
  4. connector_paramsを用いてタイムアウトを3600秒(1時間)に設定しています

デプロイは以下のスクリプト(コマンドで行います)

deploy.sh
gcloud workflows deploy cloud_run_jobs_test_workflow \
  --location=asia-northeast1 \
  --source=./workflows.yaml

Workflowsを実行してみる

作成したworkflowsを実行します。
スクリーンショット 2024-08-27 20.17.35

Workflowsを実行したらCloud Run ジョブを見に行きます。

スクリーンショット 2024-08-27 20.19.20
ジョブのログから、Workflowsで設定した環境変数の値Call From Workflowsが出力されていることが確認できました。無事Workflowsからコネクタを用いてCloud Run ジョブを起動することができました。

コネクタを使わない場合でWorkflowsからCloud Run ジョブを呼び出すには

一例としては、Cloud RunのREST APIを用います。
https://cloud.google.com/run/docs/reference/rest/v2/projects.locations.jobs/run

REST APIを用いてCloud Run ジョブを実行する場合は以下の実装になります(実行するのみで、環境変数のオーバーライドは行っていません)。

main:
  steps:
  - init:
      assign:
      - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
      - job_name: workflows-cloud-run-job
      - job_location: asia-northeast1
  - callCloudRunJobStep:
      steps:
        - cloudRunJobsCall:
            call: http.post
            args:
              url: ${"https://run.googleapis.com/v2/projects/" + project_id + "/locations/" + job_location + "/jobs/" + job_name + ":run"}
              auth:
                  type: OAuth2

コネクタでの実行との違いはcall: http.postでHTTPリクエストを行い、Cloud Run ジョブのREST APIのエンドポイントにPOSTしている点です。
また、http.postで呼び出しをするためCloud Run ジョブの実行時間が30分に制限されます。
※Workflowsからのhttp.xxxでのHTTPリクエストのタイムアウト上限が30分だからです。詳しくは以下の記事をご覧ください。
https://dev.classmethod.jp/articles/20240615-wf-timeout/

コネクタ呼び出しの場合、Cloud Run ジョブのタイムアウト上限は1年間となります(各サービスでタイムアウトなどの上限値は異なります)。
コネクタの使い方のリファレンスもあるので、特段の理由がなければhttpでの起動よりもコネクタでの起動の方が使い勝手は良いのではないかなと考えます。各種設定値を実装するのもコネクタの方が簡素化されるため容易です。
https://cloud.google.com/workflows/docs/reference/googleapis/run/Overview

まとめ

Cloud Run ジョブをWorkflowsからコネクタ経由で実行してみました。
WorkflowsにはCloud Run ジョブ以外にもBigQueryやCloud StorageなどさまざまなGoogle Cloudのリソースへのコネクタが用意されています。Workflowsからアクセスしたいサービスがあった時にはまずはコネクタがないかを考えてみると良いのではないかなと考えます。
それではまた。ナマステー

参考

https://cloud.google.com/workflows/docs/connectors?hl=ja

https://cloud.google.com/workflows/docs/reference/googleapis/run/v1/namespaces.jobs/run

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.