

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

# 入门 AWS Batch 和 Fargate 正在使用 AWS CLI
<a name="getting-started-with-fargate-using-the-aws-cli"></a>

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

**Topics**
+ [先决条件](#prerequisites)
+ [创建 IAM 执行角色](#tutorial-fargate-using-the-aws-cli-create-an-iam-execution-role)
+ [创建计算环境](#create-a-compute-environment)
+ [创建作业队列](#cli-create-a-job-queue)
+ [创建作业定义](#cli-create-a-job-definition)
+ [提交并监控作业](#cli-submit-and-monitor-a-job)
+ [查看作业输出](#cli-view-job-output)
+ [清理 资源](#cli-clean-up-resources)
+ [投入生产](#cli-going-to-production)
+ [后续步骤](#cli-next-steps)

## 先决条件
<a name="prerequisites"></a>

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

1. 的 AWS CLI。如需安装，请遵循 [AWS CLI 安装指南](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。您也可以[使用 AWS CloudShell](https://docs.aws.amazon.com/cloudshell/latest/userguide/welcome.html)，其中包括 AWS CLI。

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

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

1. [如何 AWS Batch 与 IAM 配合使用](security_iam_service-with-iam.md)在中创建和管理 AWS Batch 资源、IAM 角色和 VPC 资源 AWS 账户。

1. 来自您的 VPC 的子网 ID 和安全组 ID AWS 账户。如果您还没有默认 VPC，则可以[创建一个](https://docs.aws.amazon.com/vpc/latest/userguide/create-vpc.html)。*有关使用检索这些资源的 IDs更多信息，请参阅 AWS CLI desc [ribe-subnet](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-subnets.html) s 和《命令参考[describe-security-groups](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-security-groups.html)》。AWS CLI *

**所需时间**：完成本教程大约需要 15-20 分钟时间。

**成本**：本教程将使用 Fargate 计算资源。假设您在完成本教程后立即按照清理说明删除相关资源，则完成本教程的成本估计不到 0.01 美元。Fargate 根据使用的 vCPU 和内存资源按秒收费，不足 1 分钟按 1 分钟计算。有关现行定价信息，请参阅 [AWS Fargate 定价](https://aws.amazon.com/fargate/pricing/)。

## 创建 IAM 执行角色
<a name="tutorial-fargate-using-the-aws-cli-create-an-iam-execution-role"></a>

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 任务。

## 创建计算环境
<a name="create-a-compute-environment"></a>

计算环境定义了批处理作业将在其中运行的计算资源。在本教程中，您将创建一个可根据作业要求自动预调配和扩展资源的托管式 Fargate 计算环境。

**创建计算环境**

以下命令会创建一个 Fargate 计算环境。将示例子网和安全组 IDs 替换为您自己的子网和安全组[先决条件](#prerequisites)。

```
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` 时，即表示计算环境已准备就绪，可以接受作业。

## 创建作业队列
<a name="cli-create-a-job-queue"></a>

作业队列存储已提交的作业，直到 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"
```

## 创建作业定义
<a name="cli-create-a-job-definition"></a>

作业定义用于指定作业的运行方式，包括要使用的 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 映像。

## 提交并监控作业
<a name="cli-submit-and-monitor-a-job"></a>

现在您已拥有所有必需的组件，可以向队列提交作业并监控其进度。

**提交一份工作**

以下命令会使用您创建的作业定义将一个作业提交到您的队列。

```
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` 时，即表示您的作业已成功完成。

## 查看作业输出
<a name="cli-view-job-output"></a>

任务完成后，您可以在 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”，确认您的作业已成功运行。

## 清理 资源
<a name="cli-clean-up-resources"></a>

为避免持续产生费用，请清理您在此教程中创建的资源：由于依赖项的原因，您必须按正确的顺序删除资源。

**禁用和删除作业队列**

首先，禁用作业队列，然后将其删除。

```
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
```

所有资源都已成功清理。

## 投入生产
<a name="cli-going-to-production"></a>

本教程旨在帮助您了解 Fargate AWS Batch 的工作原理。对于生产部署，应注意以下附加要求：

**安全性注意事项：**
+ 创建具有所需最低访问权限的专用安全组，而不要使用默认安全组
+ 使用带有 NAT 网关的私有子网，而不是为容器分配的公有 IP
+ 将容器映像存储在 Amazon ECR 中，而不要使用公有存储库
+ 为 AWS 服务通信实现 VPC 终端节点，以避开互联网流量

**架构注意事项：**
+ 跨多个可用区部署以确保高可用性
+ 实施作业重试策略和死信队列，以用于错误处理
+ 使用具有不同优先级的多个作业队列，以用于工作负载管理
+ 配置基于根队列深度和资源利用率的自动扩缩策略
+ 实施作业失败和资源利用率监控和提醒

**运营注意事项：**
+ 设置用于监控的 CloudWatch 仪表板和警报
+ 实施恰当的日志记录和审计跟踪记录
+ 将 o CloudFormation r AWS CDK 用于基础架构即代码
+ 建立备份和灾难恢复程序

有关生产就绪架构的全面指导，请参阅 [AWS Well-Architected 框架](https://aws.amazon.com/architecture/well-architected/)和 [AWS Security Best Practices](https://aws.amazon.com/architecture/security-identity-compliance/)。

## 后续步骤
<a name="cli-next-steps"></a>

现在您已经完成了本教程，可以探索更多高级 AWS Batch 功能：
+ [作业队列](job_queues.md)：了解作业队列调度和优先级管理
+ [作业定义](job_definitions.md)：探索高级作业定义配置，包括环境变量、卷和重试策略
+ [的计算环境 AWS Batch](compute_environments.md)：了解各种不同的计算环境类型和扩缩选项
+ [Multi-node parallel 作业](multi-node-parallel-jobs.md)：运行跨多个计算节点的作业
+ [数组作业](array_jobs.md)：高效提交大量相似的作业
+ [的最佳实践 AWS Batch](best-practices.md)：了解适用于生产工作负载的优化技术