如何在 AWS 批处理中定义根卷大小

How to define root volume size in AWS batch

我正在使用 AWS Batch,我发现根卷大小对于我的任务来说太小了。

我尝试创建一个新的计算 environment/job 队列,但没有任何设置卷大小的选项。我尝试从 here but the new launch configuration and/or autoscaling group are not considered by AWS Batch. I probably have to change dm.basesize 更改启动配置,但不清楚应该在哪里完成。

因此,我从 Amazon 2 Linux 设置了一个具有 500 GB 存储空间的自定义 AMI,并将 --storage-opt 更改为 dm.basesize=400GB,如 here but, although my instances are spawned, the jobs remain in RUNNABLE state indefinitely. I inspected the possible causes as defined 所示,但是i) "Enable auto-assign public IPv4 address" 被选中,ii) 图像应该是好的(它在创建环境时已经过验证并且可以生成),iii) 我对这种实例类型有 5 个实例的限制(但我是无法 运行 甚至 1),iv) 我的角色权限应该没问题 - 我成功地使用了与默认 amazonlinux 图像相同的角色,v) 资源不足(实例生成所以我认为这不应该是问题), vi) 连通性 - 它应该可以工作,因为自动缩放组显示成功状态。

一个可能的解决方案可能是在 运行 时间附加一个特定的 AWS 卷,但它会受到限制,我想找到一个自动解决方案,因为我必须管理多个卷用于并行执行。

我还尝试通过从 s3 存储桶传输输入、分析数据并将输出传输到第二个 s3 存储桶来执行任务,但我每次都收到 Connection Reset by Peer 错误,可能是因为任务 运行s 太长了(我也将 --cli-read-timeout 设置为 0 但它根本没有修复)。

有没有办法为 AWS 批处理中的作业配置根卷大小?

推荐的解决方案是使用非托管计算环境。不幸的是,这最终成为一个糟糕的建议,因为不仅创建自己的非托管计算环境困难重重,而且它不仅有点破坏 AWS 批处理的全部目的,而且还有一个更好(也更简单)的解决方案。

此问题的解决方案是创建一个从 AWS Batch 使用的默认 AMI 派生的 Amazon 系统映像。 AMI 允许您通过安装库、修改启动脚本、自定义配置文件以及最重要的目的来准确配置操作系统:定义数据卷的逻辑分区和挂载点。

1.选择一个基础 AMI 作为起点,配置您的实例

我们要基于的 AMI 是官方的 ECS 优化 AMI。 Take a gander at this page 根据您 运行 所在的 AWS 区域查找您需要的 AMI。

确定您的 AMI 后,单击右侧列中的“启动实例”link。您将被带到此页面:

选择 t2.micro 实例类型。

选择Next: Configuration Details

如果需要,为您的实例提供适当的 IAM 角色。什么构成“适当”由您自行决定。保留其余的默认选项。 单击 Next: Add Storage

现在您可以配置 AMI 上的数据量。此步骤也不会为您的 AMI 定义最终的卷配置,但我发现按照您的需要进行配置很有用。您稍后将有机会在创建 AMI 之前更改此设置。完成后,单击 Next: Add Tags

添加任何你想要的标签(可选)。单击 Next: Configure Security Group

Select SSH for Type, 并将 Source 设置为 Anywhere, 或者如果你比我更负责, 设置一组特定的 IP 范围您知道您将使用它来连接到您的实例。单击 Review and Launch

此页面将允许您查看已设置的选项。如果一切看起来不错,那么 Launch。当它要求输入密钥对时,select 和您创建的现有密钥对,或者创建一个新密钥对。如果不执行此步骤,您将无法连接到您的实例。

2。配置您的软件环境

点击启动后,转到您的 EC2 控制面板查看您的 运行 个实例:

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

登录后,您可以通过安装您需要 VM 的任何包、库和配置来配置您的 VM。如果您使用 AWS 提供的 ECS 优化 AMI,您的 AMI 将已经满足 ECS AMI 的基本要求。如果您出于某种(奇怪的)原因选择不使用 ECS 优化的 AMI,您将安装和配置以下软件包:

  1. 最新版Amazon ECS容器代理
  2. 最新版本的ecs-init代理
  3. 为您的 ECS 容器代理版本推荐的 Docker 版本。

另请注意,如果您想附加另一个与根卷分开的卷,您需要修改 /etc/fstab 文件,以便在实例启动时安装新卷。我建议您参考 Google 如何执行此操作。

3。保存您的 AMI

完成所有软件配置和安装后,返回您的 EC2 仪表板并查看您的 运行 个实例。

右键单击您刚刚创建的实例。将鼠标悬停在 Image,然后是 select Create Image.

您会看到这具有您在步骤 1 中选择的卷配置。我没有更改我的卷的默认设置,因此您可以在上面的屏幕截图中看到 ECS 优化的 AMI 的默认卷/dev/xvda/(root)实际上是 8GB,/dev/xvdc/(docker 图片等)是 22GB。确保 Delete on Termination 选项已 selected 以便您的批处理计算环境在实例终止后删除卷,否则您将面临创建无限数量的 EBS 卷的风险(非常昂贵,所以我被告知)。我会将我的 AMI 配置为只有 111GB 的根存储,没有其他任何东西。 Docker.

不一定需要单独的卷

为您的图像命名和描述,然后 select Create Image

您的实例将重新启动。关闭实例后,AWS 将创建它的映像,然后重新打开实例。

在您的 EC2 控制台中,转到左侧的 Images, AMIs。几分钟后,您应该会在列表中看到新创建的 AMI。

4.配置 AWS Batch 以使用您的新 AMI

返回您的 AWS 仪表板并导航至 AWS Batch 页面。 Select Compute environments 在左侧。 Select Create environment.

通过select为您的容器(服务角色)和 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

此操作的关键步骤是 selecting Enable user-specified Ami ID 并指定您在前面的步骤中生成的 AMI ID。

配置完所有选项后,select Create

5.创建作业队列和作业定义

为了测试我们的计算环境是否正常工作,让我们继续创建一些简单的队列和作业定义。

Select Job queues 并输入以下选项:

Option                                  Value

Queue name                            ami_test_queue
Priority                              1
Enable Job queue                      True
Select a compute environment          ami_test

SelectCreate。等待新队列的状态变为 VALID

转到 Job definitions 和 select 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和selectSubmit job。为您的作业命名,并为作业定义 select ami_test_job_def:1。保留其余的默认值和 select Submit job.

如果一切顺利,您现在应该会看到您的作业已进入 PendingRunnable 状态。请注意,您的作业实际运行可能需要 10 分钟以上的时间。 EC2 实例通常需要 5-10 分钟来实例化,并需要几分钟才能通过状态检查。如果您的作业在创建实例并通过所有状态检查后继续处于 Runnable 状态。出了点问题。

您现在也可以使用启动模板了。在启动模板中增加根卷大小。然后根据作业定义将本地文件系统(例如 /mnt)挂载到 docker.

参考:https://docs.aws.amazon.com/batch/latest/userguide/launch-templates.html

此处有针对此问题的指导:https://aws.amazon.com/premiumsupport/knowledge-center/batch-job-failure-disk-space/

获取提供的 MIME 多部分文件,将 Docker 大小设置为 20G,并对其进行 base64 编码。 IE。 Mime_file.txt | base64

结果输出是一串数字和字母。将此字符串输入到提供的启动模板中的“UserData”字段中,并将您的启动模板另存为 json。然后使用 AWS CLI 注册启动模板 aws ec2 --region [region] create-launch-template --cli-input-json file://launchtemplate.json。在 Batch 中将此启动模板与您的计算环境相关联。