こんにちは! 山田です!
みなさんは昨年(2022年)リリースされたGCP Batchをご存じでしょうか?
今回はこのGCP Batchについてご紹介していきたいと思います。
本記事でわかること
- GCP Batchの概要
- GCP Batchの基本的な使いかた
GCP Batchとは
普段GCPを利用されている方は、バッチ処理を実行する場合にCloud FunctionsやCloud RunなどのFaaSを要件に合わせて選択されていることが多いのではないでしょうか?
GCP Batchもその名の通り、バッチ処理に特化したサービスとして2022年10月にGAされたサービスです。バッチ処理が記述されたソースを準備すれば、Compute Engine VM のリージョン マネージド インスタンス グループ(MIG)として自動でプロビジョニングされ、ソースの実行までをフルマネージドで行ってくれる非常に便利なサービスです。
GCP Batchでは、他の類似サービスで課題となっていた点をクリアすることできます。
※記事執筆時点(2023/2/23)では、日本リージョン(東京・大阪)は利用できません。今後に期待です。
GCP Batchの特徴
バッチ処理を実行できる他のサービスを比較した場合、GCP Batchのメリットとして大きく4つあります。
- 実行時間制限なし
Cloud RunやCloud Functionsでは最大60分などの実行時間制限がありましたが、GCP Batchには実行時間制限がありません。長時間処理が必要なバッチも怖くありません! - GPUやSSDなどのストレージリソースが利用可能
機械学習などをバッチ処理で行う際にGPUや大容量のストレージが必要となった場合も、Compute Engineと同様にこれらのリソースを利用できます。 - オートスケールや再試行ポリシーなど手間いらずな設定が可能
予定外にジョブの同時実行をする場合にもオートスケールが可能なため詳細なサイジングは不要です。エラー時に一定時間間隔を空けて再実行させるなどの設定も簡単に行えます。 - 利用料無料
GCP Batch自体の利用料は無料です。起動するCompute Engineインスタンスなどのリソース利用料のみとなるため、他サービスと比較しても安価となることが多いです。
利用するインスタンスをスポットインスタンスにすることにより、さらに削減することも可能です。
GCP Batchの使いどころ
これまで説明した通り、非常に便利なGCP Batchですが、特に以下のような時には利用を検討しても良いかと思います。
- 1時間以上の長時間の実行が見込まれる処理
- 動画編集など大容量のストレージ領域が必要な処理
GCP Batchを使ったPythonスクリプトの実行方法
それでは、GCP Batchを利用して、Pythonで簡単な処理を実行するジョブを作成していきます。
利用APIの有効化
まずは、Batch ジョブを実行するプロジェクトのBatch APIを有効にします。
続けて、Batchで動かすジョブイメージをビルドし保存するため、Artifact Registry APIと
Cloud Build APIを有効化します。
Artifact Registry リポジトリの作成
Artifact Registry の[リポジトリを作成]をクリックします。
リポジトリ名・形式・モード・ロケーションタイプを指定し作成します。
作成したリポジトリの詳細画面からパスをコピーしておきます。
後ほど利用します。
Batchジョブスクリプトの作成
ローカルPCでBatch ジョブとして実行するPythonスクリプトを作成します。
プロジェクト用のフォルダを作成し、Python仮想環境を準備します。
# Python仮想環境を作成
python -m venv venv
# アクティベート
.\venv\Scripts\activate
Pythonスクリプトで利用するモジュールをインストールします。
# 日本タイムゾーンを指定する為、tzdataをインストール
pip install tzdata
# Batchジョブイメージでインストールする為、requirements.txtを出力
pip freeze > requirements.txt
プロジェクトフォルダ配下にPythonスクリプトファイルを作成します。
今回は検証用として、開始時間出力後に5秒待機を行い、終了時間を出力する処理のみとしています。
ファイル作成後、ローカルPCで正常に動作するか確認します。
# main.py
import time
from datetime import datetime
from zoneinfo import ZoneInfo
# タイムゾーン情報を取得
tz_tokyo = ZoneInfo("Asia/Tokyo")
now = datetime.now(tz_tokyo)
print(f"ジョブ開始時間:{now.strftime('%x %X')}")
# 5秒待機
time.sleep(5)
now = datetime.now(tz_tokyo)
print(f"ジョブ終了時間:{now.strftime('%x %X')}")
# 出力結果
# ジョブ開始時間:YY/MM/DD HH:mm:ss
# ジョブ終了時間:YY/MM/DD HH:mm:ss
Batchジョブイメージ作成
作成したPythonファイルが動作するDockerイメージを作成していきます。
プロジェクトフォルダ配下にDockerfileを作成します。
FROM python:3.9.0-slim
ENV PYTHONUNBUFFERED True
ENV APP_HOME /app
WORKDIR $APP_HOME
COPY ./requirements.txt ./requirements.txt
COPY ./main.py ./main.py
RUN pip install --no-cache-dir -r requirements.txt
ENTRYPOINT ["python3", "./main.py"]
Dockerイメージをビルドし、Artifact Registry リポジトリに保存するために、Cloud Buildのビルド構成ファイルをプロジェクトフォルダ配下に作成します。
# cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
args: [ 'build', '-t', '{作成したArtifact Registryリポジトリのパス}/batch-image', '.' ]
images:
- '{作成したArtifact Registryリポジトリのパス}/batch-image'
作成したビルド構成ファイルを使用し、Cloud Buildジョブを実行します。
gcloud builds submit --region=us-central1 --config cloudbuild.yaml --project {プロジェクトID}
Artifact Registry リポジトリにDockerイメージが作成されていることを確認します。
Batchジョブ実行
作成したイメージを実行するBatchジョブ構成ファイルをプロジェクト配下に作成します。
// ファイル名:batchjob.json
{
"taskGroups": [{
"taskSpec": {
"runnables": [{
"container": {
"imageUri": "{作成したArtifact Registryリポジトリのパス}/batch-image"
}
}],
"computeResource": {
"cpuMilli": 2000,
"memoryMib": 8192
}
},
"taskCount": 1,
"parallelism": 1
}],
"allocationPolicy": {
"instances": [{
"policy": {
"provisioningModel": "STANDARD",
"machineType": "e2-standard-2"
}
}]
},
"logsPolicy": {
"destination": "CLOUD_LOGGING"
}
}
上記構成ファイルの詳細については、下記ドキュメントを参照してください。
Batchジョブを実行登録します。
gcloud batch jobs submit {Batchジョブ名} --location us-central1 --config batchjob.json
GCPコンソールからBatchサービス画面を確認すると、実行登録したBatchジョブが表示されます。
Batchジョブの出力結果がCloud Loggingに出力されていることを確認します。
まとめ
今回はGCP Batchの特徴とGCP Batchを利用したPythonスクリプトの基本的な実行方法について、紹介しました。
GCP Batchはまだ日本リージョンに対応していないものの、実行時間制限がないバッチ処理が可能なすごく便利なサービスとなっております。
次回は、GCP Batchをスケジュール実行させる方法について、紹介したいと思います。
Google および Google Cloud Platform™ service は Google LLC の商標であり、この記事は Google によって承認されたり、Google と提携したりするものではありません。
コメント