推荐的解决方案是使用非托管计算环境。不幸的是,这最终成为一个糟糕的建议,因为创建自己的非托管计算环境不仅困难且深奥,而且不仅有点违背 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
创建实例并通过所有状态检查后仍处于该状态。出了点问题。