Workflows で Connector を使って Cloud Run を実行する

# 記事の背景
Workflows で 標準ライブラリ関数 (HTTPリクエスト) Cloud Run を実装した記事はよく見かけたのですが、Connector で実装した記事があまりなかったので書いてみました

前提：
- Steps 構文の記述の仕方など基本的な Workflows のYAMLファイルの構文を理解している
- Cloud Run Jobs の使い方をある程度理解している



Workflows では Calls 構文を使用して Cloud Functions や Cloud Run などの他のサービスを呼び出すことができます。呼び出し方には次の３つがあります([Google Cloud Workflows - Calls](https://cloud.google.com/workflows/docs/reference/syntax/calls)参照)。

1. Connectors を使った呼び出し
2. HTTP リクエストによる呼び出し
3. Subworkflows を使った呼び出し

本記事では、「1.Connectors を使った呼び出し」について取り上げます。

# Workflows で Connectors を使って Cloud Run Jobs を実行する
先ほど上記の３つの呼び出し方法で列記した「2. HTTP リクエストによる呼び出し」が　Workflows の　Calls 構文でよく使われます。しかし、 この方法は、Cloud Run Service では使用できますが、 Cloud Run Jobs ではこの呼び出し方法は使用できません。

ここで、本記事では Cloud Run Jobs を Workflows で実行したい場合について取り上げます。

:::note warn
注意
Cloud Run には 「service」と「Jobs」の２つの種類があります。本記事では、**Cloud Run Jobs**について取り上げます
:::

## Cloud Run Jobs を Calls 構文で使用したい場合は Connectors を使う
### Connectors とは
Connectors とは 他の Google Cloud APIs と接続し、 Workflow の中で他のGoogle Cloud サービスを使用することができる方法です。
> Connectors can be used to connect to other Google Cloud APIs within a workflow, and to integrate your workflows with those products, allowing you to perform operations from other Google Cloud services.

[Workflows における Connectors の使い方の公式ドキュメント](https://cloud.google.com/workflows/docs/reference/googleapis)(Cloud Run 以外にもWorkflows 上で Connectors を使って呼び出せる Google Cloud サービスの一覧が記載されています)

### ワークフロー(YAML)の記述例
以下の例は、 作成した Cloud Run jobs 「cloud-run-testjob」 を Cloud Run Jobs に設定している環境変数 TARGET_NAME に target_name に指定している３つのリストを設定して並列実行するワークフローの記述の例です。

```YAML
main:
  steps:
  - init:
      assign:
        - project_id: ${sys.get_env("GOOGLE_CLOUD_PROJECT_NUMBER")}
        - job_name: cloud-run-testjob
        - job_location: asia-northeast1
        - target_name: ["huga", "hoge", "hihi"]

    # shard_nums のリストをfor文で環境変数に引き渡して並列実行するステップ
  - step_name:
      parallel:
        for:
          value: run_target
          in: ${target_name}
          steps:
            - parallel_job_name:
                call: googleapis.run.v1.namespaces.jobs.run
                args:
                    name: ${"namespaces/" + project_id + "/jobs/" + job_name}
                    location: ${job_location}
                    connector_params:
                        timeout: 7200
                    body:
                        overrides:
                            # Cloud Run で設定している環境変数に任意の値を引き渡す
                            containerOverrides:
                                env:
                                    - name: TARGET_NAME # 環境変数名
                                      value: ${run_target} # 環境変数の設定値


  - finish_output:
        return: "This workflow has been successfully completed."

```
### Cloud Run Jobs を Connector を使用してCallで呼び出す
call に googleapis.run.v1.namespaces.jobs.run を指定すれば Workflow上で Cloud Run Jobs を実行することができます
```YAML
Steps:
    - parallel_job_name:
        call: googleapis.run.v1.namespaces.jobs.run
        args:
            name: ${"namespaces/" + project_id + "/jobs/" + job_name}
            location: ${job_location}
```
### Cloud Run Jobs の実行時間が1800秒以上かかる場合
Cloud Run Jobs 自体の設定でタイムアウトを指定していても、 実行時間が1800秒以上を要する場合はWorkflows 上で timeout のフィールドでタイムアウト時間を明示し直す必要があります。
```YAML
steps:
- parallel_job_name:
    call: googleapis.run.v1.namespaces.jobs.run
    args:
        name: ${"namespaces/" + project_id + "/jobs/" + job_name}
        location: ${job_location}
        connector_params:
            timeout: 7200
```
### Cloud Run Jobs に設定した環境変数を Workflow 上で引き渡す
Workflow で Cloud Run を実行する時、Cloud Run で作成した環境変数、その他のパラメータ指定を指定し直して実行することができます。

```YAML
steps:
- parallel_job_name:
    call: googleapis.run.v1.namespaces.jobs.run
    args:
        name: ${"namespaces/" + project_id + "/jobs/" + job_name}
        location: ${job_location}
        connector_params:
            timeout: 7200
        body:
            overrides:
                # Cloud Run で設定している環境変数に任意の値を引き渡す
                containerOverrides:
                    env:
                        - name: TARGET_NAME # 環境変数名
                          value: ${run_target} # 環境変数の設定値

```

## Workflows で Cloud Run Jobs を実行する時の落とし穴
最後に個人的にハマったところなので、列記しておきます(公式ドキュメントにはきちんと書かれておりました）。

:::note alert
1. Workflows における Cloud Run の実行のタイムアウトはデフォルトで1800秒とされている
1. Cloud Run Jobs の設定項目でtimeoutを1800秒以上に設定していても、Workflows ではCloud Run のタイムアウトは無視され、Workflows 上で Cloud Run 実行から1800秒経過した場合、Workflows上ではタイムアウトエラーとして例外処理が発生する
:::
[Workflows における Cloud Run のデフォルトのタイムアウトについて](https://cloud.google.com/workflows/docs/reference/googleapis/run/v1/namespaces.jobs/run)