はじめに
株式会社インティメート・マージャーの板屋です。
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のコンソールには実行ボタンがあり、その中にはオーバーライドして実行するモードがあります。
こちらを選択するとオーバーライドする項目が出現します。
一見問題なさそうな見た目をしていますが、このフォームではどのコンテナに対して引数をオーバーライドするのかを選択することはできませんし、入力しても引数のオーバーライドは動作しません。環境変数も同様です。
解決策
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
}
実践例
これを踏まえて、 app
と fluentd
のコンテナがあるCloud Run Jobsを例として説明します。
(本筋と関係なさそうなパラメータは省いています)
Pythonスクリプト( main.py
)を実行し、その際のログをfluentdで取り扱うJobです。
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と連携する機能があります。
トリガー
パネルの スケジューラ トリガーを追加
から作成することができます。
こうして作成したCloud Schedulerですが、中身を見ると前述の POST https://run.googleapis.com/v2/{name}:run
を定期的に実行している作りとなっています。
そうであれば当然、 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を利用するのがオススメ
さいごに
まだまだインティメート・マージャー アドベントカレンダーは続きます!
また、インティメート・マージャーでは、新卒から中途採用まで幅広く採用募集中です!
記事を読んで弊社に興味を持ってくれた方は、下記より採用情報をチェックしていただけると幸いです。