
Google Cloud の Workflows で Batch を呼び出してみた
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
Google Cloud データエンジニアのはんざわです。
今回のブログでは、Google Cloud の Workflows で Batch を呼び出してみたいと思います。
Batch の概要や特徴などは過去のブログを参照してください。
やりたいこと
今回のブログでやりたいことは以下のとおりです。
- Workflows で Batch のジョブを作成する
 - Workflows を手動で呼び出す
 - ジョブの構成自体は前回のブログの内容と同じ
 
イメージとしては、以下のような構成図になります。

また、今回の検証は下記の公式ドキュメントを参考にしています。
併せて、確認してください。
事前準備
一部のリソースは、前回の検証で使用したものを再利用します。
- Batch のジョブを実行するサービスアカウント
 - 圧縮されたファイルを保管する Cloud Storage
 - 解凍したファイルを保管する Cloud Storage
 - Batch にマウントする Cloud Storage
 - 実行するスクリプト
 
1. サービスアカウントの作成
Workflows を実行するサービスアカウントを新たに作成し、以下の3つの権限を付与します。
- バッチジョブ編集者(
roles/batch.jobsEditor) - サービスアカウントユーザー(
roles/iam.serviceAccountUser) - ログ書き込み(
roles/logging.logWriter) 
# サービスアカウントを作成
$ gcloud iam service-accounts create sa-workflows
# roles/batch.agentReporter の権限を付与
$ gcloud projects add-iam-policy-binding <PROJECT_ID> \
    --member="serviceAccount:sa-workflows@<PROJECT_ID>.iam.gserviceaccount.com" \
    --role="roles/batch.jobsEditor" \
    --condition None
# roles/iam.serviceAccountUser の権限を付与
$ gcloud projects add-iam-policy-binding <PROJECT_ID> \
    --member="serviceAccount:sa-workflows@<PROJECT_ID>.iam.gserviceaccount.com" \
    --role="roles/iam.serviceAccountUser" \
    --condition None
# roles/logging.logWriter の権限を付与
$ gcloud projects add-iam-policy-binding <PROJECT_ID> \
    --member="serviceAccount:sa-workflows@<PROJECT_ID>.iam.gserviceaccount.com" \
    --role="roles/logging.logWriter" \
    --condition None
2. Workflows の作成
次に Batch のジョブ作成と実行を行う Workflows を作成します。
Workflows の構成は、以下のとおりです。
| 構成名 | 入力内容 | 
|---|---|
| ワークフロー名 | exec-batch-job | 
| ワークフローの説明 | 省略 | 
| リージョン | asia-northeast1(東京) | 
| サービスアカウント | sa-workflows@<PROJECT_ID>.iam.gserviceaccount.com | 
| 呼び出しログレベル | 指定なし | 
| 暗号化 | Google が管理する暗号鍵 | 
| 環境変数 | 省略 | 
| ラベル | 省略 | 
| トリガー | 省略 | 
また、ワークフローの定義は以下のとおりです。
main:
    steps:
        - init:
            assign:
                - project: ${sys.get_env("GOOGLE_CLOUD_PROJECT_ID")}
                - location: ${sys.get_env("GOOGLE_CLOUD_LOCATION")}
        - createAndRunBatchJob:
            call: googleapis.batch.v1.projects.locations.jobs.create
            args:
                parent: ${"projects/" + project + "/locations/" + location}
                body:
                    taskGroups:
                        taskSpec:
                            runnables:
                                - script:
                                    path: "/scripts/script.sh"
                            computeResource:
                                cpuMilli: "500"
                                memoryMib: "500"
                            environment:
                                variables:
                                    FILE_PATH: "test/sample.csv.gz"
                                    INPUT_BUCKET: "hanzawa-yuya-compressed-files"
                                    OUTPUT_BUCKET: "hanzawa-yuya-uncompressed-files"
                            volumes:
                                - gcs:
                                    remotePath: "hanzawa-yuya-batch-mount/test"
                                  mountPath: "/scripts"
                    allocationPolicy:
                        instances:
                            - policy:
                                machineType: "e2-micro"
                                provisioningModel: "STANDARD"
                        location:
                            allowedLocations:
                                - ${"regions/" + location}
                        serviceAccount:
                            email: ${"sa-batch@" + project + ".iam.gserviceaccount.com"}
                    logsPolicy:
                        "destination": "CLOUD_LOGGING"
            result: createAndRunBatchJobResponse
参考ドキュメント
動かしてみる
早速、作成した Workflows を動かしてみたいと思います。
コンソールから作成した exec-batch-job -> 実行 を選択し、手動で呼び出します。
Workflows と Batch の実行タイミングを確認します。それぞれ以下のとおりです。
- Workflows
 

- Batch
 

さらに表にまとめると次のようになります。
| 時間 | サービス | ステータス | 
|---|---|---|
| 10:44:41 | Workflows | 実行開始 | 
| 10:44:44 | Batch | QUEUED から SCHEDULED に変更 | 
| 10:45:49 | Batch | SCHEDULED から RUNNING に変更 | 
| 10:45:53 | Batch | RUNNING から SUCCEEDED に変更 | 
| 10:46:13 | Workflows | 実行終了 | 
この結果からわかるように、Workflows から Batch を呼び出すと同期でレスポンスが返ってきています。(= つまり、Batch の処理が終わってから Workflows が次のステップに進む)
また、解凍処理が正常に完了していることが確認できました。
まとめ
今回のブログでは、Google Cloud の Workflows で Batch を呼び出す方法を紹介しました。
この検証では、手動で Workflows を実行しましたが、もちろん Cloud Scheduler などから変数と一緒に呼び出し、柔軟性が高くすることも可能です。
是非、試してみてください。






