[アップデート] AWS Batch がコンピューティング環境での Amazon Linux2 の利用をサポートしました

AWS Batch でも Amazon Linux2 を使おう
2020.11.29

先日のアップデートで Amazon Batch がコンピューティング環境での Amazon Linux2 の利用をサポートしました。

更新箇所

ここで設定できるようになりました。(デフォルトは Amazon Linux1 と記載されています。)

aws_batch_ec2_configuration

終わり。

というのもアレなので、構築して確認してみましょう。

はじめに

そもそも Amazon Linux 2 と Amazon Linux との違いについては、下記弊社ブログ、または よくある質問 - Amazon Linux 2 | AWS をご参照下さい。

[速報]5年長期サポートのAmazon Linux 2が一般公開されました

AWS Batch についても、基本的な概念や使い方を把握している方を対象とします。

AWS Batch とは?という方は、まずは下記弊社ブログをご確認頂ければと思います。

前提

  • CodeCommit に実行ファイルがプッシュ済み
  • ECR に Docker イメージがプッシュ済み

検証環境イメージ

awslogs で CloudWatch Logs に簡易なログを出力する Python とシェルスクリプトで対応します。

下図のような環境で検証します。

aws_batch_image

利用するリソースは下記ブログ構成とほぼ同様なので、最初から構築を試してみたい方はご参照下さい。

AWS Batchを使って5分以上かかる処理を実行してみる

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 を最新にしないと実行できません。

cfn_ec2_config

最新にする場合は、下記ご参照下さい。

AWS CLI バージョン 2 のインストール、更新、アンインストール - AWS Command Line Interface

今回の構築では、先に ecsInstanceRole に CodeCommit へのアクセス権限を付与しておく必要があります。

(図でいうところの⑤です。)

ecsinstance_roll

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. コンピューティング環境
  2. ジョブ定義
  3. ジョブキュー
  4. ジョブ

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 を見に行きます。

ec2_console_amz2

ちゃんと Amazon Linux2 で実行されています。

ちゃんとログも出力されています。

cloudwatch_logs

配列ジョブタイプでもやってみます。

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

ec2_array_batch

ちゃんと Amazon Linux2 で実行されていますね。

以上です。

Amazon Linux 2 を選択することで、さらにバッチパフォーマンスを向上させましょう!

(でも CFn しばらく対応しなそうだなー。)

なお、以前のバージョンであるAmazonLinux AMIはサポート終了(2020 年 12 月 31 日をもって終了))に近づいており、近い将来、デフォルトとしてAmazonLinux2に切り替えられることにご注意ください!

どなたかのお役に立てば幸いです。

参考