マネージド型のコンピューティング環境で Amazon EFS ボリュームを AWS Batch にマウントするにはどうすればよいですか?

最終更新日: 2022 年 9 月 7 日

AWS Batch で Amazon Elastic File System (Amazon EFS) ボリュームをマウントしたいと考えています。カスタムの Amazon マシンイメージ (AMI) を作成せずに、マネージドコンピューティング環境でこれを行うにはどうすればよいですか?

簡単な説明

注: AWS Batch では、ジョブ定義の一部として、作成されたコンテナへの EFS ボリュームの直接マウントをサポートするようになりました。これは、この記事に記載されている解決方法よりも簡単な方法です。詳細については、「Specifying an Amazon EFS file system in your job definition」(ジョブ定義での Amazon EFS ファイルシステムの指定) および「Container properties」(コンテナプロパティ) の「efsVolumeConfiguration parameter」(efsVolumeConfiguration パラメータ) を参照してください。

起動テンプレートを使用して Amazon EFS ボリュームを EC2 インスタンスにマウントし、次にコンテナにマウントします。これにより、カスタム AMI を作成することなく、AWS Batch を通じて EFS ボリュームをコンテナにマウントすることもできます。

重要: Amazon EFS ボリュームを作成するときは、コンピューティング環境に割り当てられているものと同じ Amazon Virtual Private Cloud (Amazon VPC) とサブネットを使用します。

解決方法

注: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、最新の AWS CLI バージョンを使用していることを確認してください

1.    Amazon EFS ファイルシステムを作成します

2.    ファイルシステム ID を書き留めます (例:fs-12345678)。起動テンプレートを実行するには、ファイルシステム ID が必要です。

3.    ユーザーデータセクションを含み、MIME マルチパートファイル形式を使用する起動テンプレートを作成します。詳細については、Cloud-init ウェブサイトの「Mime Multi Part Archive」(Mime マルチパートアーカイブ) を参照してください。

MIME マルチパートファイルの例

注: 次の例の MIME マルチパートファイルは、amazon-efs-utils パッケージをインストールするようにコンピューティングリソースを設定します。その後、このファイルは、既存の Amazon EFS ファイルシステムを /mnt/efs: にマウントします。

MIME-Version: 1.0
Content-Type: multipart/mixed; boundary="==MYBOUNDARY=="

--==MYBOUNDARY==
Content-Type: text/cloud-config; charset="us-ascii"

packages:
- amazon-efs-utils

runcmd:
- file_system_id_01=fs-12345678
- efs_directory=/mnt/efs

- mkdir -p ${efs_directory}
- echo "${file_system_id_01}:/ ${efs_directory} efs tls,_netdev" >> /etc/fstab
- mount -a -t efs defaults

--==MYBOUNDARY==--

重要: fs-12345678 をファイルシステム ID に置き換えます。

4.    mount-efs.json というファイルを作成します。

注意: 必要に応じてボリュームのサイズを調整します。

Amazon Linux 2 起動テンプレートの例

{
  "LaunchTemplateName": "user-data",
  "LaunchTemplateData": {
    "BlockDeviceMappings": [
      {
        "Ebs": {
          "DeleteOnTermination": true,
          "VolumeSize": 30,
          "VolumeType": "gp2"
        },
        "DeviceName": "/dev/xvda"
      }
    ],
    "UserData": "TUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSI9PU1ZQk9VTkRBUlk9PSIKCi0tPT1NWUJPVU5EQVJZPT0KQ29udGVudC1UeXBlOiB0ZXh0L2Nsb3VkLWNvbmZpZzsgY2hhcnNldD0idXMtYXNjaWkiCgpwYWNrYWdlczoKLSBhbWF6b24tZWZzLXV0aWxzCgpydW5jbWQ6Ci0gZmlsZV9zeXN0ZW1faWRfMDE9ZnMtODc0MTc4MDYgICAgIAotIGVmc19kaXJlY3Rvcnk9L21udC9lZnMKCi0gbWtkaXIgLXAgJHtlZnNfZGlyZWN0b3J5fQotIGVjaG8gIiR7ZmlsZV9zeXN0ZW1faWRfMDF9Oi8gJHtlZnNfZGlyZWN0b3J5fSBlZnMgdGxzLF9uZXRkZXYiID4+IC9ldGMvZnN0YWIKLSBtb3VudCAtYSAtdCBlZnMgZGVmYXVsdHMKCi0tPT1NWUJPVU5EQVJZPT0tLQ=="
  }
}

Amazon Linux 1 起動テンプレートの例

