Help us improve the AWS re:Post Knowledge Center by sharing your feedback in a brief survey. Your input can influence how we create and update our content to better support your AWS journey.
我要如何在托管计算环境中将 Amazon EFS 卷挂载到 Amazon Batch?
我想要在 Amazon Batch 中挂载 Amazon Elastic File System (Amazon EFS) 卷。如何在不创建自定义 Amazon 系统映像 (AMI) 的情况下在托管计算环境中做到这一点?
简短描述
**注意:**作为任务定义的一部分,Amazon Batch 现在支持将 EFS 卷直接挂载到所创建的容器中。这种方法比本文中提到的解决方案更简单。有关更多信息,请参阅在任务定义中指定 Amazon EFS 文件系统和容器属性中的 efsVolumeConfiguration 参数。
使用启动模板将 Amazon EFS 卷挂载到 EC2 实例中,然后再挂载到容器中。这也使您能够通过 Amazon Batch 将 EFS 卷挂载到容器中,而无需创建自定义 AMI。
**重要提示:**在创建 Amazon EFS 卷时,请使用分配给您的计算环境的 Amazon Virtual Private Cloud (Amazon VPC) 和子网。
解决方案
**注意:**如果您在运行 Amazon 命令行界面(Amazon CLI)命令时收到错误,请确保您运行的是最新版本的 Amazon CLI。
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. 运行以下 Amazon CLI 命令以基于您在步骤 4 中创建的 mount-efs.json 文件创建启动模板:
aws ec2 --region us-east-1 create-launch-template --cli-input-json file://mount-efs.json
**注:**将 us-east-1 替换为您的亚马逊云科技区域。
示例 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 中创建的任务定义提交 Amazon Batch 任务。
