マルチコンテナ構成のCloud Run Jobsをオーバーライド実行する

# はじめに

株式会社インティメート・マージャーの板屋です。

Cloud Run Jobs、とても便利です。

https://cloud.google.com/run/docs/create-jobs?hl=ja

通常利用するWebサーバーはCloud Runに任せ、hourlyやdailyで処理するものをCloud Run Jobsに任せるなど、使い方次第ですがおおよその処理はここで完結できてしまいそうな汎用性があります。

昨年のことになりますが、Cloud Runがマルチコンテナ(サイドカー)対応されました。
Cloud Run Jobsについても、同様にマルチコンテナ対応がされました。

https://cloud.google.com/blog/ja/products/serverless/cloud-run-now-supports-multi-container-deployments

できることの幅が増えましたが、一方で機能にコンソールが追いついていないなど、絶妙に使いにくい箇所もあります。
今回は執筆時点(2024/12/16)でのオーバーライド機能について話していきます。

# 問題点

記事にするからには現状の課題があります。

:::note alert
**マルチコンテナ構成のCloud Run Jobsのオーバーライド実行は、コンソールから実行できません。**
:::

Cloud Run Jobsのコンソールには実行ボタンがあり、その中にはオーバーライドして実行するモードがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147093/aeea3d22-460e-051b-ace9-869305554e10.png)

こちらを選択するとオーバーライドする項目が出現します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147093/b0210391-fe19-e83d-67c9-3131080e8b69.png)

一見問題なさそうな見た目をしていますが、このフォームではどのコンテナに対して引数をオーバーライドするのかを選択することはできませんし、入力しても引数のオーバーライドは動作しません。環境変数も同様です。

# 解決策

APIを叩きます。

https://cloud.google.com/run/docs/reference/rest/v2/projects.locations.jobs/run

```
POST https://run.googleapis.com/v2/{name}:run
```

こちらのAPIは指定したCloud Run Jobsを起動できます。
パラメータを見ると、 `Overrides` といういかにも使えそうなパラメータがあります。これが今回の鍵です。

```
{
  "validateOnly": boolean,
  "etag": string,
  "overrides": {
    object (Overrides)
  }
}
```

`Overrides` の仕様を見に行くと、 `containerOverrides` が配列であることに気がつくでしょう。
これならば複数コンテナの指定が可能です。

```
{
  "containerOverrides": [
    {
      object (ContainerOverride)
    }
  ],
  "taskCount": integer,
  "timeout": string
}
```

`ContainerOverride` には `name` が存在しており、ここでコンテナ名を指定することができます。

```
{
  "name": string,
  "args": [
    string
  ],
  "env": [
    {
      object (EnvVar)
    }
  ],
  "clearArgs": boolean
}
```

## 実践例

これを踏まえて、 `app` と `fluentd` のコンテナがあるCloud Run Jobsを例として説明します。
(本筋と関係なさそうなパラメータは省いています)

Pythonスクリプト( `main.py` )を実行し、その際のログをfluentdで取り扱うJobです。

```multicontainer.yaml
spec:
  template:
    metadata:
      annotations:
        run.googleapis.com/container-dependencies: '{"app":["fluentd"]}'
    spec:
      template:
        spec:
          containers:
          - name: app
            image: python:3.12
            args:
              - main.py
            resources:
              limits:
                cpu: 1000m
                memory: 512Mi
          - name: fluentd
            image: fluent/fluentd:latest
            resources:
              limits:
                cpu: 500m
                memory: 256Mi
            startupProbe:
              initialDelaySeconds: 10
              timeoutSeconds: 30
              periodSeconds: 30
              failureThreshold: 3
              httpGet:
                path: /
                port: 24220
```

このCloud Run Jobsを `app` コンテナが `override.py` を引数として実行するには、以下のbodyで `POST https://run.googleapis.com/v2/{name}:run` を実行します。

```json
{
  "overrides": {
    "containerOverrides": [
      {
        "name": "python",
        "args": [
          "override.py"
        ]
      }
    ]
  }
}
```

# 応用

Cloud Run JobsはCloud Schedulerと連携する機能があります。
`トリガー` パネルの `スケジューラ トリガーを追加` から作成することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147093/f628b3c6-a57c-86d9-f6f1-14aa113982ce.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147093/b94086e4-b02c-f1e6-ee08-f8806075cc24.png)

こうして作成したCloud Schedulerですが、中身を見ると前述の `POST https://run.googleapis.com/v2/{name}:run` を定期的に実行している作りとなっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/147093/538b993f-95eb-3485-ddeb-11d46a6e09c9.png)

そうであれば当然、 **bodyにオーバーライドする内容を仕込むことができます。**

この形を取れることはかなり嬉しいです。
一つのテンプレートとしてのCloud Run Jobsを用意しておき、定期的に実行する内容をAPIでオーバーライドする構成が取れます。
用意するDocker Imageも少なくて済みますし、CI/CDの構築も楽になる箇所があると思います。

マルチコンテナ構成でなくても同様にオーバーライドして実行するようにスケジュールできるので、Cloud Run Jobsを運用する形として覚えておくと良いでしょう。

# 別解

各種Client Libraryもマルチコンテナ構成のCloud Run Jobsをオーバーライドして実行することができます。

https://cloud.google.com/python/docs/reference/run/latest/google.cloud.run_v2.services.jobs.JobsClient#google_cloud_run_v2_services_jobs_JobsClient_run_job

可能ではありますが、Jobsの用途を考えるとAPIを使う方法が現状で最も用途に合ったやり方となると思います。

# 別不正解

gcloudコマンドではマルチコンテナ構成のCloud Run Jobsをオーバーライドして実行することは**できません。**

https://cloud.google.com/sdk/gcloud/reference/run/jobs/execute

マルチコンテナ構成でなければオーバーライドできます。
構成によってはこちらも選択肢に入りそうです。

# まとめ

- マルチコンテナ構成のCloud Run Jobsをオーバーライド実行する手段は2つ
    - APIを利用すること
    - Client Libraryを利用すること
- スケジューリングも考えるとAPIを利用するのがオススメ

# さいごに

まだまだインティメート・マージャー アドベントカレンダーは続きます！

https://qiita.com/advent-calendar/2024/intimatemerger

また、インティメート・マージャーでは、新卒から中途採用まで幅広く採用募集中です！
記事を読んで弊社に興味を持ってくれた方は、下記より採用情報をチェックしていただけると幸いです。

https://recruit.intimatemerger.com/