Cloud Runジョブでバッチジョブをサーバーレスに定期実行する!

GCP

Cloud Runジョブとは

コンテナを立ち上げ後定型処理を行い結果をアップロードして終了するといったバッチ処理のサーバレス化にぴったりなCloud Runのデプロイ形態。

サポートする環境

Cloud RunでサポートするDockerイメージはLinuxのみ。 Windows環境が必要な場合はGKEのWindowsノードがある。 コード実行環境であるFunctionsとは違ってコンテナのため 任意のバイナリをコピーしたり言語をインストールして実行できる。

Cloud RunサービスとJobの違い

Cloud RunサービスはポートをListenし起動する点が大きく異なる。 Cloud Runジョブは第二世代のCloud Run実行環境上で動作するためCloud Runサービスとのスペック的な違いはないと言える。

サービス ジョブ
世代 第一世代
第二世代
第二世代
ポートリッスン する しない
実行時間 60分 10分-60分
vCPU 1-8 1-8
最大メモリ 256MiB-32GiB(第一世代)
512MiB-32GiB
512MiB-32GiB

Taskと実行モード

タスク=コンテナ数のイメージ。

実行モード:

  • シリアル(直列)
  • パラレル(並列)

Event Schedulerから毎時0分にCloud Runジョブを実行、ジョブの中でPub/Subから1コンテナあたり10000個ずつメッセージを取得し、16並列で処理を行い実行時間を短縮するといった使い方ができる。

試してみる

Dockerfile

def hourly_job(name):
    print(f'Hi, {name}') 
FROM python:3.11-slim
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY . ./
RUN pip install --no-cache-dir -r requirements.txt
CMD ["python3", "main.py","task1"]

リポジトリ作成

gcloud artifacts repositories create containers --repository-format=docker --location=$REGION 

コンテナイメージのビルド

cloud builds submit -t $REGION-docker.pkg.dev/$PROJECT_ID/containers/dojob:v1

ジョブを動かすサービスアカウントの作成

gcloud iam service-accounts create dojob-sa --display-name="do_job app service account"

Cloud RunジョブからPub/Subサブスクリプション、Cloud SQLやCloud StorageといったGCPリソースにアクセスする場合はこのサービスアカウントに必要なロールを割り当てる。

ジョブの作成

gcloud beta run jobs create hourly-job \
  --image=$REGION-docker.pkg.dev/$PROJECT_ID/containers/dojob:v1 \
  --tasks=1 \
  --task-timeout=5m \
  --service-account=dojob-sa@$PROJECT_ID.iam.gserviceaccount.com --region=$REGION

ジョブのアップデート

コンテナイメージアップデート後。

$ gcloud beta run jobs update hourly-job   --image=$REGION-docker.pkg.dev/$PROJECT_ID/containers/dojob:v2   --tasks=1   --task-timeout=5m   --service-account=dojob-sa@$PROJECT_ID.iam.gserviceaccount.com
Updating Cloud Run job [hourly-job] in project [************] region [asia-northeast1]
OK Updating job... Done.
Done.
Job [hourly-job] has successfully been updated.

ジョブ実行結果

2023-03-08 22:53:37.551 JST
Hi, task1
2023-03-08 22:53:37.555 JST
Container called exit(0).
2023-03-08 22:53:42.546 JST
Cloud Run v1 daily-job-mdttp {@type: type.googleapis.com/google.cloud.audit.AuditLog, methodName: v1, resourceName: namespaces/************/executions/daily-job-mdttp, response: {…}, serviceName: run.googleapis.com, status: {…}} 

ジョブの定期実行

ジョブを定期実行するにはCloud Schedulerを使うのが簡単。 Cloud Runジョブの実行には少なくとも以下のロールの持つ権限セットが必要。

  • Cloud Run 管理者
  • サービスアカウントユーザー

ここではデフォルトのComputeアカウントを利用する。

TIME_ZONE="Asia/Tokyo"
gcloud scheduler jobs create http "print_hi" --location $REGION --schedule="0 * * * *" \
--uri="https://$region-run.googleapis.com/apis/run.googleapis.com/v1/namespaces/$PROJECT_ID/jobs/$JOB_NAME:run" \
--http-method POST --oauth-service-account-email $PROJECT_NUMBER-compute@developer.gserviceaccount.com --time-zone=$TIME_ZONE
タイトルとURLをコピーしました