推荐的解决方案是使用非托管计算环境。不幸的是,这最终成为一个糟糕的建议,因为创建自己的非托管计算环境不仅困难且深奥,而且不仅有点违背 AWS 批处理的全部目的,而且还有一个更好(也更简单)的解决方案。
此问题的解决方案是创建一个源自 AWS Batch 使用的默认 AMI 的 Amazon 系统映像。AMI 允许您通过安装库、修改启动脚本、自定义配置文件,以及最重要的目的:定义数据卷的逻辑分区和挂载点,从而准确地配置操作系统。
1. 选择一个基础 AMI 开始,配置您的实例
我们想要建立的 AMI 是官方的 ECS 优化 AMI。浏览此页面,根据您运行的 AWS 区域查找您需要的 AMI。
识别您的 AMI 后,单击右侧栏中的“启动实例”链接。您将被带到此页面:

选择 t2.micro 实例类型。
选择Next: Configuration Details。
如果需要,为您的实例提供适当的 IAM 角色。什么构成“适当”由您自行决定。保留其余的默认选项。单击Next: Add Storage。
现在,您可以配置数据卷在 AMI 上的外观。此步骤也不会为您的 AMI 定义最终卷配置,但我发现按照您的需要进行配置很有用。您稍后将有机会在创建 AMI 之前更改此设置。完成后,单击Next: Add Tags。
添加您想要的任何标签(可选)。单击Next: Configure Security Group。
选择SSH,Type并将源设置为Anywhere,或者如果您比我更负责任,请设置一组您知道将用于连接到您的实例的特定 IP 范围。单击Review and Launch。
此页面将允许您查看已设置的选项。如果一切看起来都不错,那么Launch. 当它要求一个密钥对时,要么选择你创建的现有密钥对,要么创建一个新的。如果不执行此步骤,您将无法连接到您的实例。
2.配置你的软件环境
单击启动后,转到您的 EC2 仪表板以查看正在运行的实例:

等待您的实例启动,然后右键单击它。单击Connect,然后将示例 ssh 命令复制粘贴到支持 ssh 的终端中。这-i "keyname.pem"实际上是您的 .pem 文件的路径,因此请确保您cd进入您的~/.ssh目录,或者将标志的值更改为您存储私有 SSH 密钥的路径。您可能还需要将“root”更改为“ec2-user”。

登录后,您可以通过安装 VM 所需的任何包、库和配置来配置您的 VM。如果您使用 AWS 提供的 ECS 优化 AMI,您的 AMI 将已经满足 ECS AMI 的基本要求。如果您出于某种(奇怪的)原因选择不使用 ECS 优化的 AMI,您将安装和配置以下软件包:
- 最新版本的 Amazon ECS 容器代理
- 最新版本的 ecs-init 代理
- 为您的 ECS 容器代理版本推荐的 Docker 版本。
另请注意,如果要附加与根卷不同的另一个卷,则需要修改/etc/fstab文件,以便在实例启动时挂载新卷。我建议您向 Google 了解如何执行此操作。
3. 保存您的 AMI
完成所有软件配置和安装后,返回 EC2 仪表板并查看正在运行的实例。
右键单击您刚刚创建的实例。将鼠标悬停在上方Image,然后选择Create Image。

您会看到这具有您在步骤 1 中选择的卷配置。我没有更改卷的默认设置,因此您可以在上面的屏幕截图中看到 ECS 优化 AMI 的默认卷实际上是 8GB /dev/xvda/(root)和 22GB 用于/dev/xvdc/(docker 图像等)。确保Delete on Termination选择这些选项,以便您的 Batch 计算环境在实例终止后删除卷,否则您将面临创建无限数量的 EBS 卷的风险(非常昂贵,所以我被告知)。我会将我的 AMI 配置为只有 111GB 的根存储空间,仅此而已。Docker 不一定需要单独的卷。
为您的图像命名和描述,然后选择Create Image。
您的实例将重新启动。关闭实例后,AWS 将为其创建一个映像,然后重新打开该实例。
在您的 EC2 控制台中,转到Images, AMIs左侧。几分钟后,您应该会在列表中看到新创建的 AMI。

4. 配置 AWS Batch 以使用您的新 AMI
返回您的 AWS 控制面板并导航到 AWS Batch 页面。Compute environments在左侧选择。选择Create environment。

通过为您的容器(服务角色)和 EC2 实例(实例角色)、供应模型、网络和标签选择适当的 IAM 角色来配置您的环境。
Option Value
Compute environment type Managed
Compute environment name ami_test
Service role AWSBatchServiceRole
Instance role ecsInstanceRole
EC2 key pair landonkey.pem (use name of your private key)
Provisioning model On-Demand (choose spot for significantly cheaper provisioning)
Allowed instance types Optimal
Minimum vCPUs 0
Desired vCPUs 0
Maximum vCPUs 256
Enable user-specified Ami ID True
AMI ID [ID of AMI you generated]
VPC id [default value]
Subnets [select all options]
Security groups default
关键步骤是选择Enable user-specified Ami ID并指定您在前面步骤中生成的 AMI ID。
配置完所有选项后,选择Create。
5. 创建作业队列和作业定义
为了测试我们的计算环境是否确实有效,让我们继续创建一些简单的队列和作业定义。
Job queues在左侧选择并输入以下选项:
Option Value
Queue name ami_test_queue
Priority 1
Enable Job queue True
Select a compute environment ami_test
选择Create。等待新队列上的状态变为VALID。
转到Job definitions并选择Create。输入以下值:
Option Value
Job definition name ami_test_job_def
Job role ECS_Administrator
Container image amazonlinux
Command df -h
vCPUs 1
Memory (MiB) 1000
Job attempts 1
Execution timeout 100
Parameters [leave blank]
Environment variables [leave blank]
Volumes [leave blank]
Mount points [leave blank]
选择Create job definition。
最后,转到Jobs左侧并选择Submit job。为您的工作命名并ami_test_job_def:1为工作定义选择。保留其余默认值并选择Submit job。
如果一切顺利,您现在应该看到您的工作已进入Pending或Runnable状态。请注意,您的作业实际运行可能需要 10 分钟以上的时间。EC2 实例的实例化通常需要 5-10 分钟,而通过状态检查则需要几分钟。如果您的作业在Runnable创建实例并通过所有状态检查后仍处于该状态。出了点问题。
