ようへいの日々精進XP

よかろうもん

AWS Batch で利用する Managed なコンピューティング環境の EBS ボリュームサイズを拡張する (Amazon Linux 1 編)

tl;dr

AWS Batch で利用するマネージドなコンピューティング環境 (Amazon Linux 1) で EBS ボリュームサイズ不足によりエラーになった際の対処 (ボリュームサイズの拡張と Docker ストレージの拡張) についてメモしておきます.

尚, AWS Batch のコンピューティング環境では, Amazon Linux 1 及び Amazon Linux 2, 及びカスタマイズした AMI を利用することが可能ですが, 本記事では Amazon Linux 1 向けの対処方法についてのみ 記載します.

対処

概要

以下のような対応を行います.

  1. Launch Template を利用してコンピューティング環境にて利用する EBS ボリュームの拡張
  2. Docker ストレージの拡張
  3. コンピューティング環境の作成
  4. ジョブキューの修正 (3. で作成したコンピューティング環境を設定する)

EBS ボリュームサイズの拡張

コンピューティング環境の構成を変更したい場合, Launch Template を利用することが出来るので, 以下のように Launch Template 用の JSON ファイルを用意します. ファイル名は任意の名前で問題ありませんが, 今回は launch-template.json で作成します.

{
    "LaunchTemplateName":"my-aws-batch-launch-template",
    "LaunchTemplateData": {
        "BlockDeviceMappings": [
          {
            "Ebs": {
              "DeleteOnTermination": true,
              "VolumeSize": 50,
              "VolumeType": "gp2"
            },
            "DeviceName": "/dev/xvdcz"
          }
        ]
  }
}

AWS Batch のコンピューティング環境で利用される Amazon Linux 1 では, EBS ボリューム (/dev/xvda および /dev/xvdcz) が付属していますが, 今回は Docker が利用する /dev/xvdcz のみを拡張する為, 上記のような内容となります. もし, /dev/xvda も拡張したい場合には, 以下のように記載する必要があります.

{
    "LaunchTemplateName":"increase-all-volume",
    "LaunchTemplateData": {
        "BlockDeviceMappings": [
          {
            "Ebs": {
              "DeleteOnTermination": true,
              "VolumeSize": 50,
              "VolumeType": "gp2"
            },
            "DeviceName": "/dev/xvda"
          },
          {
            "Ebs": {
              "DeleteOnTermination": true,
              "VolumeSize": 75,
              "VolumeType": "gp2"
            },
            "DeviceName": "/dev/xvdcz"
          }          
        ]
  }
}

以下のように AWS CLI (aws ec2 create-launch-template) を利用して Launch Template を作成します.

$ aws ec2 create-launch-template --cli-input-json file://launch-template.json

以下のように出力されます.

{
    "LaunchTemplate": {
        "LaunchTemplateId": "lt-xxxxxxxxxxxxxxxxxxxxxxx",
        "LaunchTemplateName": "my-aws-batch-launch-template",
        "CreateTime": "2020-07-20T06:53:30+00:00",
        "CreatedBy": "arn:aws:iam::270040163539:user/xxxxxxxxxxxxxxxx",
        "DefaultVersionNumber": 1,
        "LatestVersionNumber": 1
    }
}

この状態では, 単にボリュームサイズを拡張するだけでなので, 以下を実行して Docker が利用するストレージ自体も拡張する必要があります.

Docker ストレージの拡張

Docker ストレージの拡張

Docker が利用するストレージ (以後, Docker ストレージ) を拡張する場合, /etc/sysconfig/docker に以下のような設定を書き込む必要があります.

OPTIONS="${OPTIONS} --storage-opt dm.basesize=50G"

この設定は, ざっくり言うと, Docker ストレージを 50GB で起動する設定で, Docker デーモン (厳密に言うとストレージドライバ) の起動パラメータとして指定します. dm.basesize のデフォルトは 10GB となっています.

この設定を EC2 が起動するタイミングで /etc/sysconfig/docker に書き込む必要がある為, cloud-init-per ユーティリティを利用します.

cloud-init-per once docker_options echo 'OPTIONS="${OPTIONS} --storage-opt dm.basesize=50G"' >> /etc/sysconfig/docker

cloud-init-per コマンドは, 指定した頻度でインスタンスのブートフックコマンドを作成するために使用します. 上記の場合には once なので, 起動時に 1 回書き込まれることになります.

インスタンス起動時に実行させる

先述の cloud-init-per コマンドをインスタンスの起動時に実行したいので, 以下のようなシェルスクリプトを UserData に書き込みます.

#cloud-boothook
#!/bin/bash
cloud-init-per once docker_options echo 'OPTIONS="${OPTIONS} --storage-opt dm.basesize=50G"' >> /etc/sysconfig/docker

但し, Launch Template の UserData 項目には以下のように MIME タイプを指定して書き込むか...

Content-Type: multipart/mixed; boundary="==BOUNDARY=="
MIME-Version: 1.0
--==BOUNDARY==
Content-Type: text/cloud-boothook; charset="us-ascii"
#cloud-boothook
#!/bin/bash
cloud-init-per once docker_options echo 'OPTIONS="${OPTIONS} --storage-opt dm.basesize=50G"' >> /etc/sysconfig/docker
--==BOUNDARY==

先述のシェルスクリプトBase64エンコードして以下のようにテンプレート JSON に含める必要があります.

{
    "LaunchTemplateName": "base64-user-data",
    "LaunchTemplateData": {
        "UserData": "ewogICAgIkxhdW5jaFRlbXBsYXRlTmFtZSI6ICJpbmNyZWFzZS1jb250YWluZXItdm9sdW..."
    }
}

コンピューティング環境の作成

コンピューティング環境を作成する際, 下図のように Launch Template を指定して作成します.

f:id:inokara:20200721231302p:plain

合わせて, テンプレートバージョンも指定する必要があります. $Latest を指定すると, 常に最新の Launch Template を利用することが可能です.

尚, 一度作ったコンピューティング環境の Launch Template は変更が出来ないので, 変更したい場合には Launch Template を再作成する必要があります.

ジョブキューの修正

コンピューティング環境はジョブキューに紐付いている為, ジョブキューの修正を行います.

f:id:inokara:20200721231246p:plain

上図の通り, ジョブキューには複数のコンピューティング環境を紐付けることが出来ます. また, 順番を指定することが出来るので, 必要に応じて順番を変更することも可能なので, 動作確認も行い易いと思います.

以上

ざっくりとですがメモでした.

以下の参考に掲載されているドキュメントに全て記載されていることをただなぞっただけですが, 手を動かしてみたことで, 今まで触らず嫌いだった AWS Batch がそこまで難しいサービスではないことが解りました. また, cloud-init や Dockerd についても細かいパラメータの意味等を知ることが出来て良かったです.

参考

aws.amazon.com

aws.amazon.com

aws.amazon.com

docs.aws.amazon.com

docs.docker.com