前提条件
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
が入っていない気がします・・
というわけで jq
と jsonlint
をそれぞれ入れておいてください。
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 ジョブの作成と実行へ