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 が実行されるように設定することが可能

この機能の重要な用途の 1 つは、データベースなどのバッキング リソースのいずれかが制限され、多数のタスクを並列で処理できない場合に、並列タスクの数を制限することです。

  • 並列しまくったら Cloud SQL の Query Per Minutes を超過したので並列化する上限値を設定、みたいな使い方をした
  • 50 タスクを 10 並列を上限に実行させる、みたいなこともできた
  • Job : Task = 1 : N
  • 1 Task の timeout はデフォルトで 10 分。上限は 1 時間

Job Execution

  • 設定した Job の実行の単位
  • 設定した Task がすべて終了するまで継続される
  • こちらはとくに timeout の記載はない

https://medium.com/google-cloud-jp/cloud-run-jobs-c963a7143367

こまつやまこまつやま

複数 Task の実行と並列化についてもう少し詳しく

並列で実行できる Task の上限

  • 最大値は使用している CPU によって異なる
  • デフォルトのマシンスペックは 1 CPU, 512 MiB
CPU 最大並列処理数
1 100
2 50
4 25
5以上 10

https://cloud.google.com/run/docs/configuring/parallelism?hl=ja

複数 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 同様サービスアカウントに必要な権限を付与する必要あり

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

https://cloud.google.com/run/docs/execute/jobs-on-schedule?hl=ja

こまつやまこまつやま

料金体系について

  • Cloud Run ジョブ は常に CPU が割り当てられる
  • コンテナインスタンスが起動している時間に対して課金される

Cloud Run ジョブは、コンテナ インスタンスの起動期間全体に対して、最小 1 分間の CPU を常に割り当てるレートで課金されます。

  • 1 タスク = 1 インスタンスなので、課金対象の CPU 時間はタスクの処理時間の合計

https://cloud.google.com/run/pricing?hl=ja

このスクラップは2022/07/01にクローズされました