Cloudformationを使ってAWS Batch環境を構築してみる
どうも!西村祐二@大阪です。
2017年8月にCloudformationにてAWS Batchがサポートされましたので、Cloudformationの勉強を兼ねて試してみたいと思います。
さっそくやっていきましょう!
使用できるリソースタイプを確認
ドキュメントよりテンプレート作成時に使用できるリソースタイプを確認します。
AWS Batchでは下記3つのリソースタイプが使用できるようです。
1 2 3 | AWS::Batch::ComputeEnvironmentAWS::Batch::JobDefinitionAWS::Batch::JobQueue |
環境
Mac: macOS Sierra 10.12.6
AWS CLI: aws-cli/1.11.145 Python/3.6.1 Darwin/16.7.0 botocore/1.7.3
事前準備
下記ブログで作成したAWS Batch環境を見本に今回作成しますので事前に確認をお願いします。
aws-cliのアップデート
最新のバージョンへアップデートしておいてください。
1 | $ sudo pip install -U awscli |
テンプレート作成
今回、AWS Batchの「Compute environments」「Job queues」「Job definitions」を構築するテンプレートを作成していきます。
いきなり、3つの環境を含めてたテンプレートを作成するのは大変なのでそれぞれ分割してテンプレートを作成し、あとで1つにまとめたいと思います。
Compute environmentsのテンプレートを作成
テンプレート内のServiceRole、SecurityGroupIds、Subnetsなどは適時自分の環境へ変更ください。
また、Parametersの使い方の勉強を兼ねて「名前」と「vCpu数」をParametersとしています。
Parametersセクションで指定された値はResourcesおよびOutputsセクションでRef:を使って参照することができます。
テンプレート作成時の必須の項目などはこちらのドキュメントを確認しながら作成するのが良いかと思います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | ###AWSTemplateFormatVersion: 2010-09-09Description: AWS Batch Compute environments from cfn###### ---Parameters---###Parameters: ComputeEnvironmentName: Default: cfn-env Type: String vCpuParameters: Default: 128 Description: instance vcpus Type: Number MaxValue: 256###### ---Resources:ComputeEnvironment---###Resources: TestComputerEnv: Type: "AWS::Batch::ComputeEnvironment" Properties: Type: MANAGED ServiceRole: arn:aws:iam::1234567890123:role/service-role/AWSBatchServiceRole ComputeEnvironmentName: Ref: ComputeEnvironmentName ComputeResources: MaxvCpus: Ref: vCpuParameters SecurityGroupIds: - sg-1234567 Type: EC2 Subnets: - subnet-xxxxxxxx - subnet-yyyyyyyy MinvCpus: 0 InstanceRole: ecsInstanceRole InstanceTypes: - optimal Tags: {"Name": "Batch Instance - cfn test"} DesiredvCpus: 0 State: ENABLED |
動作確認
▼スタック作成前に構文チェックを行いエラーがないことを確認します。
1 | $ aws cloudformation validate-template --template-body file://batch-env.yml |
▼今回スタック名を「batch-env」として作成します。
1 | $ aws cloudformation create-stack --stack-name batch-env --template-body file://batch-env.yml |
▼作成したスタックのステータスを確認します。
無事スタックの作成が完了したら下記コマンドより「CREATE_COMPLETE」が表示され、
テンプレートで設定した値で「cfn-env」という名前の「Compute environments」が作成されています。
失敗した場合は「ROLLBACK_COMPLETE」となりロールバックされます。
1 | $ aws cloudformation describe-stacks --stack-name batch-env | awk '{print $NF}' |
Job queuesのテンプレートを作成
同様にJob queuesのテンプレートを作成していきます。
ComputeEnvironmentを指定する必要があるので、先程作成した名前を指定しておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | ###AWSTemplateFormatVersion: 2010-09-09Description: AWS Batch Job queues from cfn######---Resources:JobQueue---###Resources: TestJobQueue: Type: AWS::Batch::JobQueue Properties: ComputeEnvironmentOrder: - Order: 1 ComputeEnvironment: cfn-env State: ENABLED Priority: 1 JobQueueName: cfn-queue |
動作確認
▼スタック作成前に構文チェックを行いエラーがないことを確認します。
1 | $ aws cloudformation validate-template --template-body file://batch-queue.yml |
▼今回スタック名を「batch-queue」として作成します。
1 | $ aws cloudformation create-stack --stack-name batch-queue --template-body file://batch-queue.yml |
▼作成したスタックのステータスを確認します。
無事スタックの作成が完了したら下記コマンドより「CREATE_COMPLETE」が表示され、
テンプレートで設定した値で「cfn-queue」という名前の「Job queues」が作成されています。
失敗した場合は「ROLLBACK_COMPLETE」となりロールバックされます。
1 | $ aws cloudformation describe-stacks --stack-name batch-queue | awk '{print $NF}' |
Job definitionsのテンプレートを作成
同様にJob definitionsのテンプレートを作成していきます。
ドキュメントには必須とのは記載ありませんが
RetryStrategyの設定がないとエラーとなるようです。
指定するコマンド、コンテナイメージは下記ブログで作成したものを指定しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | ###AWSTemplateFormatVersion: 2010-09-09Description: AWS Batch Job definitions from cfn######---Resources:JobDefinition---###Resources: TestJobDefinition: Type: AWS::Batch::JobDefinition Properties: Type: container JobDefinitionName: cfn-def ContainerProperties: Command: - sh /usr/local/init.sh Memory: 2000 Vcpus: 2 Image: 1234567890.dkr.ecr.ap-northeast-1.amazonaws.com/test-repo:latest RetryStrategy: Attempts: 1 |
動作確認
▼スタック作成前に構文チェックを行いエラーがないことを確認します。
1 | $ aws cloudformation validate-template --template-body file://batch-def.yml |
▼今回スタック名を「batch-def」として作成します。
1 | $ aws cloudformation create-stack --stack-name batch-def --template-body file://batch-def.yml |
▼作成したスタックのステータスを確認します。
無事スタックの作成が完了したら下記コマンドより「CREATE_COMPLETE」が表示され、
テンプレートで設定した値で「cfn-def」という名前の「Job definitions」が作成されています。
失敗した場合は「ROLLBACK_COMPLETE」となりロールバックされます。
1 | $ aws cloudformation describe-stacks --stack-name batch-def | awk '{print $NF}' |
スタックの削除
次に作成したテンプレートを1つにまとめるため、作成したスタックを削除しておきます。
JobQueueではComputeEnvironmentを指定しているため
「batch-env」より先に「batch-queue」を削除してください。
1 2 3 | $ aws cloudformation delete-stacks --stack-name batch-queue$ aws cloudformation delete-stacks --stack-name batch-env$ aws cloudformation delete-stacks --stack-name batch-def |
1つのテンプレートにまとめる
個別に作成した3つのテンプレートを1つのテンプレートにまとめてみます。
ポイントとして、「JobQueue」のリソースを作成する際に「ComputeEnvironment」を指定する必要があるので、!Ref TestComputerEnvとして、値を指定しています。
また、どんな値が得られるのかoutputセッションで確認できるようにしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | ###AWSTemplateFormatVersion: 2010-09-09Description: AWS Batch from cfn###### ---Parameters---###Parameters: ComputeEnvironmentName: Default: cfn-env Type: String JobQueueName: Default: cfn-queue Type: String JobDefinitionName: Default: cfn-def Type: String vCpuParameters: Default: 128 Description: instance cpus Type: Number MaxValue: 256###### ---Resources:ComputeEnvironment---###Resources: TestComputerEnv: Type: "AWS::Batch::ComputeEnvironment" Properties: Type: MANAGED ServiceRole: arn:aws:iam::1234567890123:role/service-role/AWSBatchServiceRole ComputeEnvironmentName: Ref: ComputeEnvironmentName ComputeResources: MaxvCpus: Ref: vCpuParameters SecurityGroupIds: - sg-123456789 Type: EC2 Subnets: - subnet-xxxxxxxx - subnet-yyyyyyyy MinvCpus: 0 InstanceRole: ecsInstanceRole InstanceTypes: - optimal Tags: {"Name": "Batch Instance - cfn test"} DesiredvCpus: 0 State: ENABLED######---Resources:JobQueue---### TestJobQueue: Type: AWS::Batch::JobQueue Properties: ComputeEnvironmentOrder: - Order: 1 ComputeEnvironment: !Ref TestComputerEnv State: ENABLED Priority: 1 JobQueueName: Ref: JobQueueName######---Resources:JobDefinition---### TestJobDefinition: Type: AWS::Batch::JobDefinition Properties: Type: container JobDefinitionName: Ref: JobDefinitionName ContainerProperties: Memory: 2000 Vcpus: 2 Image: 1234567890123.dkr.ecr.ap-northeast-1.amazonaws.com/test-repo:latest RetryStrategy: Attempts: 1###### ---output---###Outputs: Env: Description: Get Env Value: !Ref TestComputerEnv Queue: Description: Get Queue Value: !Ref TestJobQueue Definition: Description: Get Definition Value: !Ref TestJobDefinition |
動作確認
▼スタック作成前に構文チェックを行いエラーがないことを確認します。
1 | $ aws cloudformation validate-template --template-body file://batch.yml |
▼今回スタック名を「batch」として作成します。
スタック作成完了までに多少時間がかかるため、完了までwaitしてくれるコマンドをつなげておきます。
1 | $ aws cloudformation create-stack --stack-name batch --template-body file://batch.yml && aws cloudformation wait stack-create-complete --stack-name batch |
▼作成したスタックのステータスを確認します。
無事スタックの作成が完了したら下記コマンドより「CREATE_COMPLETE」が表示され、
テンプレートで設定したAWS Batchの環境が作成されています。
失敗した場合は「ROLLBACK_COMPLETE」となりロールバックされます。
1 | $ aws cloudformation describe-stacks --stack-name batch | awk '{print $NF}' |
スタックの削除
AWS Batchの環境が必要なくなったらスタックを削除することで環境をまとめて削除することができます。
削除完了まで多少時間がかかるため、削除が完了するまでwaitしてくるコマンドをつなげておきます。
1 | $ aws cloudformation delete-stack --stack-name batch && aws cloudformation wait stack-delete-complete --stack-name batch |
さいごに
いかがだったでしょうか。
テンプレートの作成は慣れるまでなかなか大変ですが、
自在に扱えるようになればとても効率よく作業が行えるため
これからも積極的に利用していきたいと思います。
誰かの参考になれば幸いです。