こんにちは!山田です!
今回は前回に引き続きGCP Batchを解説していきたいと思います。
本記事でわかること
- GCP Batchをスケジュール起動する方法
GCP Batchのスケジュール実行
今回の記事は、GCP Batchを実際に業務で利用する場合に、よく検討されるスケジュール実行する方法について、ご説明していきたいと思います。
GCP Batchの概要や基本操作手順については、前回の記事に記載してるので併せてご確認ください。
構築イメージ
Batchジョブをスケジュール実行する為には、以下の構成で構築します。
順番に手順を紹介していきたいと思います。
Artifact Registryへのジョブイメージを保存する作業は前回の記事で実施してますので割愛します。
API有効化
WorkflowsのAPIを有効化します。
ジョブ起動・実行監視用ワークフロー作成
WorkflowsにBatchジョブの実行を制御するワークフローを作成していきます。
ワークフロー内で、実行するジョブの情報を定義します。
# batch-workflow.yaml
main:
params: [args]
steps:
- init:
assign:
- projectId: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
- region: "us-central1"
- batchApi: "batch.googleapis.com/v1"
- batchApiUrl: ${"https://" + batchApi + "/projects/" + projectId + "/locations/" + region + "/jobs"}
- imageUri: ${region + "-docker.pkg.dev/" + projectId + "/batch-python-job/batch-image"}
- jobId: ${"batch-python-job-" + string(int(sys.now()))}
- startTime: ${int(sys.now())}
- logCreateBatchJob:
call: sys.log
args:
data: ${"Creating and running the batch job " + jobId}
- createAndRunBatchJob:
# Batchジョブ作成
call: http.post
args:
url: ${batchApiUrl}
query:
job_id: ${jobId}
headers:
Content-Type: application/json
auth:
type: OAuth2
body:
taskGroups:
taskSpec:
runnables:
- container:
imageUri: ${imageUri}
computeResource:
# CPU,メモリサイズ
cpuMilli: 2000
memoryMib: 8192
# 同時実行数
taskCount: 1
parallelism: 1
allocationPolicy:
instances:
policy:
# インスタンスサイズ
provisioningModel: "STANDARD"
machineType: "e2-standard-2"
logsPolicy:
# 出力先をCloud Loggingに設定
destination: CLOUD_LOGGING
result: createAndRunBatchJobResponse
- getJob:
# ジョブ実行状態取得
call: http.get
args:
url: ${batchApiUrl + "/" + jobId}
auth:
type: OAuth2
result: getJobResult
- logState:
call: sys.log
args:
data: ${"Current job state " + getJobResult.body.status.state}
- checkState:
# ジョブ実行状態による条件分岐
switch:
- condition: ${getJobResult.body.status.state == "SUCCEEDED"}
next: returnResult
- condition: ${getJobResult.body.status.state == "FAILED"}
next: failExecution
next: sleep
- sleep:
# 5秒待機
call: sys.sleep
args:
seconds: 5
next: getJob
- logDeleteBatchJob:
call: sys.log
args:
data: ${"Deleting the batch job " + jobId}
- deleteBatchJob:
# Batchジョブ削除
call: http.delete
args:
url: ${batchApiUrl + "/" + jobId}
auth:
type: OAuth2
result: deleteBatchJob
- returnResult:
return:
jobId: ${jobId}
- failExecution:
# Batchジョブエラー発生時削除
call: http.delete
args:
url: ${batchApiUrl + "/" + jobId}
auth:
type: OAuth2
next: raiseMessage
- raiseMessage:
raise:
message: ${"batch job " + jobId + " failed"}
作成したワークフローをデプロイします。
gcloud workflows deploy batch-python-job \
--source=batch-workflow.yaml \
--location=us-central1 \
--project [PROJECT_ID] \
ワークフロー動作確認
デプロイしたワークフローを確認します。
GCPコンソールで、Workflowsを開き、デプロイしたワークフローが作成されていることを確認します。
作成されたワークフロー名をクリックし、実行をクリックします。
今回は引数などは不要なので、そのまま実行ボタンをクリックします。
数分後、成功になっていることを確認します。
ここまでで、Workflowsを利用したBatchジョブの実行方法となります。
続いて、Cloud Schedulerを利用してスケジュール実行する方法を記載します。
スケジュール登録
事前にIAMから「ワークフロー起動元」ロールを付与したサービスアカウントを作成します。
Cloud Schedulerで5分ごとに先程までの作業で作成したワークフローを起動するよう設定します。
gcloud scheduler jobs create http batch-python-job-scheduler `
--schedule="*/5 * * * *" `
--uri="https://workflowexecutions.googleapis.com/v1/projects/[PROJECT_ID]/locations/us-central1/workflows/batch-python-job/executions" `
--message-body="{}" `
--time-zone="Asia/Tokyo" `
--location="us-central1" `
--oauth-service-account-email="[サービスアカウント]" `
--project [PROJECT_ID]
実行確認
GCPコンソールのCloud Schedulerを開き、設定から5分経過後に最後の実行のステータスが
成功となっていることを確認します。
Workflowsの画面からも正常実行されていることを確認します。
GCP Batchの画面からも正常実行されていることを確認します。
以上で、GCP Batchをスケジュール実行する際の手順となります。
まとめ
今回は実際の業務でもよく利用しているGCP Batchをスケジュール実行する方法について、紹介しました。
前回に引き続き2回に分けてGCP Batchを紹介してきましたが、まだまだ便利な機能があるサービスですので、是非一度触ってみてください。
Google および Google Cloud Platform™ service は Google LLC の商標であり、この記事は Google によって承認されたり、Google と提携したりするものではありません。
コメント