この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
先日のアップデートで Amazon Batch がコンピューティング環境での Amazon Linux2 の利用をサポートしました。
更新箇所
ここで設定できるようになりました。(デフォルトは Amazon Linux1 と記載されています。)
終わり。
というのもアレなので、構築して確認してみましょう。
はじめに
そもそも Amazon Linux 2 と Amazon Linux との違いについては、下記弊社ブログ、または よくある質問 - Amazon Linux 2 | AWS をご参照下さい。
[速報]5年長期サポートのAmazon Linux 2が一般公開されました
AWS Batch についても、基本的な概念や使い方を把握している方を対象とします。
AWS Batch とは?という方は、まずは下記弊社ブログをご確認頂ければと思います。
前提
- CodeCommit に実行ファイルがプッシュ済み
- ECR に Docker イメージがプッシュ済み
検証環境イメージ
awslogs で CloudWatch Logs に簡易なログを出力する Python とシェルスクリプトで対応します。
下図のような環境で検証します。
利用するリソースは下記ブログ構成とほぼ同様なので、最初から構築を試してみたい方はご参照下さい。
CodeCommitにプッシュする
## export_log.py
def export_log(x):
for number in range(0, x):
print(number)
if __name__ == '__main__':
export_log(10)
## run.sh
#!/bin/bash
python3 /usr/local/bin/demo-batch/export_log.py
ECRにプッシュする
## Dockerfile
FROM centos:latest
RUN yum install -y unzip
RUN yum install -y python3
RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
RUN unzip awscliv2.zip
RUN ./aws/install
RUN yum install -y git
ADD init.sh /usr/local/bin/init.sh
WORKDIR /tmp
## init.sh
#!/bin/bash
CODE_REPO=https://git-codecommit.ap-northeast-1.amazonaws.com/v1/repos/xxxxxxxxx
CODE_DIR=/usr/local/bin/demo-batch
git clone --config credential.helper='!aws --region ap-northeast-1 codecommit credential-helper $@' --config credential.UseHttpPath=true $CODE_REPO $CODE_DIR
sh /usr/local/bin/demo-batch/run.sh
やってみる
残念ながら、現在(2020/11/29)、CFnでの対応がされていないため、手動または AWS CLI で作成する必要があります。
なお、AWS CLI を最新にしないと実行できません。
最新にする場合は、下記ご参照下さい。
AWS CLI バージョン 2 のインストール、更新、アンインストール - AWS Command Line Interface
今回の構築では、先に ecsInstanceRole に CodeCommit へのアクセス権限を付与しておく必要があります。
(図でいうところの⑤です。)
AWS CLI で構築するために、コンピューティング環境の設定を aws_batch_setting.json
にまとめます。
{
"computeEnvironmentName": "Demo-stg-BatchComputeEnv",
"type": "MANAGED",
"state": "ENABLED",
"computeResources": {
"type": "EC2",
"allocationStrategy": "BEST_FIT_PROGRESSIVE",
"ec2Configuration": [
{
"imageType": "ECS_AL2"
},
],
"minvCpus": 0,
"maxvCpus": 128,
"desiredvCpus": 0,
"instanceTypes": ["m5.large"],
"subnets": ["subnet-xxxxxx", "subnet-xxxxxx"],
"securityGroupIds": ["sg-xxxxxxx"],
"instanceRole": "ecsInstanceRole",
"tags": {
"Name": "AWS Batch Instance"
}
},
"serviceRole": "arn:aws:iam::xxxxxxxxx:role/service-role/AWSBatchServiceRole"
}
aws batch create-compute-environment --cli-input-json file://aws_batch_setting.json
AWS Batch の大きな構成要素は下記ですが、
- コンピューティング環境
- ジョブ定義
- ジョブキュー
- ジョブ
1 は作成済み、4 は別途実行タイミングで設定するので、2,3をCFnで構築します。(この程度なら手動でも良い気がしますが。)
AWSTemplateFormatVersion: '2010-09-09'
Description: AWS Batch CloudFormation
# ------------------------------------------------------------#
# Parameters
# ------------------------------------------------------------#
Parameters:
NameTagPrefix:
Type: String
Default: demo
Description: Prefix of Name tags.
ENV:
Type: String
Default: stg
Description: Env Variable tags.
AWSBatchComputeEnv:
Type: String
Default: 'arn:aws:batch:ap-northeast-1:xxxxxxxxxx:compute-environment/Demo-stg-BatchComputeEnv'
Description: AWSBatchComputeEnv.
ECRImageID:
Type: String
Default: 'xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/demo-aws-batch:x.x.x.x'
Description: ECR Image ID.
# ------------------------------------------------------------#
# Resources
# ------------------------------------------------------------#
Resources:
# ------------------------------------------------------------#
# AWS Batch
# ------------------------------------------------------------#
AWSBatchJobQueue:
Type: AWS::Batch::JobQueue
Properties:
ComputeEnvironmentOrder:
- Order: 1
ComputeEnvironment: !Ref AWSBatchComputeEnv
JobQueueName: !Sub ${NameTagPrefix}-${ENV}-BatchComputeEnv-JobQueues
Priority: 1
State: ENABLED
AWSBatchJobDefinition:
Type: AWS::Batch::JobDefinition
Properties:
Type: container
JobDefinitionName: !Sub ${NameTagPrefix}-${ENV}-BatchComputeEnv-Job-Def
ContainerProperties:
Command:
- sh
- /usr/local/bin/init.sh
Memory: 1048
Vcpus: 1
Image: !Ref ECRImageID
RetryStrategy:
Attempts: 1
スタック作成が完了確認できたらジョブ実行してみます。
単一ジョブです。
aws batch submit-job --job-name demo-job --job-queue Demo-stg-BatchComputeEnv-JobQueues --job-definition Demo-stg-BatchComputeEnv-Job-Def:x
EC2 を見に行きます。
ちゃんと Amazon Linux2 で実行されています。
ちゃんとログも出力されています。
配列ジョブタイプでもやってみます。
aws batch submit-job --job-name demo-job --job-queue Demo-stg-BatchComputeEnv-JobQueues --job-definition Demo-stg-BatchComputeEnv-Job-Def:x --array-properties size=3
ちゃんと Amazon Linux2 で実行されていますね。
以上です。
Amazon Linux 2 を選択することで、さらにバッチパフォーマンスを向上させましょう!
(でも CFn しばらく対応しなそうだなー。)
なお、以前のバージョンであるAmazonLinux AMIはサポート終了(2020 年 12 月 31 日をもって終了))に近づいており、近い将来、デフォルトとしてAmazonLinux2に切り替えられることにご注意ください!
どなたかのお役に立てば幸いです。