AWS
aws-cli
AWS-Batch

[JAWS-UG CLI] AWS Batch #1 環境構築(Unmanaged 編)

More than 1 year has passed since last update.

前提条件

EC2への権限

EC2、ECS、AWS Batch などに対してフル権限があること。

0. 準備

0.1. AWS CLIのバージョン

以下のバージョンで動作確認済

  • AWS CLI 1.11.36
コマンド
aws --version
結果(例)
 aws-cli/1.11.36 Python/2.7.5 Darwin/13.4.0 botocore/1.4.93

バージョンが古い場合は最新版に更新しましょう。

コマンド
sudo -H pip install -U awscli

0.2. リージョンの決定

2017 年 6 月、AWS Batch が東京でリリースされたので、東京を指定してみましょう。

変数の設定
export AWS_DEFAULT_REGION='ap-northeast-1'

0.3. 資格情報の確認

プロファイルが想定のものになっていることを確認します。

変数の確認
aws configure list
結果(例)
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                  default           manual    --profile
access_key     ****************XXXX shared-credentials-file    
secret_key     ****************XXXX shared-credentials-file    
    region                ap-northeast-1              env    AWS_DEFAULT_REGION

0.4. AWS アカウントの属性

EC2-Classic が見えない AWS アカウントであること。

コマンド
AWS_SUPPORT_PLATFORMS=$( \
         aws ec2 describe-account-attributes \
           --query 'AccountAttributes[?AttributeName == `supported-platforms`].AttributeValues[].AttributeValue' \
           --output text \
) && echo ${AWS_SUPPORT_PLATFORMS}
結果
 VPC

注釈: VPC の他に EC2 が表示される場合、別のアカウントを作成してください。

0.5. VPC / IAM ロールの作成

CloudFormation テンプレートのファイル名を定義

コマンド
CFN_STACK_NAME="aws-batch-`date +%s`"

テンプレートの取得

コマンド
curl --location --output ${CFN_STACK_NAME}.yaml \
  https://raw.githubusercontent.com/supinf/aws-batch-refarch/master/cloudformation/base.yaml

CloudFormation スタックの生成

コマンド
aws cloudformation create-stack \
  --stack-name ${CFN_STACK_NAME} \
  --template-body file://${CFN_STACK_NAME}.yaml \
  --capabilities CAPABILITY_IAM
