GCP Batchを使ってみる②

Google Cloud
この記事は約9分で読めます。

こんにちは!山田です!
今回は前回に引き続き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 と提携したりするものではありません。

コメント

タイトルとURLをコピーしました