Google Cloud Batch ジョブを VPC を指定して実行してみた。

2022.11.10

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、みかみです。

3年ぶりに東京いったら、普通に移動するだけで乗り換えだなんだすごく歩く必要があって、筋肉痛になりました。。(運動不足ここに極まれりw

Google Cloud の Batch とは

予め VM インスタンスを準備しなくても、自動でインスタンスを立ち上げてくれて、ワンショットなバッチ処理を実行できるサービスです。 処理内容は、スクリプトを直接指定、またはコンテナイメージで指定することができます。 処理終了次第使用したインスタンスは削除してくれるので、長時間バックグラウンドで動かしたいバッチ処理をコスト効率よく実行することができます。

バッチ処理を実行するのに便利な Google Cloud の Batch ですが、管理コンソール GUI からジョブ作成する場合、VPC やサブネットの指定箇所が見当たらず、インスタンスはデフォルト VPC に作成されてしまいます。 動作確認の際などすぐに使えて便利なデフォルト VPC ですが、外部からのアクセスが許可されているため、本番環境での利用は非推奨となっています。

デフォルト VPC 使うのはちょっと。。。 でも、Batch 使いたい! ということで。

やりたいこと

  • Google Cloud Batch でバッチ処理を実行したい
  • Batch ジョブ実行インスタンスを、指定した VPC の中に建てたい

前提

Google Cloud SDK(gcloud コマンド)の実行環境は準備済みであるものとします。 本エントリでは、Cloud Shell を使用しました。

また、Batch API は有効化済みで、Batch ジョブを実行する Compute Engine のデフォルトサービスアカウント([PROJECT_NUMBER]-compute@developer.gserviceaccount.com)に、バッチ エージェント報告者(roles/batch.agentReporter)のロールを付与済みです。

VPC とサブネットを準備

バッチジョブで指定する、VPC とサブネットを作成します。 今回のバッチジョブでは Google Cloud 内部の GCS へのアクセスのみの処理を想定しているため、敢えて Firewall は設定していません。

以下のコマンドで、VPC とサブネットを作成しました(サブネット名の subnet の綴りが間違ってたのは内緒ですw

gcloud compute networks create test-vpc --project=cm-da-mikami-yuki-258308 --description=VPC\ temporary --subnet-mode=custom --mtu=1460 --bgp-routing-mode=regional && gcloud compute networks subnets create test-sumnet-usc1 --project=cm-da-mikami-yuki-258308 --description=subnet\ temporary --range=10.0.0.0/24 --stack-type=IPV4_ONLY --network=test-vpc --region=us-central1 --enable-private-ip-google-access

Batch ジョブを作成&実行

以下の config ファイルを、job_config.json という名前で保存しました。

{
  "taskGroups": [
    {
      "taskCount": "1",
      "parallelism": "1",
      "taskSpec": {
        "computeResource": {
          "cpuMilli": "1000",
          "memoryMib": "512"
        },
        "runnables": [
          {
            "script": {
              "text": "#!/bin/bash\ngsutil cp gs://test-mikami-gas/csv2gcs/* gs://test-mikami-gas/backup/\nsleep 5m"
            }
          }
        ],
        "volumes": []
      }
    }
  ],
  "allocationPolicy": {
    "instances": [
      {
        "policy": {
          "provisioningModel": "STANDARD",
          "machineType": "e2-medium"
        }
      }
    ],
    "network": {
      "networkInterfaces": [
        {
          "network": "https://www.googleapis.com/compute/v1/projects/cm-da-mikami-yuki-258308/global/networks/test-vpc",
          "subnetwork": "https://www.googleapis.com/compute/v1/projects/cm-da-mikami-yuki-258308/regions/us-central1/subnetworks/test-sumnet-usc1"
        }
      ]
    }
  },
  "logsPolicy": {
    "destination": "CLOUD_LOGGING"
  }
}

config ファイルの内容は、管理コンソール GUI のジョブ作成画面「同等のREST」で表示される taskGroups の内容をベースに、

API リファレンスを参照して、VPC 指定を追加しました。

なお、networksubnetwork に指定する URL は、以下のコマンドで取得できます。

はじめ、URL ではなく VPC 名(test-vpc)とサブネット名(test-sumnet-usc1)名を指定してジョブ実行エラーになり、ログ確認したら以下のエラーメッセージが出ていて、「何が見つからないんだ?」と、ちょっとつまづきましたw

The resource 'projects/[プロジェクトNo]/regions/us-central1/instanceGroupManagers/j-6daa1051-40bb-4267-909d-6c6f05ebabd3-group0-0' was not found
The resource 'projects/[プロジェクトNo]/global/instanceTemplates/j-6daa1051-40bb-4267-909d-6c6f05ebabd3-group0-0' was not found

スクリプトの処理内容は runnablesscript に記載した以下です。

#!/bin/bash
gsutil cp gs://test-mikami-gas/csv2gcs/* gs://test-mikami-gas/backup/
sleep 5m

GCS バケットのファイルを backup ディレクトリにコピーし、Batch ジョブ実行インスタンスの VPC 確認のために 5m sleep します。

バッチ実行前、GCS バケットには、csv2gcs/sample.csv 1 ファイルのみ格納されている状態です。

$ gcloud storage ls -r gs://test-mikami-gas
gs://test-mikami-gas/:

gs://test-mikami-gas/csv2gcs/:
gs://test-mikami-gas/csv2gcs/sample.csv

以下のコマンドで、Batch ジョブを作成&実行します。

gcloud batch jobs submit job-vpc \
  --location us-central1 \
  --config job_config.json

無事ジョブ作成できたようなので、

Job j-06b8fef7-b3b3-429e-8461-fd3ff4307d06 was successfully submitted.
allocationPolicy:
  instances:
(省略)
updateTime: '2022-11-08T14:10:23.798125133Z'

ちょっと待ってから、 VM インスタンスを確認してみます。

指定した VPC で、Batch ジョブ実行インスタンスが起動できたことが確認できました。

ジョブ完了したことを確認して、

GCS バケットのファイルがコピーできたか確認してみます。

$ gcloud storage ls -r gs://test-mikami-gas
gs://test-mikami-gas/:

gs://test-mikami-gas/backup/:
gs://test-mikami-gas/backup/sample.csv

gs://test-mikami-gas/csv2gcs/:
gs://test-mikami-gas/csv2gcs/sample.csv

期待通り、VPC 指定の Batch ジョブで、バックアップ処理を実行できたことが確認できました。

まとめ(所感)

2022/07/13 にプレビューリリースされた Batch ですが、2022/10/11 にめでたく GA になりました!

2022/11 現在、東京リージョンにはまだ対応していないものの、サンプルコードも充実しています。

Workflows と合わせて使用すればスケジュール実行も可能なので、Workflows ではメモリ制限に引っかかるバッチ処理を Batch にオフロードするなど、 今後は Batch の利用も良い選択肢になるのではないかと思います。

参考