Batch は、Compute Engine 仮想マシン(VM)インスタンスでバッチ処理ワークロードのスケジューリング、キューイング、実行を行えるフルマネージド サービスです。Batch がお客様に代わってリソースをプロビジョニングし、容量を管理することで、バッチ ワークロードを大規模に実行できます。
Workflows では、Workflows の構文を使用して定義した順序で必要なサービスを実行できます。
このチュートリアルでは、Batch 用 Workflows コネクタを使用して、2 つの Compute Engine VM で 6 つのタスクを同時に実行する Batch ジョブをスケジュール設定して実行します。Batch と Workflows の両方を使用すると、それぞれの利点を享受し、プロセス全体を効率的にプロビジョニングしてオーケストレートできます。
目標
このチュートリアルの内容は次のとおりです。- Docker コンテナ イメージ用の Artifact Registry リポジトリを作成します。
- GitHub からバッチ処理ワークロードのコードを取得します。これは、10,000 個のバッチで素数を生成するサンプル プログラムです。
- ワークロードの Docker イメージをビルドします。
- 次の処理を行うワークフローをデプロイして実行します。
- 素数生成ツールの結果を保存する Cloud Storage バケットを作成します。
- 2 つの Compute Engine VM で Docker コンテナを 6 つのタスクとして並列に実行する Batch ジョブをスケジュールして実行します。
- 必要に応じて、完了後に Batch ジョブを削除します。
- 結果が想定どおりであること、および生成されたプライム番号のバッチが Cloud Storage に保存されていることを確認します。
次のコマンドのほとんどは Google Cloud コンソールで実行できます。また、ターミナルまたは Cloud Shell で Google Cloud CLI を使用してすべてのコマンドを実行することもできます。
費用
このドキュメントでは、Google Cloud の次の課金対象のコンポーネントを使用します。
料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。
始める前に
組織で定義されているセキュリティの制約により、次の手順を完了できない場合があります。トラブルシューティング情報については、制約のある Google Cloud 環境でアプリケーションを開発するをご覧ください。
コンソール
Google Cloud コンソールのプロジェクト セレクタ ページで、Google Cloud プロジェクトを選択または作成します。
Google Cloud プロジェクトの課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
Artifact Registry API、Batch API、Cloud Build API、Compute Engine API、Workflow Execution API、Workflows API を有効にします。
他の Google Cloud サービスでの認証に使用するワークフローのサービス アカウントを作成し、適切なロールを付与します。
Google Cloud コンソールで [サービス アカウントの作成] ページに移動します。
プロジェクトを選択します。
[サービス アカウント名] フィールドに名前を入力します。Google Cloud コンソールでは、この名前に基づいて [サービス アカウント ID] フィールドの値が設定されます。
[サービス アカウントの説明] フィールドに説明を入力します。例:
Service account for tutorial
[作成して続行] をクリックします。
[ロールを選択] リストで、次のロールをフィルタして、前の手順で作成したユーザー管理のサービス アカウントに付与します。
- バッチジョブ編集者: バッチジョブを編集します。
- ログ書き込み: ログを書き込みます。
- ストレージ管理者: Cloud Storage リソースを管理します。
ロールを追加するには、[
別のロールを追加] をクリックして各ロールを追加します。[続行] をクリックします。
アカウントの作成を完了するには、[完了] をクリックします。
デフォルトのサービス アカウントに対する IAM サービス アカウント ユーザーのロールを、前の手順で作成したユーザー管理のサービス アカウントに付与します。Compute Engine API を有効にすると、デフォルトのサービス アカウントは Compute Engine のデフォルトのサービス アカウント(
PROJECT_NUMBER-compute@developer.gserviceaccount.com
)になり、権限は通常、roles/iam.serviceAccountUser
ロールによって割り当てられます。[サービス アカウント] ページで、デフォルトのサービス アカウント(
PROJECT_NUMBER-compute@developer.gserviceaccount.com
)のメールアドレスをクリックします。[権限] タブをクリックします。
[アクセスを許可] ボタンをクリックします。
新しいプリンシパルを追加するには、サービス アカウントのメールアドレス(
SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
)を入力します。[ロールを選択] リストで、[サービス アカウント] > [サービス アカウント ユーザー] ロールを選択します。
[保存] をクリックします。
gcloud
In the Google Cloud console, activate Cloud Shell.
At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.
Google Cloud プロジェクトの課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。
Artifact Registry API、Batch API、Cloud Build API、Compute Engine API、Workflow Execution API、Workflows API を有効にします。
gcloud services enable artifactregistry.googleapis.com \ batch.googleapis.com \ cloudbuild.googleapis.com \ compute.googleapis.com \ workflowexecutions.googleapis.com \ workflows.googleapis.com
他の Google Cloud サービスでの認証に使用するワークフローのサービス アカウントを作成し、適切なロールを付与します。
サービス アカウントを作成します。
gcloud iam service-accounts create SERVICE_ACCOUNT_NAME
SERVICE_ACCOUNT_NAME
をサービス アカウントの名前に置き換えます。前のステップで作成したユーザー管理のサービス アカウントにロールを付与します。次の IAM ロールごとに次のコマンドを 1 回実行します。
roles/batch.jobsEditor
: バッチジョブを編集します。roles/logging.logWriter
: ログを書き込みます。roles/storage.admin
: Cloud Storage リソースを制御します。
gcloud projects add-iam-policy-binding PROJECT_ID \ --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role=ROLE
以下を置き換えます。
PROJECT_ID
: サービス アカウントを作成したプロジェクト IDROLE
: 付与するロール
デフォルトのサービス アカウントに対する IAM サービス アカウント ユーザーのロールを、前の手順で作成したユーザー管理のサービス アカウントに付与します。Compute Engine API を有効にすると、デフォルトのサービス アカウントは Compute Engine のデフォルトのサービス アカウント(
PROJECT_NUMBER-compute@developer.gserviceaccount.com
)になり、権限は通常、roles/iam.serviceAccountUser
ロールによって割り当てられます。PROJECT_NUMBER=$(gcloud projects describe PROJECT_ID --format='value(projectNumber)') gcloud iam service-accounts add-iam-policy-binding \ $PROJECT_NUMBER-compute@developer.gserviceaccount.com \ --member=serviceAccount:SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com \ --role=roles/iam.serviceAccountUser
Artifact Registry リポジトリを作成する
Docker コンテナ イメージを保存するリポジトリを作成します。
コンソール
Google Cloud コンソールで、[リポジトリ] ページに移動します。
[リポジトリを作成] をクリックします。
リポジトリ名として「containers」と入力します。
[形式] は [Docker] を選択します。
[ロケーション タイプ] で、[リージョン] を選択します。
[リージョン] リストで [us-central1] を選択します。
[作成] をクリックします。
gcloud
次のコマンドを実行します。
gcloud artifacts repositories create containers \
--repository-format=docker \
--location=us-central1
us-central1
リージョンに containers
という名前の Artifact Registry リポジトリを作成しました。サポートされているリージョンの詳細については、Artifact Registry のロケーションをご覧ください。
コードサンプルを取得する
Google Cloud は、このチュートリアルのアプリケーション ソースコードを GitHub に保存します。対象のリポジトリのクローンを作成するか、サンプルをダウンロードできます。
ローカルマシンにサンプルアプリのリポジトリのクローンを作成します。
git clone https://github.com/GoogleCloudPlatform/batch-samples.git
または、
main.zip
ファイルのサンプルをダウンロードして抽出することもできます。サンプルコードが入っているディレクトリに移動します。
cd batch-samples/primegen
これで、開発環境にアプリケーションのソースコードを用意できました。
Cloud Build を使用して Docker イメージをビルドする
Dockerfile
には、Cloud Build を使用して Docker イメージをビルドするために必要な情報が含まれています。次のコマンドを実行してビルドします。
gcloud builds submit \
-t us-central1-docker.pkg.dev/PROJECT_ID/containers/primegen-service:v1 PrimeGenService/
PROJECT_ID
は、実際の Google Cloud プロジェクト ID に置き換えます。
ビルドが完了すると、次のような出力が表示されます。
DONE
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
ID: a54818cc-5d14-467b-bfda-5fc9590af68c
CREATE_TIME: 2022-07-29T01:48:50+00:00
DURATION: 48S
SOURCE: gs://project-name_cloudbuild/source/1659059329.705219-17aee3a424a94679937a7200fab15bcf.tgz
IMAGES: us-central1-docker.pkg.dev/project-name/containers/primegen-service:v1
STATUS: SUCCESS
Dockerfile を使用して、primegen-service
という名前の Docker イメージをビルドし、そのイメージを containers
という名前の Artifact Registry リポジトリに push しました。
Batch ジョブをスケジュール設定して実行するワークフローをデプロイする
次のワークフローは、2 つの Compute Engine VM で Docker コンテナを 6 つのタスクとして並列に実行する Batch ジョブをスケジュールして実行します。結果として、6 個の素数のバッチが生成され Cloud Storage バケットに格納されます。
Console
Google Cloud コンソールの [ワークフロー] ページに移動します。
[
作成] をクリックします。新しいワークフローの名前を入力します(例:
batch-workflow
)。[リージョン] リストで [us-central1] を選択します。
先ほど作成したサービス アカウントを選択します。
[次へ] をクリックします。
ワークフロー エディタで、次のワークフローの定義を入力します。
YAML
JSON
[デプロイ] をクリックします。
gcloud
ワークフローのソースコード ファイルを作成します。
touch batch-workflow.JSON_OR_YAML
ワークフローの形式に応じて、
JSON_OR_YAML
をyaml
またはjson
に置き換えます。テキスト エディタで、次のワークフローをソースコード ファイルにコピーします。
YAML
JSON
次のコマンドを入力してワークフローをデプロイします。
gcloud workflows deploy batch-workflow \ --source=batch-workflow.yaml \ --location=us-central1 \ --service-account=SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
SERVICE_ACCOUNT_NAME
は、先ほど作成したサービス アカウントの名前に置き換えます。
ワークフローを実行する
ワークフローを実行すると、そのワークフローに関連付けられた現在のワークフロー定義が実行されます。
Console
Google Cloud コンソールの [ワークフロー] ページに移動します。
[ワークフロー] ページで、[batch-workflow] ワークフローをクリックして詳細ページに移動します。
[ワークフローの詳細] ページで [play_arrow 実行] を選択します。
もう一度 [Execute] をクリックします。
ワークフローの実行には数分を要します。
ワークフローの結果が [出力] ペインに表示されます。
結果は次のようになります。
{ "bucket": "project-name-job-primegen-TIMESTAMP", "jobId": "job-primegen-TIMESTAMP" }
gcloud
ワークフローを実行します。
gcloud workflows run batch-workflow \ --location=us-central1
ワークフローの実行には数分を要します。
長時間実行のステータスを確認できます。
最後に完了した実行のステータスを取得するには、次のコマンドを実行します。
gcloud workflows executions describe-last
結果の例を以下に示します。
name: projects/PROJECT_NUMBER/locations/us-central1/workflows/batch-workflow/executions/EXECUTION_ID result: '{"bucket":"project-name-job-primegen-TIMESTAMP","jobId":"job-primegen-TIMESTAMP"}' startTime: '2022-07-29T16:08:39.725306421Z' state: SUCCEEDED status: currentSteps: - routine: main step: returnResult workflowRevisionId: 000001-9ba
出力バケット内のオブジェクトを一覧表示する。
Cloud Storage 出力バケット内のオブジェクトを一覧表示することで、結果が想定どおりであることを確認できます。
Console
- Google Cloud コンソールで、Cloud Storage の [バケット] ページに移動します。
バケットリストで、コンテンツを表示するバケットの名前をクリックします。
結果は次のようになります。合計で 6 つのファイルがあり、それぞれが 10,000 個の素数のバッチを一覧表示しています。
primes-1-10000.txt primes-10001-20000.txt primes-20001-30000.txt primes-30001-40000.txt primes-40001-50000.txt primes-50001-60000.txt
gcloud
出力バケット名を取得します。
gcloud storage ls
出力は次のようになります。
gs://PROJECT_ID-job-primegen-TIMESTAMP/
バケット内のオブジェクトを一覧表示する。
gcloud storage ls gs://PROJECT_ID-job-primegen-TIMESTAMP/** --recursive
TIMESTAMP
は、前のコマンドで返されたタイムスタンプに置き換えます。出力は次のようになります。合計で 6 つのファイルがあり、それぞれに 10,000 個の素数のバッチが一覧表示されています。
gs://project-name-job-primegen-TIMESTAMP/primes-1-10000.txt gs://project-name-job-primegen-TIMESTAMP/primes-10001-20000.txt gs://project-name-job-primegen-TIMESTAMP/primes-20001-30000.txt gs://project-name-job-primegen-TIMESTAMP/primes-30001-40000.txt gs://project-name-job-primegen-TIMESTAMP/primes-40001-50000.txt gs://project-name-job-primegen-TIMESTAMP/primes-50001-60000.txt
クリーンアップ
このチュートリアル用に新規プロジェクトを作成した場合は、そのプロジェクトを削除します。既存のプロジェクトを使用し、このチュートリアルで変更を加えずに残す場合は、チュートリアル用に作成したリソースを削除します。
プロジェクトを削除する
課金をなくす最も簡単な方法は、チュートリアル用に作成したプロジェクトを削除することです。
プロジェクトを削除するには:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
このチュートリアルで作成したリソースを削除する
バッチジョブを削除します。
まず、ジョブ名を取得します。
gcloud batch jobs list --location=us-central1
出力例を以下に示します。
NAME: projects/project-name/locations/us-central1/jobs/job-primegen-TIMESTAMP STATE: SUCCEEDED
ここで、
job-primegen-TIMESTAMP
はバッチジョブの名前です。ジョブを削除します。
gcloud batch jobs delete BATCH_JOB_NAME --location us-central1
ワークフローを削除します。
gcloud workflows delete WORKFLOW_NAME
コンテナ リポジトリを削除します。
gcloud artifacts repositories delete REPOSITORY_NAME --location=us-central1
Cloud Build は、Cloud Storage を使用してビルドリソースを保存します。Cloud Storage バケットを削除するには、バケットを削除するをご覧ください。