

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

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

本教學課程示範如何使用 AWS Fargate 協調 AWS Batch 設定 ，並使用 AWS Command Line Interface () 執行簡單的「Hello World」任務AWS CLI。您將了解如何建立運算環境、任務佇列、任務定義，以及向其提交任務 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)。如需使用 AWS CLI 擷取這些資源 IDs的詳細資訊，請參閱《 *AWS CLI 命令參考*》中的 [describe-subnets ](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-subnets.html)和 [describe-security-groups](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/describe-security-groups.html)。

**所需時間**：完成本教學課程約需 15-20 分鐘。

**成本**：本教學課程使用 Fargate 運算資源。完成本教學課程的預估成本低於 0.01 USD，假設您遵循清除指示，在完成後立即刪除資源。Fargate 定價是以使用的 vCPU 和記憶體資源為基礎，最低收費為每秒 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 Elastic Container Service (Amazon ECS) 代理程式代表您進行 AWS API 呼叫。Fargate 任務需要此角色，才能提取容器映像並將日誌寫入 Amazon CloudWatch。

**建立信任政策文件**

首先，建立允許 Amazon ECS 任務服務擔任角色的信任政策。

```
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 帳戶 的 ID，並將範例取代 AWS 區域 為您自己的 ID。

```
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 提取忙碌方塊映像。

## 提交和監控任務
<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`、`RUNNING`、、 `RUNNABLE` `STARTING`和 最後 `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 CloudWatch Logs 中檢視其輸出。

**取得日誌串流名稱**

首先，從任務詳細資訊擷取日誌串流名稱。將範例任務 ID 取代為您自己的任務 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 Gateway，而非容器的公有 IP 指派
+ 將容器映像儲存在 Amazon ECR 中，而不是使用公有儲存庫
+ 實作 VPC 端點進行 AWS 服務通訊，以避免網際網路流量

**架構考量事項：**
+ 跨多個可用區域部署以獲得高可用性
+ 實作任務重試策略和無效字母佇列以進行錯誤處理
+ 使用具有不同優先順序的多個任務佇列進行工作負載管理
+ 根據佇列深度和資源使用率設定自動擴展政策
+ 實作任務失敗和資源使用率的監控與提醒

**操作考量：**
+ 設定 CloudWatch 儀表板和警示以進行監控
+ 實作適當的記錄和稽核追蹤
+ 針對基礎設施使用 CloudFormation 或 AWS CDK 做為程式碼
+ 建立備份和災難復原程序

如需生產就緒架構的完整指引，請參閱 [AWS Well-Architected Framework](https://aws.amazon.com/architecture/well-architected/) 和[AWS 安全最佳實務](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-jobs.md) – 執行跨越多個運算節點的任務
+ [陣列任務](array_jobs.md) – 有效率地提交大量類似的任務
+ [的最佳實務 AWS Batch](best-practices.md) – 了解生產工作負載的最佳化技術