{
  "LaunchTemplateName": "userdata",
  "LaunchTemplateData": {
    "BlockDeviceMappings": [
      {
        "Ebs": {
          "DeleteOnTermination": true,
          "VolumeSize": 8,
          "VolumeType": "gp2"
        },
        "DeviceName": "/dev/xvda"
      },
      {
        "Ebs": {
          "DeleteOnTermination": true,
          "VolumeSize": 22,
          "VolumeType": "gp2"
        },
        "DeviceName": "/dev/xvdcz"
      }
    ],
    "UserData": "TUlNRS1WZXJzaW9uOiAxLjAKQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSI9PU1ZQk9VTkRBUlk9PSIKCi0tPT1NWUJPVU5EQVJZPT0KQ29udGVudC1UeXBlOiB0ZXh0L2Nsb3VkLWNvbmZpZzsgY2hhcnNldD0idXMtYXNjaWkiCgpwYWNrYWdlczoKLSBhbWF6b24tZWZzLXV0aWxzCgpydW5jbWQ6Ci0gZmlsZV9zeXN0ZW1faWRfMDE9ZnMtODc0MTc4MDYgICAgIAotIGVmc19kaXJlY3Rvcnk9L21udC9lZnMKCi0gbWtkaXIgLXAgJHtlZnNfZGlyZWN0b3J5fQotIGVjaG8gIiR7ZmlsZV9zeXN0ZW1faWRfMDF9Oi8gJHtlZnNfZGlyZWN0b3J5fSBlZnMgdGxzLF9uZXRkZXYiID4+IC9ldGMvZnN0YWIKLSBtb3VudCAtYSAtdCBlZnMgZGVmYXVsdHMKCi0tPT1NWUJPVU5EQVJZPT0tLQ=="
  }
}

重要: Amazon Elastic コンピュートクラウド (Amazon EC2) コンソールで起動テンプレートにユーザーデータを追加する場合は、必ず次のいずれかを実行してください。
ユーザデータをプレーンテキストとして貼り付けます。
- または -
ファイルからユーザーデータをアップロードします。

AWS CLI または AWS SDK を使用する場合、最初にユーザーデータを base64 でエンコードする必要があります。次に、例の JSON テンプレートに示すように、CreateLaunchTemplate を呼び出すときに、その文字列を UserData パラメータの値として送信します。

5.    次の AWS CLI コマンドを実行して、ステップ 4 で作成した mount-efs.json ファイルに基づいて起動テンプレートを作成します。

aws ec2 --region us-east-1 create-launch-template --cli-input-json file://mount-efs.json

注: us-east-1 を AWS リージョンに置き換えます。

create-launch-template コマンドの出力例

{
  "LaunchTemplate": {
    "LaunchTemplateId": "lt-06935eb650e40f886",
    "LaunchTemplateName": "user-data",
    "CreateTime": "2019-12-26T09:40:46.000Z",
    "CreatedBy": "arn:aws:iam::12345678999:user/alice",
    "DefaultVersionNumber": 1,
    "LatestVersionNumber": 1
  }
}

6.    新しいコンピューティング環境を作成し、その環境を起動テンプレートに関連付けます。

注: これで、AWS Batch がインスタンスをスピンアップすると、Amazon EFS ボリュームがインスタンスにマウントされます。

7.    SSH を使用して AWS Batch によって起動したインスタンスに接続することで、Amazon EFS ボリュームがコンテナインスタンスにマウントされているかどうかを確認します。次に、以下の Linux df コマンドを実行します。

$ df -h

df コマンドの出力例

Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        3.9G   92K  3.9G   1% /dev
tmpfs           3.9G     0  3.9G   0% /dev/shm
/dev/xvda1       50G  854M   49G   2% /
127.0.0.1:/     8.0E     0  8.0E   0% /mnt/efs

注意: /mnt/efs は自動的にマウントされます。

8.    AWS Batch で、ボリュームとマウントポイントを含むジョブ定義を作成します。

AWS Batch ジョブ定義の例

{
  "jobDefinitionName": "userdata",
  "jobDefinitionArn": "arn:aws:batch:us-east-1:12345678999:job-definition/userdata:1",
  "revision": 1,
  "status": "ACTIVE",
  "type": "container",
  "parameters": {},
  "containerProperties": {
    "image": "busybox",
    "vcpus": 1,
    "memory": 1024,
    "command": [],
    "volumes": [
      {
        "host": {
          "sourcePath": "/mnt/efs"
        },
        "name": "efs"
      }
    ],
    "environment": [],
    "mountPoints": [
      {
        "containerPath": "/mnt/efs",
        "sourceVolume": "efs"
      }
    ],
    "ulimits": [],
    "resourceRequirements": []
  }
}

9.    ステップ 8 で作成したジョブ定義を使用して、AWS Batch ジョブを送信します。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?