如何在 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,您将安装和配置以下软件包:
- 最新版Amazon ECS容器代理
- 最新版本的ecs-init代理
- 为您的 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
.
如果一切顺利,您现在应该会看到您的作业已进入 Pending
或 Runnable
状态。请注意,您的作业实际运行可能需要 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 中将此启动模板与您的计算环境相关联。
我正在使用 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
一个可能的解决方案可能是在 运行 时间附加一个特定的 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,您将安装和配置以下软件包:
- 最新版Amazon ECS容器代理
- 最新版本的ecs-init代理
- 为您的 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
.
如果一切顺利,您现在应该会看到您的作业已进入 Pending
或 Runnable
状态。请注意,您的作业实际运行可能需要 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 中将此启动模板与您的计算环境相关联。