启动模板支持 - AWS Batch
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

启动模板支持

AWS Batch 支持在 EC2 计算环境中使用 Amazon EC2 启动模板。使用启动模板,您可以修改 AWS Batch 计算资源的默认配置,而无需创建自定义的 AMIs。

注意

资源不支持启动模板。AWS Fargate

您必须先创建启动模板,然后才能将其与计算环境关联。您可以在 Amazon EC2 控制台中创建启动模板,也可以使用 AWS CLI 或 AWS 开发工具包。例如,以下 JSON 文件表示一个启动模板,它调整默认 AWS Batch 计算资源 AMI 的 Docker 数据卷的大小,并将其设置为加密。

{ "LaunchTemplateName": "increase-container-volume-encrypt", "LaunchTemplateData": { "BlockDeviceMappings": [ { "DeviceName": "/dev/xvdcz", "Ebs": { "Encrypted": true, "VolumeSize": 100, "VolumeType": "gp2" } } ] } }

您可以通过将 JSON 保存到名为 lt-data.json 的文件并运行以下 AWS CLI 命令来创建以前的启动模板:

aws ec2 --region <region> create-launch-template --cli-input-json file://lt-data.json

有关启动模板的更多信息,请参阅 https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/ec2-launch-templates.html 中的从启动模板启动实例Amazon EC2 用户指南(适用于 Linux 实例)。

如果使用启动模板来创建计算环境,则可以将以下现有计算环境参数移至启动模板:

注意

如果在启动模板和计算环境配置中都指定了这些参数中的任何一个(Amazon EC2 标签除外),则计算环境参数优先。Amazon EC2 标签将在启动模板和计算环境配置之间合并。如果标签键发生冲突,则计算环境配置中的值优先。

  • Amazon EC2 密钥对

  • Amazon EC2 AMI ID

  • 安全组 IDs

  • Amazon EC2 标签

忽略以下启动模板参数:AWS Batch

  • 实例类型(在创建计算环境时指定所需的实例类型)

  • 实例角色(在创建计算环境时指定所需的实例角色)

  • 网络接口子网(在创建计算环境时指定所需的子网)

  • 实例市场选项(AWS Batch 必须控制 Spot 实例配置)

  • 禁用 API 终止(AWS Batch 必须控制实例生命周期)

AWS Batch 不支持使用新的启动模板版本更新计算环境。如果更新启动模板,则必须使用新模板创建新计算环境以使更改生效。

启动模板中的 Amazon EC2 用户数据

您可以在启动模板中提供在实例启动时由 Amazon EC2cloud-init 运行的 用户数据。您的用户数据可以执行常见的配置方案,包括但不限于:

启动模板中的 Amazon EC2 用户数据必须采用 MIME 分段存档格式。这是因为您的用户数据已与配置计算资源所需的其他 AWS Batch 用户数据合并。您可以将多个用户数据块合并到一个 MIME 分段文件中。例如,您可能希望将配置 Docker 守护程序的云 boothook 与为 Amazon ECS 容器代理写入配置信息的用户数据 Shell 脚本合并。

如果您使用的是 AWS CloudFormation,AWS::CloudFormation::Init 类型可以与 cfn-init 帮助程序脚本一起使用以执行常见的配置方案。

MIME 分段文件包含以下组成部分:

  • 内容类型和段边界声明:Content-Type: multipart/mixed; boundary="==BOUNDARY=="

  • MIME 版本声明:MIME-Version: 1.0

  • 包含以下组件的一个或多个用户数据块:

    • 表明用户数据块的开头的起始边界:--==BOUNDARY==

    • 数据块的内容类型声明:Content-Type: text/cloud-config; charset="us-ascii"。 有关内容类型的更多信息,请参阅 Cloud-Init 文档

    • 用户数据的内容,例如,Shell 命令或 cloud-init 指令的列表

  • 表示 MIME 分段文件末尾的封闭边界:--==BOUNDARY==--

下面是可用于创建您自己的文件的示例 MIME 分段文件。

注意

如果您在 Amazon EC2 控制台中将用户数据添加到启动模板,则可以将其以明文形式粘贴或从文件上传。如果您使用 AWS CLI 或 AWS 开发工具包,则必须先对用户数据进行 base64 编码,并在调用 UserDataCreateLaunchTemplate 时将该字符串作为 参数值提交,如此 JSON 中所示。

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

例如:挂载现有 Amazon EFS 文件系统

此示例 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-abcdef123 - 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==--

例如:覆盖默认 Amazon ECS 容器代理配置

此示例 MIME 分段文件将覆盖计算资源的默认 Docker 映像清除设置。

MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="==MYBOUNDARY==" --==MYBOUNDARY== Content-Type: text/x-shellscript; charset="us-ascii" #!/bin/bash echo ECS_IMAGE_CLEANUP_INTERVAL=60m >> /etc/ecs/ecs.config echo ECS_IMAGE_MINIMUM_CLEANUP_AGE=60m >> /etc/ecs/ecs.config --==MYBOUNDARY==--

例如:挂载现有 Amazon FSx for Lustre 文件系统

此示例 MIME 分段文件将配置计算资源以从 Extras 库安装 lustre2.10 程序包,并在 Amazon FSx for Lustre 处挂载现有 /scratch 文件系统。 此示例适用于 Amazon Linux 2。有关其他 Linux 发行版的安装说明,请参阅 https://docs.amazonaws.cn/fsx/latest/LustreGuide/install-lustre-client.html 中的安装 Lustre 客户端Amazon FSx for Lustre 用户指南。

MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="==MYBOUNDARY==" --==MYBOUNDARY== Content-Type: text/cloud-config; charset="us-ascii" runcmd: - file_system_id_01=fs-0abcdef1234567890 - region=us-east-2 - fsx_directory=/scratch - amazon-linux-extras install -y lustre2.10 - mkdir -p ${fsx_directory} - mount -t lustre ${file_system_id_01}.fsx.${region}.amazonaws.com@tcp:fsx ${fsx_directory} --==MYBOUNDARY==--

在容器属性的mountPoints成员中,装载点必须映射到容器中。

{ "volumes": [ { "host": { "sourcePath": "/scratch" }, "name": "Scratch" } ], "mountPoints": [ { "containerPath": "/scratch", "sourceVolume": "Scratch" } ], }