AWS Batch
ユーザーガイド

チュートリアル: 配列ジョブインデックスを使用したジョブの差別化の制御

このチュートリアルでは、各子ジョブが割り当てられているAWS_BATCH_JOB_ARRAY_INDEX 環境変数を使用して、子ジョブを区別する方法を示します。この例では、子ジョブのインデックス番号を使用してファイル内の特定の行を読み取り、その行番号に関連付けられたパラメータをジョブのコンテナ内のコマンドで置き換えます。その結果、同じ Docker イメージとコマンド引数を実行している複数の AWS Batch ジョブを持つことができますが、配列ジョブインデックスが修飾子として使用されるため、結果が異なります。

このチュートリアルでは、虹のすべての色を持つテキストファイルを作成します。次に、インデックスをカラーファイルの行番号に使用できる値に変換する Dockerコンテナ 用のエントリポイントスクリプトを作成します (インデックスはゼロから始まり、行番号は 1 から始まります)。カラーファイルとインデックスファイルをコンテナイメージにコピーし、イメージの ENTRYPOINT をエントリポイントスクリプトに設定する Dockerfile を作成します。Dockerfile とリソースは Amazon ECR にプッシュされる Docker イメージに組み込まれています。次に、新しいコンテナイメージを使用するジョブ定義を登録し、そのジョブ定義で AWS Batch 配列ジョブを送信し、結果を表示します。

前提条件

このチュートリアルには、次のような前提条件があります。

  • AWS Batch コンピューティング環境。詳細については、「コンピューティング環境の作成」を参照してください。

  • AWS Batch ジョブキューおよび関連付けられたコンピューティング環境。詳細については、「ジョブキューの作成」を参照してください。

  • AWS CLI は、ローカルシステムにインストールされます。詳細については、AWS Command Line Interface ユーザーガイド の「AWS Command Line Interface のインストール」を参照してください。

  • Docker は、ローカルシステムにインストールされます。詳細については、Docker ドキュメントの「Docker CE について」を参照してください。

ステップ 1: コンテナイメージの構築

コマンドパラメータのジョブ定義で AWS_BATCH_JOB_ARRAY_INDEX を使用することはできますが、エントリポイントスクリプトで変数を使用するコンテナイメージを作成するほうがより簡単で強力です。このセクションでは、そのようなコンテナイメージを作成する方法について説明します。

Docker コンテナイメージを構築するには

  1. Docker イメージワークスペースとして使用する新しいディレクトリを作成し、そのディレクトリに移動します。

  2. WorkSpace ディレクトリで、colors.txt という名前のファイルを作成し、次のコードを貼り付けます。

    red orange yellow green blue indigo violet
  3. WorkSpace ディレクトリで、print-color.sh という名前のファイルを作成し、次のコードを貼り付けます。

    注記

    配列インデックスは 0 から始まり、行番号は 1 から始まるため、LINE 変数は AWS_BATCH_JOB_ARRAY_INDEX +1 に設定されます。COLOR 変数は、行番号に関連付けられている colors.txt の色に設定されます。

    #!/bin/sh LINE=$((AWS_BATCH_JOB_ARRAY_INDEX + 1)) COLOR=$(sed -n ${LINE}p /tmp/colors.txt) echo My favorite color of the rainbow is $COLOR.
  4. WorkSpace ディレクトリで、Dockerfile という名前のファイルを作成し、次のコードを貼り付けます。この Dockerfile は、以前のファイルをコンテナにコピーし、コンテナの起動時に実行するようにエントリポイントスクリプトを設定します。

    FROM busybox COPY print-color.sh /tmp/print-color.sh COPY colors.txt /tmp/colors.txt ENTRYPOINT /tmp/print-color.sh
  5. Docker イメージの構築:

    docker build -t print-color .
  6. 次のスクリプトを使用してコンテナをテストします。このスクリプトは、AWS_BATCH_JOB_ARRAY_INDEX 変数をローカルで 0 に設定し、それをインクリメントして 7 つの子がある配列ジョブが何をするのかをシミュレートします。

    AWS_BATCH_JOB_ARRAY_INDEX=0 while [ $AWS_BATCH_JOB_ARRAY_INDEX -le 6 ] do docker run -e AWS_BATCH_JOB_ARRAY_INDEX=$AWS_BATCH_JOB_ARRAY_INDEX print-color AWS_BATCH_JOB_ARRAY_INDEX=$((AWS_BATCH_JOB_ARRAY_INDEX + 1)) done

    出力:

    My favorite color of the rainbow is red. My favorite color of the rainbow is orange. My favorite color of the rainbow is yellow. My favorite color of the rainbow is green. My favorite color of the rainbow is blue. My favorite color of the rainbow is indigo. My favorite color of the rainbow is violet.

