如何在托管计算环境中将 Amazon EFS 卷挂载到 AWS Batch?

上次更新日期:2021 年 3 月 12 日

我想要在 AWS Batch 中挂载 Amazon Elastic File System (Amazon EFS) 卷。如何在不创建自定义 Amazon 系统映像 (AMI) 的情况下在托管计算环境中做到这一点?

简短描述

要在不创建自定义 AMI 的情况下通过 AWS Batch 将 Amazon 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 分段存档

示例 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 Compute Cloud (Amazon EC2) 控制台中的启动模板,请确保您执行了以下操作之一:
以纯文本形式粘贴用户数据。
-或者-
从文件上传用户数据。

如果使用 AWS CLI 或 AWS 开发工具包,您首先必须对用户数据进行 base64 编码。然后,在调用 CreateLaunchTemplate 时提交该字符串作为 UserData 参数的值,如示例 JSON 模板所示。

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.    要检查 Amazon EFS 卷是否随容器实例一起挂载,请使用 SSH 连接到由 AWS Batch 启动的实例。然后,运行以下 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 作业


这篇文章对您有帮助吗?


您是否需要账单或技术支持?