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