ステップ 2: イメージを Amazon ECR にプッシュする

Docker コンテナを構築してテストしたので、それをイメージリポジトリにプッシュする必要があります。この例では Amazon ECR を使用していますが、DockerHub などの別のレジストリを使用することもできます。

  1. コンテナイメージを保存する Amazon ECR イメージを作成します。簡潔にするために、この例では AWS CLI を使用しますが、AWS マネジメントコンソール も使用できます。詳細については、Amazon Elastic Container Registry ユーザーガイド の「リポジトリの作成」を参照してください。

    aws ecr create-repository --repository-name print-color
  2. 前のステップから返された Amazon ECR リポジトリ URI を使用して、print-color イメージにタグを付けます。

    docker tag print-color aws_account_id.dkr.ecr.region.amazonaws.com/print-color
  3. Amazon ECR レジストリの login コマンドを取得します。詳細については、Amazon Elastic Container Registry ユーザーガイドの「レジストリの認証」を参照してください。

    aws ecr get-login --no-include-email
  4. 前のステップで返された docker login ... コマンドを実行します。

  5. イメージを Amazon ECR にプッシュする:

    docker push aws_account_id.dkr.ecr.region.amazonaws.com/print-color

ステップ 3: ジョブ定義の作成と登録

Docker イメージがイメージレジストリにあるので、AWS Batch ジョブ定義で指定でき、後で配列ジョブを実行するために使用できます。簡潔にするために、この例では AWS CLI を使用しますが、AWS マネジメントコンソール も使用できます。詳細については、Amazon Elastic Container Registry ユーザーガイド の「ジョブ定義の作成」を参照してください。

ジョブ定義を作成するには

  1. WorkSpace ディレクトリで、print-color.json という名前のファイルを作成し、次のコードを貼り付けます。イメージリポジトリの URI を自分のイメージの URI に置き換えます。

    { "jobDefinitionName": "print-color", "type": "container", "containerProperties": { "image": "aws_account_id.dkr.ecr.region.amazonaws.com/print-color", "vcpus": 1, "memory": 250 } }
  2. AWS Batch でジョブ定義を登録します。

    aws batch register-job-definition --cli-input-json file://print-color.json

ステップ 4: AWS Batch 配列ジョブの送信

ジョブ定義を登録したら、新しいコンテナイメージを使用する AWS Batch 配列ジョブを送信できます。

AWS Batch 配列ジョブを送信するには

  1. WorkSpace ディレクトリで、print-color-job-def.json という名前のファイルを作成し、次のコードを貼り付けます。

    注記

    この例では、AWS Batch 初回実行ウィザードによって作成されるデフォルトのジョブキュー名を想定しています。ジョブキュー名が異なる場合は、first-run-job-queue の名前をジョブキュー名に置き換えます。

    { "jobName": "print-color", "jobQueue": "first-run-job-queue", "arrayProperties": { "size": 7 }, "jobDefinition": "print-color" }
  2. AWS Batch ジョブキューにジョブを送信します。出力で返されるジョブ ID を書き留めておいてください。

    aws batch submit-job --cli-input-json file://print-color-job-def.json
  3. ジョブのステータスを記述し、ジョブが SUCCEEDED に移動するのを待ちます。

ステップ 5: 配列ジョブログの表示

ジョブが SUCCEEDED ステータスになったら、ジョブのコンテナから CloudWatch Logs を表示できます。

CloudWatch Logs でジョブの ログを表示するには

  1. https://console.aws.amazon.com/batch/ で AWS Batch コンソールを開きます。

  2. 左のナビゲーションペインで [ジョブ] を選択します。

  3. [ジョブキュー] で、キューを選択します。

  4. [ステータス] セクションで、[成功] を選択します。

  5. 配列ジョブのすべての子ジョブを表示するには、前のセクションで返されたジョブ ID を選択します。

  6. ジョブのコンテナからログを表示するには、子ジョブのいずれかを選択し、[ログの表示] を選択します。

  7. 他の子ジョブのログを表示します。各ジョブは、虹の別の色を返します。