Google Cloud Batch ジョブを VPC を指定して実行してみた。
こんにちは、みかみです。
3年ぶりに東京いったら、普通に移動するだけで乗り換えだなんだすごく歩く必要があって、筋肉痛になりました。。(運動不足ここに極まれりw
Google Cloud の Batch とは
予め VM インスタンスを準備しなくても、自動でインスタンスを立ち上げてくれて、ワンショットなバッチ処理を実行できるサービスです。 処理内容は、スクリプトを直接指定、またはコンテナイメージで指定することができます。 処理終了次第使用したインスタンスは削除してくれるので、長時間バックグラウンドで動かしたいバッチ処理をコスト効率よく実行することができます。
- あらゆる規模でバッチジョブをスケジュールできる新しいマネージド サービス、Batch のご紹介 | Google Cloud ブログ
- Get started with Batch | Batch ドキュメント
- Google CloudのプレビューになったBatchを試す | DevelopersIO
バッチ処理を実行するのに便利な 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][email protected]
)に、バッチ エージェント報告者(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 指定を追加しました。
なお、network
と subnetwork
に指定する 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
スクリプトの処理内容は runnables
の script
に記載した以下です。
#!/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 の利用も良い選択肢になるのではないかと思います。
参考
- あらゆる規模でバッチジョブをスケジュールできる新しいマネージド サービス、Batch のご紹介 | Google Cloud ブログ
- Get started with Batch | Batch ドキュメント
- REST Resource: projects.locations.jobs | Batch ドキュメント
- gcloud beta batch jobs submit | Cloud SDK
- All Batch code samples | Batch ドキュメント
- October 11, 2022 | Batch release notes
- Workflows を使用して Batch ジョブを実行する | Workflows ドキュメント
- Google CloudのプレビューになったBatchを試す | DevelopersIO
- デフォルトのネットワーク | Virtual Private Cloud ドキュメント
- デフォルト ネットワークの事前設定ルール | Virtual Private Cloud ドキュメント
- gcloud compute networks describe | Cloud SDK リファレンス