結果(例)
{
    "StackId": "arn:aws:cloudformation:ap-northeast-1:xxxxxxxxxxxx:stack/aws-batch-xxxxxxxxxx/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

このスタックにより以下のリソースが作成されます

  • AWS Batch 用 VPC
  • AWS Batch 用サービスロール
  • SpotFleet 用サービスロール
  • EC2 インスタンスプロフィール
  • EC2 インスタンス用セキュリティグループ

0.6. EC2 キーペアの作成

以下の手順を参考にキーペアを作ります。

[JAWS-UG CLI] EC2:#1 キーペアの作成 (新規)

キーペアの確認

コマンド
aws ec2 describe-key-pairs \
  --key-names ${EC2_KEY_NAME}

指定したキーペアの情報が返ることを確認します

結果(例)
{
    "KeyPairs": [
        {
            "KeyName": "your-keypair-name", 
            "KeyFingerprint": "xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"
        }
    ]
}

0.7. jq や jsonlint のインストール

最新の aws-cli には jp.py が入っていない気がします・・
というわけで jqjsonlint をそれぞれ入れておいてください。

1. クラスタ起動

1.1. コンピューティング環境名の指定

環境名の指定

コマンド
COMPUTE_ENV_NAME="aws-batch-unmanaged-`date +%s`"

同名の環境がないことを確認

コマンド
aws batch describe-compute-environments \
  --compute-environments ${COMPUTE_ENV_NAME}
結果
{
    "computeEnvironments": []
}

1.2. 利用する VPC / IAM の変数定義

スタックの生成を待機

コマンド
aws cloudformation wait stack-create-complete \
  --stack-name ${CFN_STACK_NAME}
結果
返り値なし

生成結果を取得

コマンド
CFN_STACK_RESULT=$( aws cloudformation describe-stacks \
  --stack-name ${CFN_STACK_NAME} \
) && echo ${CFN_STACK_RESULT} | jq .

スタックの生成結果(Output)から、後から必要になる変数を抜き出します。

コマンド
BATCH_SERVICE_ROLE=$( echo ${CFN_STACK_RESULT} \
  | jq '.Stacks[].Outputs[]' \
  | jq -r 'select(.OutputKey=="AWSBatchServiceRole").OutputValue' )

EC2_INSTANCE_PROFILE=$( echo ${CFN_STACK_RESULT} \
  | jq '.Stacks[].Outputs[]' \
  | jq -r 'select(.OutputKey=="BatchInstanceProfile").OutputValue' )

VPC_SUBNET_1=$( echo ${CFN_STACK_RESULT} \
  | jq '.Stacks[].Outputs[]' \
  | jq -r 'select(.OutputKey=="PublicSubnet1").OutputValue' )

VPC_SUBNET_2=$( echo ${CFN_STACK_RESULT} \
  | jq '.Stacks[].Outputs[]' \
  | jq -r 'select(.OutputKey=="PublicSubnet2").OutputValue' )

VPC_SECURITY_GROUP=$( echo ${CFN_STACK_RESULT} \
  | jq '.Stacks[].Outputs[]' \
  | jq -r 'select(.OutputKey=="SecurityGroup").OutputValue' )

1.3. コンピューティング環境の作成

AWS Batch では、コンピューティング環境として MANAGED または UNMANAGED が選択できます。
MANAGED を選択すると、ECS クラスタも起動してくれるタイプ、
UNMANAGED は自分で ECS クラスタを用意するタイプです。

今回は UNMANAGED な環境を作成しましょう。

コマンド
aws batch create-compute-environment \
  --compute-environment-name ${COMPUTE_ENV_NAME} \
  --type UNMANAGED \
  --service-role ${BATCH_SERVICE_ROLE}
結果(例)
{
    "computeEnvironmentName": "aws-batch-unmanaged-xxxxxxxxxx", 
    "computeEnvironmentArn": "arn:aws:batch:ap-northeast-1:xxxxxxxxxxxx:compute-environment/aws-batch-refarch"
}

1.4. ECS クラスタ ARN の確認

作成した環境の status が VALID
state が ENABLED であることを確認しましょう。
status が CREATING である場合 VALID になるまでお待ちください・・

コマンド
COMPUTE_ENV=$( aws batch describe-compute-environments \
  --compute-environments ${COMPUTE_ENV_NAME} \
) && echo ${COMPUTE_ENV} | jq .
結果(例)
{
  "computeEnvironments": [
    {
      "status": "VALID",
      "serviceRole": "arn:aws:iam::xxxxxxxxxxxx:role/service-role/aws-batch-xxxxxxxxxx-AWSBatchServiceRole-xxxxxxxxxxxx", 
      "computeEnvironmentArn": "arn:aws:batch:ap-northeast-1:xxxxxxxxxxxx:compute-environment/aws-batch-unmanaged-xxxxxxxxxx",
      "statusReason": "ComputeEnvironment Healthy",
      "ecsClusterArn": "arn:aws:ecs:ap-northeast-1:xxxxxxxxxxxx:cluster/aws-batch-unmanaged-xxxxxxxxxx_Batch_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", 
      "state": "ENABLED",
      "computeEnvironmentName": "aws-batch-unmanaged-xxxxxxxxxx",
      "type": "UNMANAGED"
    }
  ]
}

2. ECS クラスタの構築

2.1. クラスタのための変数確認

ECS クラスタ ARN の取得

コマンド
ECS_ARN=$( echo ${COMPUTE_ENV} | jq -r \
  '.computeEnvironments[0].ecsClusterArn' )

このクラスタにコンテナインスタンスを起動します。
変数を確認します

コマンド
cat << ETX

    VPC_SUBNET_1:         ${VPC_SUBNET_1}
    VPC_SUBNET_2:         ${VPC_SUBNET_2}
    EC2_INSTANCE_PROFILE: ${EC2_INSTANCE_PROFILE}
    EC2_KEY_NAME:         ${EC2_KEY_NAME}
    VPC_SECURITY_GROUP:   ${VPC_SECURITY_GROUP}
    ECS_ARN:              ${ECS_ARN}

ETX
結果(例)
    VPC_SUBNET_1:         subnet-xxxxxxxx
    VPC_SUBNET_2:         subnet-xxxxxxxx
    EC2_INSTANCE_PROFILE: arn:aws:iam::xxxxxxxxxxxx:instance-profile/aws-batch-xxxxxxxxxx-BatchInstanceProfile-xxxxxxxxxxxx
    EC2_KEY_NAME:         your-key-name
    VPC_SECURITY_GROUP:   sg-xxxxxxxx
    ECS_ARN:              arn:aws:ecs:ap-northeast-1:xxxxxxxxxxxx:cluster/aws-batch-unmanaged_Batch_xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

2.2. CloudFormation スタックの生成

テンプレートの取得

コマンド
curl --location --output ${CFN_STACK_NAME}-ecs.yaml \
  https://raw.githubusercontent.com/supinf/aws-batch-refarch/master/cloudformation/unmanaged-ecs.yaml

CloudFormation スタックの生成

コマンド
aws cloudformation create-stack \
  --stack-name ${CFN_STACK_NAME}-ecs \
  --template-body file://${CFN_STACK_NAME}-ecs.yaml \
  --parameters ParameterKey=Subnet1,ParameterValue=${VPC_SUBNET_1} \
               ParameterKey=Subnet2,ParameterValue=${VPC_SUBNET_2} \
               ParameterKey=InstanceType,ParameterValue=t2.micro \
               ParameterKey=InstanceProfile,ParameterValue=${EC2_INSTANCE_PROFILE} \
               ParameterKey=KeyName,ParameterValue=${EC2_KEY_NAME} \
               ParameterKey=SecurityGroup,ParameterValue=${VPC_SECURITY_GROUP} \
               ParameterKey=ECSCluster,ParameterValue=${ECS_ARN}
結果(例)
{
    "StackId": "arn:aws:cloudformation:ap-northeast-1:xxxxxxxxxxxx:stack/aws-batch-xxxxxxxxxx-ecs/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
}

このスタックにより以下のリソースが作成されます

  • AutoScalingGroup
  • EC2 インスタンス

2.3. スタック生成を待機

コマンド
aws cloudformation wait stack-create-complete \
  --stack-name ${CFN_STACK_NAME}-ecs
結果
返り値なし

3. ジョブキューの作成

3.1. ジョブキュー名の指定

ジョブキュー名の指定

コマンド
JOB_QUEUE_NAME="aws-batch-job-queue-`date +%s`"

同名のジョブキューがないことを確認

コマンド
aws batch describe-job-queues \
  --job-queues ${JOB_QUEUE_NAME}
結果
{
    "jobQueues": []
}

3.2. ジョブキューの作成

ジョブキューの優先順位は 1 〜 10 で指定しますが、今回は 5 にします

コマンド
JOB_QUEUE_PRIORITY=5

ジョブキューには 3 つまでコンピューティング環境を関連づけられますが
今回は先ほど作成した環境でのみ実行可能なジョブキューを作成します。

コマンド
aws batch create-job-queue \
  --job-queue-name ${JOB_QUEUE_NAME} \
  --priority ${JOB_QUEUE_PRIORITY} \
  --compute-environment-order \
  order=1,computeEnvironment=${COMPUTE_ENV_NAME}
結果(例)
{
    "jobQueueArn": "arn:aws:batch:ap-northeast-1:xxxxxxxxxxxx:job-queue/aws-batch-job-queue-xxxxxxxxxx", 
    "jobQueueName": "aws-batch-job-queue-xxxxxxxxxx"
}

3.3. ジョブキューの確認

作成したジョブキューの status が VALID
state が ENABLED であることを確認しましょう。

コマンド
aws batch describe-job-queues \
  --job-queues ${JOB_QUEUE_NAME}
結果
{
    "jobQueues": [
        {
            "status": "VALID", 
            "jobQueueArn": "arn:aws:batch:ap-northeast-1:xxxxxxxxxxxx:job-queue/aws-batch-job-queue-xxxxxxxxxx", 
            "computeEnvironmentOrder": [
                {
                    "computeEnvironment": "arn:aws:batch:ap-northeast-1:xxxxxxxxxxxx:compute-environment/aws-batch-refarch", 
                    "order": 1
                }
            ], 
            "statusReason": "JobQueue Healthy", 
            "priority": 5, 
            "state": "ENABLED", 
            "jobQueueName": "aws-batch-job-queue-xxxxxxxxxx"
        }
    ]
}

完了

環境構築は以上です。
AWS Batch #2 ジョブの作成と実行