如何在托管计算环境中将 Amazon EFS 卷挂载到 AWS Batch?
上次更新时间:2020 年 6 月 12 日
我想要在 AWS Batch 中挂载 Amazon Elastic File System (Amazon EFS) 卷。
简短描述
您可以使用启动模板通过 AWS Batch 将 Amazon EFS 卷挂载到您的容器上,而无需创建自定义 Amazon 系统映像 (AMI)。
重要提示:在创建 Amazon EFS 卷时,请使用分配给您的计算环境的 Amazon Virtual Private Cloud (Amazon VPC) 和子网。
解决方法
2. 记下您的文件系统的文件系统 ID(例如 fs-12345678)。
3. 在启动模板中,使用 MIME 分段文件格式创建用户数据部分。 有关更多信息,请参阅 Cloud-init 网站上的 Mime 分段存档。
以下示例中的 MIME 分段文件配置了计算资源以安装 amazon-efs-utils 软件包,然后在 /mnt/efs 中挂载现有 Amazon 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 命令行界面 (AWS CLI) 或 AWS 开发工具包,您首先必须对用户数据进行 base64 编码。然后,在调用 CreateLaunchTemplate 时提交该字符串作为 UserData 参数的值,如前面的 JSON 模板所示。
5. 根据您在步骤 4 中创建的 mount-efs.json 文件创建启动模板。
aws ec2 --region us-east-1 create-launch-template --cli-input-json file://mount-efs.json
注意:将 us-east-1 替换为您的 AWS 区域。
输出与以下类似:
{
"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 启动的实例,然后运行以下命令:
$ df -h
输出与以下类似:
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. 创建作业定义(包括卷和挂载点)。请参阅以下示例:
{
"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 作业。