Cloudformationを使ってAWS Batch環境を構築してみる

AWS CloudFormation

どうも!西村祐二@大阪です。

2017年8月にCloudformationにてAWS Batchがサポートされましたので、Cloudformationの勉強を兼ねて試してみたいと思います。

さっそくやっていきましょう!

使用できるリソースタイプを確認

ドキュメントよりテンプレート作成時に使用できるリソースタイプを確認します。
AWS Batchでは下記3つのリソースタイプが使用できるようです。

1
2
3
AWS::Batch::ComputeEnvironment
AWS::Batch::JobDefinition
AWS::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:を使って参照することができます。

テンプレート作成時の必須の項目などはこちらのドキュメントを確認しながら作成するのが良いかと思います。

batch-env.yml
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-09
Description: 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を指定する必要があるので、先程作成した名前を指定しておきます。

batch-queue.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
###
AWSTemplateFormatVersion: 2010-09-09
Description: 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の設定がないとエラーとなるようです。

指定するコマンド、コンテナイメージは下記ブログで作成したものを指定しています。

batch-def.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
###
AWSTemplateFormatVersion: 2010-09-09
Description: 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セッションで確認できるようにしています。

batch.yml
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-09
Description: 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

さいごに

いかがだったでしょうか。
テンプレートの作成は慣れるまでなかなか大変ですが、
自在に扱えるようになればとても効率よく作業が行えるため
これからも積極的に利用していきたいと思います。

誰かの参考になれば幸いです。