本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
入门 AWS Batch 和 Fargate 正在使用 AWS CLI
本教程演示如何设置 AWS Batch AWS Fargate 编排并使用 AWS Command Line Interface (AWS CLI) 运行简单的 “Hello World” 作业。您将了解如何创建计算环境、作业任务队列、作业定义以及如何将作业提交到 AWS Batch。
先决条件
在开始本教程之前,请确保您具有以下各项。
-
的 AWS CLI。如需安装,请遵循 AWS CLI 安装指南。您也可以使用 AWS CloudShell,其中包括 AWS CLI。
-
为你配置 AWS CLI 了相应的凭证。如果尚未设置凭证,请运行
aws configure。 -
基本熟悉命令行界面和容器化概念。
-
如何 AWS Batch 与 IAM 配合使用在中创建和管理 AWS Batch 资源、IAM 角色和 VPC 资源 AWS 账户。
来自您的 VPC 的子网 ID 和安全组 ID AWS 账户。如果您还没有默认 VPC,则可以创建一个。有关使用检索这些资源的 IDs更多信息,请参阅 AWS CLI desc ribe-subnet
s 和《命令参考describe-security-groups 》。AWS CLI
所需时间:完成本教程大约需要 15-20 分钟时间。
成本:本教程将使用 Fargate 计算资源。假设您在完成本教程后立即按照清理说明删除相关资源,则完成本教程的成本估计不到 0.01 美元。Fargate 根据使用的 vCPU 和内存资源按秒收费,不足 1 分钟按 1 分钟计算。有关现行定价信息,请参阅 AWS Fargate 定价
创建 IAM 执行角色
AWS Batch 需要一个允许亚马逊弹性容器服务 (Amazon ECS) 代理代表 AWS 您进行 API 调用的执行角色。Fargate 任务需要此角色才能提取容器镜像并将日志写入亚马逊。 CloudWatch
创建信任策略文档
首先,创建一个允许 Amazon EKS 任务服务代入该角色的信任策略。
cat > batch-execution-role-trust-policy.json << EOF{ "Version":"2012-10-17", "Statement": [ { "Sid": "", "Effect": "Allow", "Principal": { "Service": "ecs-tasks.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }EOF
创建执行角色
以下命令会使用您刚才创建的信任策略创建一个名为 BatchEcsTaskExecutionRoleTutorial 的 IAM 角色。
aws iam create-role \ --role-name BatchEcsTaskExecutionRoleTutorial \ --assume-role-policy-document file://batch-execution-role-trust-policy.json
附加所需的策略
附上为执行 Amazon ECS 任务提供必要权限的 AWS 托管策略。
aws iam attach-role-policy \ --role-name BatchEcsTaskExecutionRoleTutorial \ --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
该角色现已准备就绪,可以用来执行 AWS Batch Fargate 任务。
创建计算环境
计算环境定义了批处理作业将在其中运行的计算资源。在本教程中,您将创建一个可根据作业要求自动预调配和扩展资源的托管式 Fargate 计算环境。
创建计算环境
以下命令会创建一个 Fargate 计算环境。将示例子网和安全组 IDs 替换为您自己的子网和安全组先决条件。
aws batch create-compute-environment \ --compute-environment-name my-fargate-compute-env \ --type MANAGED \ --state ENABLED \ --compute-resources type=FARGATE,maxvCpus=128,subnets=subnet-a123456b,securityGroupIds=sg-a12b3456
以下展示了该命令成功运行时的输出。
{ "computeEnvironmentName": "my-fargate-compute-env", "computeEnvironmentArn": "arn:aws:batch:us-west-2:123456789012:compute-environment/my-fargate-compute-env" }
等待计算环境准备就绪
检查计算环境的状态以确保其已准备就绪,然后再继续操作。
aws batch describe-compute-environments \ --compute-environments my-fargate-compute-env \ --query 'computeEnvironments[0].status'
"VALID"
当状态显示为 VALID 时,即表示计算环境已准备就绪,可以接受作业。
创建作业队列
作业队列存储已提交的作业,直到 AWS Batch 调度器在您的计算环境中的资源上运行这些作业。队列中的作业按优先级顺序处理。
创建作业队列
以下命令会创建一个优先级为 900 并使用您的 Fargate 计算环境的作业队列。
aws batch create-job-queue \ --job-queue-name my-fargate-job-queue \ --state ENABLED \ --priority 900 \ --compute-environment-order order=1,computeEnvironment=my-fargate-compute-env
以下展示了该命令成功运行时的输出。
{ "jobQueueName": "my-fargate-job-queue", "jobQueueArn": "arn:aws:batch:us-west-2:123456789012:job-queue/my-fargate-job-queue" }
验证作业队列是否准备就绪
检查您的作业队列是否已处于 ENABLED 状态并准备就绪,可以接受作业。
aws batch describe-job-queues \ --job-queues my-fargate-job-queue \ --query 'jobQueues[0].state' "ENABLED"
创建作业定义
作业定义用于指定作业的运行方式,包括要使用的 Docker 映像、资源要求和其他参数。对于 Fargate,您将使用资源要求而不是传统的 vCPU 和内存参数。
创建作业定义
以下命令会创建一个将使用 busybox 容器映像来运行简单的“hello world”命令的作业定义。123456789012用你的实际 AWS 账户 身份证替换,用你自己的身份证 AWS 区域 替换示例。
aws batch register-job-definition \ --job-definition-name my-fargate-job-def \ --type container \ --platform-capabilities FARGATE \ --container-properties '{ "image": "busybox", "resourceRequirements": [ {"type": "VCPU", "value": "0.25"}, {"type": "MEMORY", "value": "512"} ], "command": ["echo", "hello world"], "networkConfiguration": { "assignPublicIp": "ENABLED" }, "executionRoleArn": "arn:aws:iam::123456789012:role/BatchEcsTaskExecutionRoleTutorial" }, { "jobDefinitionName": "my-fargate-job-def", "jobDefinitionArn": "arn:aws:batch:us-west-2:123456789012:job-definition/my-fargate-job-def:1", "revision": 1 }'
该作业定义指定了 0.25 个 vCPU 和 512 MB 内存,这是 Fargate 任务所需的最低资源。assignPublicIp 设置已启用,因此该容器可以从 Docker Hub 中提取 busybox 映像。
提交并监控作业
现在您已拥有所有必需的组件,可以向队列提交作业并监控其进度。
提交一份工作
以下命令会使用您创建的作业定义将一个作业提交到您的队列。
aws batch submit-job \ --job-name my-hello-world-job \ --job-queue my-fargate-job-queue \ --job-definition my-fargate-job-def
以下展示了该命令成功运行时的输出。
{ "jobArn": "arn:aws:batch:us-west-2:123456789012:job/my-hello-world-job", "jobName": "my-hello-world-job", "jobId": "1509xmpl-4224-4da6-9ba9-1d1acc96431a" }
记下响应中返回的 jobId,您将使用它来监控作业的进度。
监控作业状态
使用作业 ID 来检查作业的状态。作业将经过多个状态:SUBMITTED、PENDING、RUNNABLE、STARTING、RUNNING 以及最后的 SUCCEEDED 或 FAILED。
aws batch describe-jobs --jobs 1509xmpl-4224-4da6-9ba9-1d1acc96431a
以下展示了该命令成功运行时的输出。
{ "jobs": [ { "jobArn": "arn:aws:batch:us-west-2:123456789012:job/my-hello-world-job", "jobName": "my-hello-world-job", "jobId": "1509xmpl-4224-4da6-9ba9-1d1acc96431a", "jobQueue": "arn:aws:batch:us-west-2:123456789012:job-queue/my-fargate-job-queue", "status": "SUCCEEDED", "createdAt": 1705161908000, "jobDefinition": "arn:aws:batch:us-west-2:123456789012:job-definition/my-fargate-job-def:1" } ] }
当状态显示为 SUCCEEDED 时,即表示您的作业已成功完成。
查看作业输出
任务完成后,您可以在 Amazon Logs 中查看其输 CloudWatch 出。
获取日志流名称
首先,从作业详细信息中检索日志流名称。请将示例作业 ID 替换为您自己的值。
aws batch describe-jobs --jobs1509xmpl-4224-4da6-9ba9-1d1acc96431a\ --query 'jobs[0].attempts[0].containers[0].logStreamName' \ --output text
my-fargate-job-def/default/1509xmpl-4224-4da6-9ba9-1d1acc96431a
查看作业日志
使用日志流名称从 CloudWatch Logs 中检索作业的输出。
aws logs get-log-events \ --log-group-name /aws/batch/job \ --log-stream-name my-fargate-job-def/default/1509xmpl-4224-4da6-9ba9-1d1acc96431a\ --query 'events[*].message' \ --output text
输出会显示“hello world”,确认您的作业已成功运行。
清理 资源
为避免持续产生费用,请清理您在此教程中创建的资源:由于依赖项的原因,您必须按正确的顺序删除资源。
禁用和删除作业队列
首先,禁用作业队列,然后将其删除。
aws batch update-job-queue \ --job-queue my-fargate-job-queue \ --state DISABLED
aws batch delete-job-queue \ --job-queue my-fargate-job-queue
禁用和删除计算环境
删除作业队列后,请禁用并删除计算环境。
aws batch update-compute-environment \ --compute-environment my-fargate-compute-env \ --state DISABLED
aws batch delete-compute-environment \ --compute-environment my-fargate-compute-env
清理 IAM 角色
移除附加的策略并删除该 IAM 角色。
aws iam detach-role-policy \ --role-name BatchEcsTaskExecutionRoleTutorial \ --policy-arn arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy
aws iam delete-role \ --role-name BatchEcsTaskExecutionRoleTutorial
移除临时文件
删除您创建的信任策略文件。
rm batch-execution-role-trust-policy.json
所有资源都已成功清理。
投入生产
本教程旨在帮助您了解 Fargate AWS Batch 的工作原理。对于生产部署,应注意以下附加要求:
安全性注意事项:
创建具有所需最低访问权限的专用安全组,而不要使用默认安全组
使用带有 NAT 网关的私有子网,而不是为容器分配的公有 IP
将容器映像存储在 Amazon ECR 中,而不要使用公有存储库
为 AWS 服务通信实现 VPC 终端节点,以避开互联网流量
架构注意事项:
跨多个可用区部署以确保高可用性
实施作业重试策略和死信队列,以用于错误处理
使用具有不同优先级的多个作业队列,以用于工作负载管理
配置基于根队列深度和资源利用率的自动扩缩策略
实施作业失败和资源利用率监控和提醒
运营注意事项:
设置用于监控的 CloudWatch 仪表板和警报
实施恰当的日志记录和审计跟踪记录
将 o CloudFormation r AWS CDK 用于基础架构即代码
建立备份和灾难恢复程序
有关生产就绪架构的全面指导,请参阅 AWS Well-Architected 框架
后续步骤
现在您已经完成了本教程,可以探索更多高级 AWS Batch 功能:
-
作业队列:了解作业队列调度和优先级管理
-
作业定义:探索高级作业定义配置,包括环境变量、卷和重试策略
-
的计算环境 AWS Batch:了解各种不同的计算环境类型和扩缩选项
-
多节点并行作业:运行跨多个计算节点的作业
-
数组作业:高效提交大量相似的作业
-
AWS Batch 的最佳做法:了解适用于生产工作负载的优化技术