入门 AWS Batch 和 Fargate 正在使用 AWS CLI - AWS Batch

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

入门 AWS Batch 和 Fargate 正在使用 AWS CLI

本教程演示如何设置 AWS Batch AWS Fargate 编排并使用 AWS Command Line Interface (AWS CLI) 运行简单的 “Hello World” 作业。您将了解如何创建计算环境、作业任务队列、作业定义以及如何将作业提交到 AWS Batch。

先决条件

在开始本教程之前,请确保您具有以下各项。

  1. 的 AWS CLI。如需安装,请遵循 AWS CLI 安装指南。您也可以使用 AWS CloudShell,其中包括 AWS CLI。

  2. 为你配置 AWS CLI 了相应的凭证。如果尚未设置凭证,请运行 aws configure

  3. 基本熟悉命令行界面和容器化概念。

  4. 如何 AWS Batch 与 IAM 配合使用在中创建和管理 AWS Batch 资源、IAM 角色和 VPC 资源 AWS 账户。

  5. 来自您的 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 来检查作业的状态。作业将经过多个状态:SUBMITTEDPENDINGRUNNABLESTARTINGRUNNING 以及最后的 SUCCEEDEDFAILED

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 --jobs 1509xmpl-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 Security Best Practices

后续步骤

现在您已经完成了本教程,可以探索更多高级 AWS Batch 功能: