3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Intimate MergerAdvent Calendar 2024

Day 16

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

Last updated at Posted at 2024-12-15

はじめに

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

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

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

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

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

問題点

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

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

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

image.png

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

image.png

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

解決策

APIを叩きます。

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
}

実践例

これを踏まえて、 appfluentd のコンテナがある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 を実行します。

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

応用

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

image.png

image.png

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

image.png

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

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

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

別解

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

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

別不正解

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

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

まとめ

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

さいごに

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

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

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?