推荐的解决方案是使用非托管计算环境。不幸的是,这最终是一个糟糕的建议,因为创建自己的非托管计算环境不仅困难且深奥,而且它不仅有点违背了 AWS 批处理的全部目的,而且还有更好(也更简单)的解决方案。
此问题的解决方案是创建一个源自 AWS Batch 使用的默认 AMI 的 Amazon 系统映像。 AMI 允许您通过安装库、修改启动脚本、自定义配置文件以及最重要的目的来按照您想要的方式配置操作系统:定义数据卷的逻辑分区和挂载点。
1. 选择一个基础 AMI 开始,配置您的实例
我们希望基于的 AMI 是官方 ECS 优化的 AMI。看看这个页面 https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html根据您运行的 AWS 区域查找您需要的 AMI。
识别您的 AMI 后,单击右侧列中的“启动实例”链接。您将被带到此页面:
选择 t2.micro 实例类型。
Choose Next: Configuration Details
.
如果需要,为您的实例提供适当的 IAM 角色。什么构成“适当”由您自行决定。保留其余默认选项。
点击Next: Add Storage
.
现在您可以配置 AMI 上的数据量。此步骤也没有定义 AMI 的最终卷配置,但我发现按照您想要的方式配置它很有用。稍后您将有机会在创建 AMI 之前更改此设置。完成后,单击Next: Add Tags
.
添加您想要的任何标签(可选)。点击Next: Configure Security Group
.
Select SSH
for 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/
(根)和 22GB/dev/xvdc/
(泊坞窗图像等)。确保Delete on Termination
选择选项,以便您的批处理计算环境在实例终止后删除卷,否则您将面临创建无限数量的 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. 创建作业队列和作业定义
为了测试我们的计算环境是否实际工作,让我们继续创建一些简单的队列和作业定义。
Select Job queues
在左侧并输入以下选项:
Option Value
Queue name ami_test_queue
Priority 1
Enable Job queue True
Select a compute environment ami_test
Select Create
。等待新队列的状态变为VALID
.
Go to 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]
Select Create job definition
.
最后,前往Jobs
在左侧并选择Submit job
。为您的工作命名并选择ami_test_job_def:1
对于作业定义。保留其余默认值并选择Submit job
.
如果一切顺利,您现在应该看到您的工作已进入Pending
or Runnable
状态。请注意,您的作业实际运行可能需要 10 分钟以上的时间。 EC2 实例通常需要 5-10 分钟才能实例化,还需要几分钟才能通过状态检查。如果你的工作继续在Runnable
创建实例并通过所有状态检查后的状态。出了问题。