Closed6
Cloud Run ジョブについて調べた・試したことを雑多にまとめる
サービスの概要
- Cloud Run でバッチ処理などの長時間の処理ができる
- 従来の Cloud Run (Cloud Run サービス) と違って、ポートを開いて HTTP リクエストを受け付ける、みたいなことはできない
- 処理が完了したらジョブのコンテナは終了する必要がある
- タスク数を指定することにより、同一のコンテナの処理を並列実行することが可能
- まだプレビュー版なのでいくつかの制約がある
-
europe-west9
のみで利用可能 -
gcloud beta
コマンドでしかリソースを作成できない - 現時点 (2022/06/08) で terraform にも書き起こせない (google-beta provider の releases)
-
- 料金体系
- Cloud Run サービスと料金体系は変わらない
- Cloud Run ジョブ は常に CPU が割り当てられる
- なのでコンテナインスタンスが起動している時間に対して課金される
Cloud Run ジョブのリソースモデル
Job
- リージョンに紐付く Cloud Run ジョブのルートリソース
- 設定できる内容
- コンテナイメージ
- Task 数
- 並列数
- Task の CPU / Memory サイズ
- 環境変数
- VPC 接続
- Cloud SQL接続の設定
Task
- 実際に Job を実行するコンテナインスタンス
- 1 つの Job に対して、複数の Task が実行されるように設定することが可能
- デフォルトでは Task は可能な限り並列で処理される
- 並列で処理される Task の数を制限することも可能
この機能の重要な用途の 1 つは、データベースなどのバッキング リソースのいずれかが制限され、多数のタスクを並列で処理できない場合に、並列タスクの数を制限することです。
- 並列しまくったら Cloud SQL の Query Per Minutes を超過したので並列化する上限値を設定、みたいな使い方をした
- 50 タスクを 10 並列を上限に実行させる、みたいなこともできた
- Job : Task = 1 : N
- 1 Task の timeout はデフォルトで 10 分。上限は 1 時間
Job Execution
- 設定した Job の実行の単位
- 設定した Task がすべて終了するまで継続される
- こちらはとくに timeout の記載はない
複数 Task の実行と並列化についてもう少し詳しく
並列で実行できる Task の上限
- 最大値は使用している CPU によって異なる
- デフォルトのマシンスペックは 1 CPU, 512 MiB
CPU | 最大並列処理数 |
---|---|
1 | 100 |
2 | 50 |
4 | 25 |
5以上 | 10 |
複数 Task の実行
- 1つの Job の中で実行可能な Task の上限値は 10000
- 各 Task のコンテナインスタンスには、Task のインデックスと、Job が実行する Task の数が環境変数として渡される
-
CLOUD_RUN_TASK_INDEX
: 今行われている Task が何番目の Task なのか -
CLOUD_RUN_TASK_COUNT
: ジョブが何件の Task を実行するのか
-
- 再び図を引用
- 3 つのタスクがある右 2 つの Job のコンテナインスタンスでは
CLOUD_RUN_TASK_COUNT = 3
、1 つのタスクのみを実行する一番左のコンテナインスタンスではCLOUD_RUN_TASK_COUNT = 1
となる - また、右 2 つの Task 1、Task 2、Task 3 には
CLOUD_RUN_TASK_INDEX
がそれぞれ 0、1,2 と渡される - この 2 つの値を受け取るようにして、処理対象のデータをよしなに分けてあげるように実装していく感じ
Job の実行トリガー
gcloud コマンド
- Cloud Run Job を実行できる権限のあるアカウントで gcloud コマンドの認証を済ませている前提
$ gcloud beta run jobs execute JOB_NAME
API
- REST API があるのでそれを叩く
- 当たり前だが
ACCESS_TOKEN
は Job を実行できる権限をもたせたアカウントのものである必要がある- トークン自体は
gcloud auth print-access-token
で取得できる
- トークン自体は
curl -H "Content-Type: application/json" \
-H "Authorization: Bearer ACCESS_TOKEN" \
-X POST \
-d '' \
https://REGION-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/PROJECT-ID/jobs/JOB-NAME:run
Cloud Scheduler
- Cloud Scheduler の Job で ↑ の REST API を叩くようにする
- REST API 同様サービスアカウントに必要な権限を付与する必要あり
料金体系について
- Cloud Run ジョブ は常に CPU が割り当てられる
- コンテナインスタンスが起動している時間に対して課金される
Cloud Run ジョブは、コンテナ インスタンスの起動期間全体に対して、最小 1 分間の CPU を常に割り当てるレートで課金されます。
- 1 タスク = 1 インスタンスなので、課金対象の CPU 時間はタスクの処理時間の合計
このスクラップは2022/07/01にクローズされました