

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

# 优化 Amazon ECS 上 AWS Fargate 任务的成本
<a name="optimizer-ecs-fargate"></a>

## 概述
<a name="optimizer-ecs-fargate-overview"></a>

正确调整 AWS Fargate 任务规模是成本优化的重要一步。通常，应用程序是针对 Fargate 任务使用任意大小构建的，且永远不会重访。这可能会导致 Fargate 任务过度预调配和产生不必要的支出。本节向您展示如何使用 [AWS Compute Optimizer](https://aws.amazon.com/compute-optimizer/) 提供可操作的建议，以便您可以针对 Fargate 上运行的 Amazon Elastic Container Service（Amazon ECS）服务优化任务 CPU 和内存。Compute Optimizer 还量化了采用这些建议所产生的成本影响。这使您能够根据节省机会的大小确定优化工作的优先顺序。Compute Optimizer 建议提供容器级 CPU 和内存配置，以缩小任务规模。

## 成本优势
<a name="optimizer-ecs-fargate-cost-benefits"></a>

在 Fargate 上调整 Amazon ECS 任务可能会降低长时间运行任务的成本 30-70%。无需查看应用程序性能指标来调整任务规模，您就可以将在 EC2 计算实例上使用的相同思维方式应用于容器大小调整。这会导致 Fargate 任务过大，从而增加闲置资源的成本。您可以使用 Compute Optimizer 来快速发现调整机会。理想情况下，应用程序所有者会审查特定的应用程序性能指标，并消除操作系统开销，以确保指定正确的任务大小。有关更多信息，请参阅本指南的[将 Windows 应用程序移到容器](windows-containers-main.md)部分。

## 成本优化建议
<a name="optimizer-ecs-fargate-rec"></a>

本节提供了有关使用 Compute Optimizer 调整 Fargate 任务上的 Amazon ECS 的建议。

作为成本优化过程的一部分，建议执行以下操作：
+ 启用 Compute Optimizer
+ 使用 Compute Optimizer 结果
+ 标记要调整的任务
+ 启用成本分配标签以使用 AWS 计费工具
+ 实施调整建议
+ 在 Cost Explorer 成本管理服务中查看成本前后

### 启用 Compute Optimizer
<a name="optimizer-ecs-fargate-rec-compute"></a>

您可以在 AWS Organizations中，在组织级别或单个账户级别启用 [AWS Compute Optimizer](https://docs.aws.amazon.com/compute-optimizer/latest/ug/getting-started.html#account-opt-in)。组织范围的配置为所有成员账户的整个实例集中的新实例和现有实例提供持续报告。这样一来，正确调整大小就可以成为重复的活动，而不是一项 point-in-time活动。

#### 组织级别
<a name="optimizer-ecs-fargate-rec-compute-org"></a>

对于大多数组织来说，使用 Compute Optimizer 的最有效方式是在组织层面。这为您的组织提供了多账户和多区域可见性，并将数据集中到一个来源供审查。要在组织层面启用此功能，请执行以下操作：

1. 使用具有[所需权限](https://docs.aws.amazon.com/compute-optimizer/latest/ug/security-iam.html)的角色登录您的 [AWS Organizations 管理账户](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_getting-started_concepts.html)，然后选择加入该组织内的所有账户。您的组织必须[已启用所有功能](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_org_support-all-features.html)。

1. 启用管理账户后，您可以登录该账户，查看所有其他成员账户，并浏览他们的推荐。

**注意**  
最佳做法是为 Compute Optimizer 配置[委托管理员账户](https://docs.aws.amazon.com/compute-optimizer/latest/ug/delegate-administrator-account.html)。这使您能够行使最低权限原则，最大限度地减少对 AWS Organizations 管理账户的访问权限，同时仍提供对组织范围服务的访问权限。

#### 单个账户级别
<a name="optimizer-ecs-fargate-rec-compute-account"></a>

如果您的目标账户成本高昂，但又没有 AWS Organizations的访问权限，您仍然可以为该账户和区域启用 Compute Optimizer。要了解选择加入流程，请参阅[入门](https://docs.aws.amazon.com/compute-optimizer/latest/ug/getting-started.html)。 AWS Compute Optimizer

**注意**  
建议每天刷新，最多可能需要 12 小时才能生成。请记住，Compute Optimizer 需要过去 14 天内 24 小时的指标才能为 Fargate 上的 Amazon ECS 生成建议。有关更多信息，请参阅 Compute Optimizer 文档中的 [Requirements for Amazon ECS services on Fargate](https://docs.aws.amazon.com/compute-optimizer/latest/ug/requirements.html#requirements-ecs-fargate)。

Compute Optimizer 会自动分析 Fargate 上 CloudWatch 亚马逊 ECS 服务的以下亚马逊和亚马逊 ECS 利用率指标：
+ `CPUUtilization`：服务中使用的 CPU 容量的百分比。
+ `MemoryUtilization`：服务中使用的内存的百分比。

### 使用 Compute Optimizer 结果
<a name="optimizer-ecs-fargate-rec-results"></a>

举一个例子，该示例侧重于在单个账户和单个区域内进行调整更改。在本示例中，Compute Optimizer 在组织级别为所有账户启用。请记住，调整属于破坏性过程，在大多数情况下，应用程序所有者会在几周的计划维护时段内精确地执行此过程。

如果您从组织的管理账户中导航到 Compute Optimizer（如以下步骤所示），则可以选择要调查的账户。在此示例中，一个任务正在 `us-east-1` 中过度预调配的单个账户中运行。重点是将大小调整为 Amazon ECS 服务的建议大小。

1. 打开 [Compute Optimizer 控制台](https://console.aws.amazon.com/compute-optimizer/)。

1. 在**控制面板**页面上，按**调查发现=过度预调配**筛选，以查看 Fargate 上的所有 Amazon ECS 服务。

1. 要查看 **Fargate 上过度预调配的 ECS 服务的**详细建议，****请向下滚动，然后选择**查看建议**。

1. 选择**导出**，并保存文件以备将来使用。
**注意**  
要保存建议以备将来查看，您必须有一个可用的 S3 存储桶供每个区域的 Compute Optimizer 写入数据。有关更多信息，请参阅 Compute Optimizer 文档中的 [Amazon S3 bucket policy for AWS Compute Optimizer](https://docs.aws.amazon.com/compute-optimizer/latest/ug/create-s3-bucket-policy-for-compute-optimizer.html)。

要查看 Compute Optimizer 提供的建议，请执行以下操作：

1. 在 [Compute Optimizer 控制台](https://console.aws.amazon.com/compute-optimizer/)中，前往**导出建议**页面。

1. 对于 **S3 存储桶目标**，选择 S3 存储桶。

1. 在**导出筛选条件**部分的**资源类型**中，选择 **Fargate 上的 ECS 服务**。

1. 在 **Fargate 上的 ECS 服务建议**页面上，深入研究 Fargate 上的一项 ECS 服务，并查看 Compute Optimizer 提供的 CPU 和内存建议。例如，查看**将当前设置与建议的任务大小进行比较**和**将当前设置与建议的容器大小进行比较**部分中的建议。

要获取需要调整的 Fargate 的 ECS 服务列表，请执行以下操作：

1. 打开 [Amazon S3 控制台](https://console.aws.amazon.com/s3/)。

1. 在导航窗格中，选择**存储桶**，然后选择在其中导出结果的存储桶。

1. 在**对象**选项卡上，选择您的对象并选择**下载**。

1. 在您下载的结果中，筛选结果列，以仅显示 Fargate 上的 **OVER\$1PROVISIONED** Amazon ECS 服务。这显示了您计划进行调整的 Amazon ECS 服务。

1. 将任务定义存储在文本编辑器中，以备后续使用。

### 调整标签任务
<a name="optimizer-ecs-fargate-rightsizing"></a>

标记工作负载是组织 AWS资源的强大工具。您可以使用标签来更精细地了解成本并启用退款。有许多方法和策略可以向 AWS 资源添加标签以处理退款和自动化。有关更多信息，请参阅 AWS 白皮书《为资源[添加标签 AWS 的最佳实践》](https://docs.aws.amazon.com/whitepapers/latest/tagging-best-practices/tagging-best-practices.html)。以下示例使用 [AWS CloudShell](https://console.aws.amazon.com/cloudshell/home) 标记目标账户和 AWS 区域内任何 Amazon ECS 服务的所有任务。

```
#!/bin/bash
# Set variables
TAG_KEY="rightsizing"
TAG_VALUE="enabled"
# Get a list of ECS Clusters
ClustersArns=$( aws ecs list-clusters –query 'clusterArns' –output text)
for ClustersArn in $ClustersArns; do
 ServiceArns=$( aws ecs list-services –cluster $ClustersArn –query 'serviceArns' –output text)
 for ServiceArn in $ServiceArns; do
  TasksArns=$( aws ecs list-tasks –cluster $ClustersArn –service-name $ServiceArn –query 'taskArns' –output text)
  for TasksArn in $TasksArns; do
    aws ecs tag-resource –resource-arn $TasksArn –tags key=$TAG_KEY,value=$TAG_VALUE
  done
 done
done
```

以下代码示例演示了如何为所有 Amazon ECS 服务启用[标签传播](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html#ECS-UpdateService-request-propagateTags)。

```
#!/bin/bash
# Set variables
TAG_KEY="rightsizing"
TAG_VALUE="enabled"
# Get a list of ECS Clusters
ClustersArns=$(aws ecs list-clusters --query 'clusterArns' --output text)
for ClustersArn in $ClustersArns; do
 ServiceArns=$(aws ecs list-services --cluster $ClustersArn --query 'serviceArns' --output text)
 for ServiceArn in $ServiceArns; do
  aws ecs update-service --cluster $ClustersArn --service $ServiceArn --propagate-tags SERVICE &>/dev/null
  aws ecs tag-resource --resource-arn $ServiceArn --tags key=$TAG_KEY,value=$TAG_VALUE
 done
done
```

### 启用成本分配标签以使用 AWS 计费工具
<a name="optimizer-ecs-fargate-rec-billing-tools"></a>

建议激活用户定义的成本分配标签。这样，就可以在 AWS 计费工具（例如和）中识别和筛选 **Right** sizing 标签。 AWS Cost Explorer AWS 成本和使用情况报告如果您不启用此选项，则标签筛选选项和数据将不可用。有关使用成本分配标签的更多信息，请参阅 AWS 账单与成本管理 文档中的 [Activating user-defined cost allocation tags](https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/activating-tags.html)。

等待 24 小时后，您可以在 Cost Explorer 成本管理服务中看到标签，然后在下一节中实施调整建议。为此，请在 Cost Explorer 成本管理服务中搜索**调整**标签。

### 实施调整建议
<a name="optimizer-ecs-fargate-rec-rightsizing-rec"></a>

Compute Optimizer 将提供任务或容器大小建议。要实施调整建议，请执行以下操作。

1. 打开 [Amazon ECS 控制台](https://console.aws.amazon.com/ecs/v2)。

1. 从导航栏中，选择包含您的任务定义的地区。

1. 在导航窗格中，选择 **Task definitions**（任务定义）。

1. 在 **Task definitions**（任务定义）页面上，选择任务，然后选择 **Create new revision**（创建新修订版）。

1. 在 **Create new task definition revision**（创建新任务定义修订版）页面上，进行更改。要更新容器大小建议，请在 [ECS 任务定义](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_size)的 **containerDefinitions** 数据块下更新 `cpu` 和 `memory`。例如：

   ```
   "containerDefinitions": [
   	{
   		"name": "your-container-name",
   		"image": "your-image",
   		"cpu": 1024,
   		"memory": 2048,
   	}
   ],
   ```

1. 验证信息并选择 **Create**（创建）。

要更新 Amazon ECS 服务，请执行以下操作：

1. 打开 [Amazon ECS 控制台](https://console.aws.amazon.com/ecs/v2)。

1. 在 **Clusters**（集群）页面上，选择集群。

1. 在 **Cluster overview**（集群概述）页面上，选择服务，然后选择 **Update**（更新）。

1. 对于**任务定义**，选择要使用的任务定义族和修订。

对于高级操作员，您可以使用 CloudShell 更新 Amazon ECS 服务。例如：

```
bash
#!/bin/bash
# Set variables
ClustersName="workshop-cluster"
ServiceName="lab7-fargate-service"
TaskDefinition="lab7-fargate-demo:3"
# update the service
aws ecs update-service --cluster $ClustersName --service $ServiceName --task-definition $TaskDefinition
```

### 审查调整前后的成本
<a name="optimizer-ecs-fargate-rec-before-after"></a>

调整资源后，您可以使用 Cost Explorer 成本管理服务通过**调整**标签显示调整前后的成本。请记住，您可以使用[资源标签](https://docs.aws.amazon.com/whitepapers/latest/tagging-best-practices/tagging-best-practices.html)来跟踪成本。通过使用多层标签，您可以精细地了解成本。在本指南中介绍的示例中，**调整**标签用于将通用标签应用于所有目标实例。然后，使用**团队**标签来进一步整理资源。下一步是引入应用程序标签，以进一步显示运行特定应用程序的成本影响。

举一个例子，说明在单个账户级别使用**调整**标签可以降低成本。在本示例中，运营成本从每天 30.26 美元降至每天 7.56 美元。假设每月 744 小时，调整前的年度成本为 11,044.9 美元。调整后，年度成本降为 2,759.4 美元。这意味着该账户的计算成本降低了 75%。想象一下这对大型组织的影响。

在开始调整旅程之前，考虑以下事项：
+ AWS 提供了许多降低成本的选项。这包括 [AWS OLA](https://aws.amazon.com/optimization-and-licensing-assessment/)， AWS 它会在迁移到本地实例之前先检查您的本地实例 AWS。O AWS LA 还为您提供合适规模的建议和许可指南。
+ 在购买[节省计划](https://aws.amazon.com/savingsplans/)之前，完成所有调整。这可以帮助您避免超额购买节省计划承诺。

## 后续步骤
<a name="optimizer-ecs-fargate-next-steps"></a>

我们建议您完成以下后续步骤：

1. 查看您的现有格局，并考虑将 Amazon EBS gp2 卷转换为 gp3 卷。

1. 查看[节省计划](https://aws.amazon.com/savingsplans/)。

## 其他资源
<a name="optimizer-ecs-fargate-resources"></a>
+ [Compute Optimizer 入门](https://aws.amazon.com/compute-optimizer/getting-started/)（文档）AWS 
+ [标记 AWS 资源的最佳实践](https://docs.aws.amazon.com/whitepapers/latest/tagging-best-practices/tagging-best-practices.html)（AWS 白皮书）
+ [Windows 容器已开启 AWS](https://catalog.us-east-1.prod.workshops.aws/workshops/1de8014a-d598-4cb5-a119-801576492564/en-US)（工作AWS 室工作室）