

# 面向 Amazon ECS 的 AWS Fargate 架构
<a name="AWS_Fargate"></a>

AWS Fargate 是可与 Amazon ECS 结合使用的技术，使您在运行[容器](https://aws.amazon.com/containers/)时不必管理 Amazon EC2 实例的服务器或集群。使用 AWS Fargate，您不必再预配置、配置或扩展虚拟机集群即可运行容器。这样一来，您就无需再选择服务器类型、确定扩展集群的时间和优化集群打包。

使用 Fargate 运行任务和服务时，您可以将应用程序打包到容器中，指定 CPU 和内存要求，定义网络和 IAM 策略，然后启动应用程序。每个 Fargate 任务都具有自己的隔离边界，不与其他任务共享底层内核、CPU 资源、内存资源或弹性网络接口。通过将 `requiresCompatibilities` 任务定义参数设置为 `FARGATE`，您可以为 Fargate 配置任务定义。有关更多信息，请参阅 [容量](task_definition_parameters.md#requires_compatibilities)。

Fargate 提供适用于 Amazon Linux 2（平台版本 1.3.0）、Bottlerocket 操作系统（平台版本 1.4.0）以及 Microsoft Windows 2019 Server 完整版和核心版的平台版本。除非另有说明，否则该信息适用于所有 Fargate 平台。

有关在 Fargate 上支持 Linux 容器的区域的信息，请参阅 [AWS Fargate 上的 Linux 容器](AWS_Fargate-Regions.md#linux-regions)。

有关在 Fargate 上支持 Windows 容器的区域的信息，请参阅 [AWS Fargate 上的 Windows 容器](AWS_Fargate-Regions.md#windows-regions)。

## 演练
<a name="fargate-walkthrough"></a>

有关如何开始使用控制台的信息，请参阅：
+ [了解如何为 Fargate 创建 Amazon ECS Linux 任务](getting-started-fargate.md)
+ [了解如何为 Fargate 创建 Amazon ECS Windows 任务](Windows_fargate-getting_started.md)

有关如何开始使用 AWS CLI 的信息，请参阅：
+ [使用 AWS CLI 为 Fargate 创建 Amazon ECS Linux 任务](ECS_AWSCLI_Fargate.md)
+ [使用 AWS CLI 为 Fargate 创建 Amazon ECS Windows 任务](ECS_AWSCLI_Fargate_windows.md)

## 容量提供程序
<a name="fargate-spot"></a>

提供以下容量提供程序：
+ Fargate
+ Fargate Spot – 按照与 AWS Fargate 价格相比的折扣价格运行能够容忍中断的 Amazon ECS 任务。Fargate Spot 在备用计算容量上运行任务。当 AWS 需要恢复容量时，您的任务将被中断，并发出两分钟的警告。有关更多信息，请参阅 [Fargate 的 Amazon ECS 集群](fargate-capacity-providers.md)。

## 任务定义
<a name="fargate-task-defintion"></a>

Fargate 任务并非支持所有可用的 Amazon ECS 任务定义参数。某些参数完全不受支持，而其他参数对于 Fargate 任务的行为则不同。有关更多信息，请参阅 [任务 CPU 和内存](fargate-tasks-services.md#fargate-tasks-size)。

## 平台版本
<a name="fargate-platform-versions"></a>

AWS Fargate 平台版本用于指代 Fargate 任务基础设施的特定运行时环境。它是内核和容器运行时版本的组合。在运行任务或创建维护多个相同任务的服务时，您可以选择平台版本。

随着运行时环境的发展，例如，如果有内核或操作系统更新、新功能、错误修复或安全更新，将会发布新的平台版本修订版。Fargate 平台版本通过进行新的平台版本修订来更新。每个任务在其生命周期内都在一个平台版本修订版上运行。如果您想使用最新的平台版本修订版，则必须启动新任务。在 Fargate 上运行的新任务始终在平台版本的最新修订版上运行，从而确保了任务始终在安全的、经过修补的基础设施上启动。

如果发现影响现有平台版本的安全问题，AWS 将为该平台版本创建新的补丁修订版，并停止在有漏洞的修订版上运行的任务。在某些情况下，您可能会收到计划停止您在 Fargate 上的任务的通知。有关更多信息，请参阅 [Amazon ECS 上的 AWS Fargate 的任务停用和维护](task-maintenance.md)。

有关更多信息，请参阅 [适用于 Amazon ECS 的 Fargate 平台版本](platform-fargate.md)。

## 服务负载均衡
<a name="fargate-tasks-services-load-balancing"></a>

您可以选择将 AWS Fargate 上的 Amazon ECS 服务配置为使用 Elastic Load Balancing 平均分配服务中的任务流量。

AWS Fargate 上的 Amazon ECS 服务支持应用程序负载均衡器、网络负载均衡器和网关负载均衡器等负载均衡器类型。应用程序负载均衡器用于路由 HTTP/HTTPS（或第 7 层）流量。网络负载均衡器用于路由 TCP 或 UDP（或第 4 层）流量。有关更多信息，请参阅 [使用负载均衡分配 Amazon ECS 服务流量](service-load-balancing.md)。

当您为这些服务创建任何目标组时，必须选择 `ip` 而不是 `instance` 作为目标类型。这是因为使用 `awsvpc` 网络模式的任务与弹性网络接口而不是 Amazon EC2 实例关联。有关更多信息，请参阅 [使用负载均衡分配 Amazon ECS 服务流量](service-load-balancing.md)。

只有在使用平台版本 1.4 或更高版本时，才支持使用网络负载均衡器将 UDP 流量路由到 AWS Fargate 任务上的 Amazon ECS。

## 使用情况指标
<a name="fargate-usage-metrics"></a>

您可以使用 CloudWatch 用量指标来提供账户资源使用情况的可见性。这些指标可在 CloudWatch 图表和控制面板上直观呈现当前的服务使用情况。

AWS Fargate 用量指标与 AWS 服务配额对应。您可以配置警报，以在用量接近服务配额时向您发出警报。有关 AWS Fargate 服务配额的更多信息，请参阅 *Amazon Web Services 一般参考* 中的 [Amazon ECS 端点和配额](https://docs.aws.amazon.com/general/latest/gr/ecs-service.html)。

有关 AWS Fargate 使用率指标的更多信息，请参阅 [AWS Fargate 使用率指标](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/monitoring-fargate-usage.html)。

# 关于何时使用 Fargate 的 Amazon ECS 安全注意事项
<a name="security-fargate-ec2"></a>

 建议为其任务寻求强隔离的客户使用 Fargate。Fargate 在硬件虚拟化环境中运行每个任务。这将确保这些容器化工作负载不会与其他任务共享网络接口、Fargate 临时存储、CPU 或内存。有关更多信息，请参阅 [AWS Fargate 的安全概述](https://d1.awsstatic.com/whitepapers/AWS_Fargate_Security_Overview_Whitepaper.pdf)。

# Amazon ECS 中的 Fargate 安全最佳实践
<a name="security-fargate"></a>

在使用 AWS Fargate 时，建议您考虑以下最佳实践。有关其他指南，请参阅 [AWS Fargate 的安全性概述](https://d1.awsstatic.com/whitepapers/AWS_Fargate_Security_Overview_Whitepaper.pdf)。

## 使用 AWS KMS 加密 Fargate 的临时存储
<a name="security-fargate-ephemeral-storage-encryption"></a>

您应该使用 AWS KMS 或自己的客户自主管理型密钥来加密临时存储。对于使用平台版本 `1.4.0` 或更高版本在 Fargate 上托管的任务，每个任务会获得 20 GiB 的临时存储。有关更多信息，请参阅[客户自主管理型密钥（CMK）](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/fargate-storage-encryption.html)。您可以增加临时存储总量，最多可达 200GiB，方法是在您的任务定义中指定 `ephemeralStorage` 参数。对于在 2020 年 5 月 28 日或之后启动的此类任务，将使用 AES-256 加密算法以及由 Fargate 托管的加密密钥对临时存储进行加密。

有关更多信息，请参阅 [Amazon ECS 任务的存储选项](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_data_volumes.html)。

**示例：使用临时存储加密在 Fargate 平台版本 1.4.0 上启动任务**

以下命令将在 Fargate 平台版本 1.4 上启动任务。由于此任务是作为集群的一部分启动的，因此会使用自动加密的 20 GiB 临时存储。

```
aws ecs run-task --cluster clustername \
  --task-definition taskdefinition:version \
  --count 1
  --launch-type "FARGATE" \
  --platform-version 1.4.0 \
  --network-configuration "awsvpcConfiguration={subnets=[subnetid],securityGroups=[securitygroupid]}" \ 
  --region region
```

## 使用 Fargate 进行内核系统调用跟踪的 SYS\$1PTRACE 功能
<a name="security-fargate-syscall-tracing"></a>

添加或从容器中移除的 Linux 功能的默认配置由 Docker 提供。

在 Fargate 上启动的任务仅支持添加 `SYS_PTRACE` 内核功能。

下面的视频展示了如何通过 Sysdig [Falco](https://github.com/falcosecurity/falco) 项目使用此功能。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/OYGKjmFeLqI/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/OYGKjmFeLqI)


上一个视频中讨论的代码可以在 GitHub 上[在此处](https://github.com/paavan98pm/ecs-fargate-pv1.4-falco)找到。

## 将 Amazon GuardDuty 与 Fargate 运行时监控结合使用
<a name="fargate-runtime-monitoring"></a>

Amazon GuardDuty 是一项威胁检测服务，可帮助保护您的账户、容器、工作负载和 AWS 环境中的数据。GuardDuty 使用机器学习（ML）模型以及异常和威胁检测功能，持续监控不同的日志源和运行时活动，以识别环境中的潜在安全风险和恶意活动并确定其优先级。

GuardDuty 中的运行时监控通过持续监控 AWS 日志和联网活动来识别恶意或未经授权的行为，从而保护在 Fargate 上运行的工作负载。运行时监控使用轻量级、完全托管的 GuardDuty 安全代理分析主机中的行为，例如文件访问、进程执行和网络连接。它涉及的问题包括权限升级、使用公开的凭证，或与恶意 IP 地址、域通信，以及您的 Amazon EC2 实例和容器工作负载上存在恶意软件。有关更多信息，请参阅《GuardDuty 用户指南》**中的 [GuardDuty 运行时监控](https://docs.aws.amazon.com/guardduty/latest/ug/runtime-monitoring.html)。

# Amazon ECS 的 Fargate 安全注意事项
<a name="fargate-security-considerations"></a>

每项任务都有专用的基础设施容量，因为 Fargate 在隔离的虚拟环境中运行每个工作负载。在 Fargate 上运行的工作负载不与其他任务共享网络接口、临时存储、CPU 或内存。您可以在一个任务中运行多个容器，包括应用程序容器和 sidecar 容器，或者仅仅是 sidecar。*sidecar* 是在 Amazon ECS 任务中与应用程序容器一起运行的容器。当应用程序容器运行核心应用程序代码时，在 sidecar 中运行的进程可以增强应用程序。Sidecar 可帮助您将应用程序功能隔离到专用容器中，从而更轻松地更新应用程序的各个部分。

属于同一任务的容器会共享 Fargate 启动类型的资源，因为这些容器将始终在同一台主机上运行，并共享计算资源。这些容器还共享 Fargate 提供的临时存储空间。任务中的 Linux 容器共享网络命名空间，包括 IP 地址和网络端口。在任务中，属于该任务的容器可以通过 localhost 进行相互通信。

Fargate 中的运行时系统环境会阻止您使用 EC2 实例支持的特定控制器功能。设计在 Fargate 上运行的工作负载时，请考虑以下事项：
+ 没有特权容器或访问权限：Fargate 目前不提供诸如特权容器或访问权限之类的功能。这将影响应用场景，例如在 Docker 中运行 Docker。
+  对 Linux 功能的访问受限：容器在 Fargate 上运行的环境已被锁定。其他 Linux 功能（例如 CAP\$1SYS\$1ADMIN 和 CAP\$1NET\$1ADMIN）受到限制，以防止权限升级。Fargate 支持向任务添加 [CAP\$1SYS\$1PTRACE](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#other_task_definition_params) Linux 功能，以允许在任务中部署的可观测性和安全工具来监控容器化应用程序。
+ 无法访问底层主机：客户和 AWS 操作人员都无法连接到运行客户工作负载的主机。您可以使用 ECS Exec 在 Fargate 上运行的容器中运行命令或获取 shell。您可以使用 ECS exec 来帮助收集用于调试的诊断信息。Fargate 还阻止容器访问底层主机的资源，例如文件系统、设备、联网和容器运行时系统。
+ 联网：您可以使用安全组和网络 ACL 来控制入站和出站流量。Fargate 任务会从您的 VPC 中配置的子网接收一个 IP 地址。

# 适用于 Amazon ECS 的 Fargate 平台版本
<a name="platform-fargate"></a>

AWS Fargate 平台版本用于指代 Fargate 任务基础设施的特定运行时环境。它是内核和容器运行时版本的组合。在运行任务或创建维护多个相同任务的服务时，您可以选择平台版本。

随着运行时环境的发展，例如，如果有内核或操作系统更新、新功能、错误修复或安全更新，将会发布新的平台版本修订版。Fargate 平台版本通过进行新的平台版本修订来更新。每个任务在其生命周期内都在一个平台版本修订版上运行。如果您想使用最新的平台版本修订版，则必须启动新任务。在 Fargate 上运行的新任务始终在平台版本的最新修订版上运行，从而确保了任务始终在安全的、经过修补的基础设施上启动。

如果发现影响现有平台版本的安全问题，AWS 将为该平台版本创建新的补丁修订版，并停止在有漏洞的修订版上运行的任务。在某些情况下，您可能会收到计划停止您在 Fargate 上的任务的通知。有关更多信息，请参阅 [Amazon ECS 上的 AWS Fargate 的任务停用和维护](task-maintenance.md)。

在运行任务或部署服务时，需要指定平台版本。

指定平台版本时请考虑以下事项：
+ 可以指定特定版本号，例如 `1.4.0` 或 `LATEST`。

  **最新的** Linux 平台版本是 `1.4.0`。

  **最新的** Windows 平台版本是 `1.0.0`。
+ 如果要更新某个服务的平台版本，请创建部署。例如，假设您有一个在 Linux 平台版本 `1.3.0` 上运行任务的服务。要将此服务改为在 Linux 平台版本 `1.4.0` 上运行任务，您可以更新此服务并指定新的平台版本。您的任务将使用最新的平台版本和最新的平台版本修订版重新部署。有关部署的更多信息，请参阅 [Amazon ECS 服务](ecs_services.md)。
+ 如果您的服务扩展而没有更新平台版本，这些任务将收到在服务的当前部署中指定的平台版本。例如，假设您有一个在 Linux 平台版本 `1.3.0` 上运行任务的服务。如果增加该服务的预期任务数，则服务调度器将使用平台版本 `1.3.0` 的最新平台版本修订版启动新任务。
+ 新任务始终在平台版本的最新修订版本上运行。这样可以确保任务始终在安全且经过修补的基础设施上运行。
+ Fargate 上用于 Linux 容器和 Windows 容器的平台版本号是独立的。例如，Fargate 上的 Windows 容器的平台版本 `1.0.0` 中使用的行为、功能和软件无法与 Fargate 上的 Linux 容器的平台版本 `1.0.0` 相比。
+ 以下内容适用于 Fargate Windows 平台版本。

  必须从特定版本的 Windows Server 创建 Microsoft Windows Server 容器映像。运行任务或创建与 Windows Server 容器映像相匹配的服务时，必须在 `platformFamily` 中选择相同版本的 Windows Server。此外，您可以在任务定义中提供匹配的 `operatingSystemFamily`，以防止任务在错误的 Windows 版本上运行。有关更多信息，请参阅 Microsoft Learn 网站上的[将容器主机版本与容器映像版本相匹配](https://learn.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/version-compatibility#matching-container-host-version-with-container-image-versions)。

# 在 Amazon ECS 上迁移到 Linux 平台版本 1.4.0
<a name="platform-version-migration"></a>

将 Fargate 任务上的 Amazon ECS 从平台版本 `1.0.0`、`1.1.0`、`1.2.0` 或 `1.3.0` 迁移到平台版本 `1.4.0` 时，请考虑以下事项。在迁移任务前，最佳实践是先确认您的任务在平台版本 `1.4.0` 上可以正常运行。
+ 针对任务和来自任务的网络流量行为已更新。从平台版本 1.4.0 开始，Fargate 任务上的所有 Amazon ECS 都会接收单个弹性网络接口（称为任务 ENI），所有网络流量都会流经 VPC 内的此 ENI。您可在 VPC 流日志中看到此流量。有关更多信息，请参阅 [Fargate 的 Amazon ECS 任务联网选项](fargate-task-networking.md)。
+ 如果您使用的是接口 VPC 端点，请考虑以下事项。
  + 对于使用 Amazon ECR 托管的容器映像，需要以下端点。有关更多信息，请参阅《Amazon Elastic Container Registry 用户指南》**中的[Amazon ECR 接口 VPC 端点（AWS PrivateLink）](https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html)。
    + **com.amazonaws.*region*.ecr.dkr** Amazon ECR VPC 端点
    + **com.amazonaws.*region*.ecr.api** Amazon ECR VPC 端点
    +  Amazon S3 网关端点
  + 当任务定义引用 Secrets Manager 密钥来检索容器的敏感数据时，必须为 Secrets Manager 创建接口 VPC 端点。有关更多信息，请参阅 *AWS Secrets Manager 用户指南*中的[将 Secrets Manager 与 VPC 端点结合使用](https://docs.aws.amazon.com/secretsmanager/latest/userguide/vpc-endpoint-overview.html)。
  + 当任务定义引用 Systems Manager Parameter Store 参数来检索容器的敏感数据时，您必须为 Systems Manager 创建接口 VPC 端点。有关更多信息，请参阅《AWS Systems Manager 用户指南》**中的[使用适用于 Systems Manager 的 VPC 端点提高 EC2 实例的安全性](https://docs.aws.amazon.com/systems-manager/latest/userguide/setup-create-vpc.html)。
  + 与您任务关联的弹性网络接口（ENI）中的安全组需要安全组规则，以允许任务与 VPC 端点之间进行流量传输。

# Fargate Linux 平台版本更改日志
<a name="platform-versions-changelog"></a>

下面是可用的 Linux 平台版本。有关平台版本弃用的信息，请参阅 [AWS Fargate Linux 平台版本弃用](platform-versions-retired.md)。

## 1.4.0
<a name="platform-version-1-4"></a>

以下是平台版本的更新日志 `1.4.0`。
+ 自 2020 年 11 月 5 日起，任何Fargate 上使用平台版本 `1.4.0` 启用的新的 Amazon ECS 任务都能够使用以下功能：
  + 当使用 Secrets Manager 存储敏感数据时，您可以将特定 JSON 键或特定版本的密钥注入为环境变量或注入到日志配置中。有关更多信息，请参阅 [将敏感数据传递给 Amazon ECS 容器](specifying-sensitive-data.md)。
  + 批量指定环境变量，使用 `environmentFiles` 容器定义参数。有关更多信息，请参阅 [将单个环境变量传递给 Amazon ECS 容器](taskdef-envfiles.md)。
  + 在 VPC 和为 IPv6 启用的子网中运行的任务将同时分配一个专用 IPv4 地址和 IPv6 地址。有关更多信息，请参阅 [Fargate 的 Amazon ECS 任务联网选项](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/fargate-task-networking.html)。
  + 任务元数据端点版本 4 提供了有关您的任务和容器的其他元数据，包括任务启动类型、容器的 Amazon 资源名称（ARN）以及使用的日志驱动程序和日志驱动程序选项。当查询 `/stats` 端点时，您还可以接收容器的网络速率统计数据。有关更多信息，请参阅[任务元数据端点版本 4](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-metadata-endpoint-v4-fargate.html)。
+ 自 2020 年 7 月 30 日起，任何 Fargate 上使用平台版本 `1.4.0` 启用的新的 Amazon ECS 任务能够在 Fargate 任务中使用网络负载均衡器将 UDP 流量路由到他们的 Amazon ECS。有关更多信息，请参阅 [使用负载均衡分配 Amazon ECS 服务流量](service-load-balancing.md)。
+ 从 2020 年 5 月 28 日开始，任何 Fargate 上使用平台版本 `1.4.0` 启用的新的 Amazon ECS 任务都将使用 AES-256 加密算法通过 AWS 托管加密密钥来加密其短暂存储空间。有关更多信息，请参阅[适用于 Amazon ECS 的 Fargate 临时存储](fargate-task-storage.md)和[Amazon ECS 任务的存储选项](using_data_volumes.md)。
+ 增加了对将 Amazon EFS 文件系统卷用于持久性任务存储的支持。有关更多信息，请参阅 [将 Amazon EFS 卷与 Amazon ECS 结合使用](efs-volumes.md)。
+ 每个任务的短暂任务存储空间已增加到至少 20 GB。有关更多信息，请参阅 [适用于 Amazon ECS 的 Fargate 临时存储](fargate-task-storage.md)。
+ 针对任务和来自任务的网络流量行为已更新。从平台版本 1.4.0 开始，所有 Fargate 任务都会接收单个弹性网络接口（称为任务 ENI），所有网络流量都将流经 VPC 内的这个 ENI，并将通过 VPC 流日志对您可见。有关 Amazon EC2 启动类型联网的更多信息，请参阅 [EC2 的 Amazon ECS 任务联网选项](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html)。有关 Fargate 联网的更多信息，请参阅 [Fargate 的 Amazon ECS 任务联网选项](fargate-task-networking.md)。
+ 任务 ENI 增加对巨型帧的支持。网络接口配置了最大传输单元（MTU），这是单个帧内将放入的最大有效载荷的大小。MTU 越大，单个帧内可以放入的应用程序有效载荷就越多，这可以减少每帧开销并提高效率。当您的任务和目标之间的网络路径支持巨型帧时，支持巨型帧将减少开销，如保留在您的 VPC 中的所有流量。
+ CloudWatch Container Insights 将包括 Fargate 任务的网络性能指标。有关更多信息，请参阅 [使用具有增强型可观测性的 Container Insights 监控 Amazon ECS 容器](cloudwatch-container-insights.md)。
+ 增加了对任务元数据端点版本 4 的支持，该端点为您的 Fargate 任务提供附加信息，包括任务的网络统计信息以及任务所运行的可用区。有关更多信息，请参阅[Amazon ECS 任务元数据端点版本 4](task-metadata-endpoint-v4.md)和[Fargate 上任务的 Amazon ECS 任务元数据端点版本 4](task-metadata-endpoint-v4-fargate.md)。
+ 增加了对容器定义中的 `SYS_PTRACE` Linux 参数的支持。有关更多信息，请参阅 [Linux 参数](task_definition_parameters.md#container_definition_linuxparameters)。
+ Amazon ECS 容器代理替代了对所有 Fargate 任务使用 Amazon ECS 容器代理。通常，此更改不会影响您的任务运行方式。
+ 容器运行时现在使用 Containerd 而不是 Docker。此更改很可能不会影响您的任务运行方式。您会注意到，源自容器运行时的一些错误消息将从提及 Docker 变为更一般的错误。有关更多信息，请参阅 [Amazon ECS 任务已停止错误消息](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/stopped-task-error-codes.html)。
+ 基于 Amazon Linux 2

# AWS Fargate Linux 平台版本弃用
<a name="platform-versions-retired"></a>

**重要**  
 我们将于 2026 年 6 月 30 日终止对 Fargate 中 PV 1.3.0 的支持。自 2026 年 6 月 15 日起，我们将停用平台版本 1.3.0。届时，您将无法启动新任务或创建使用平台版本 1.3.0 配置的新服务，但现有任务将继续运行。2026 年 6 月 30 日，我们将终止使用平台版本 1.3.0 所配置的所有剩余正在运行的任务。  
有关如何迁移至平台版本 1.4 的信息，请参阅 [在 Amazon ECS 上迁移到 Linux 平台版本 1.4.0](platform-version-migration.md)。

下表列出了 AWS Fargate 已弃用或已计划弃用的 Linux 平台版本。在到达公布的弃用日期之前，这些平台版本将仍然可用。

为计划弃用的每个平台版本提供*强制更新日期*。在强制更新日期，任何使用 `LATEST` 平台版本且指向计划弃用的平台版本的服务都将使用强制新部署选项进行更新。使用强制新部署选项更新服务时，在计划弃用的平台版本上运行的所有任务都将停止，并且新任务将使用 `LATEST` 标记指向。具有显式平台版本集的独立任务或服务不受强制更新日期的影响。

有关如何迁移至最新平台版本的信息，请参阅 [在 Amazon ECS 上迁移到 Linux 平台版本 1.4.0](platform-version-migration.md)。

当某个平台版本到达了*弃用日期*后，该平台版本将不再可用于新任务或服务。任何明确使用已弃用的平台版本的独立任务或服务将继续使用该平台版本，直到任务停止为止。弃用日期后，已弃用的平台版本将不再接收任何安全更新或错误修复。


| 平台版本 | 强制更新日期 | 弃用日期 | 
| --- | --- | --- | 
|  1.0.0  |  2020 年 10 月 26 日  |  2020 年 12 月 14 日  | 
|  1.1.0  |  2020 年 10 月 26 日  |  2020 年 12 月 14 日  | 
|  1.2.0  |  2020 年 10 月 26 日  |  2020 年 12 月 14 日  | 
| 1.3.0 |  | 2026 年 6 月 15 日 | 

有关最新平台版本的信息，请参阅 [适用于 Amazon ECS 的 Fargate 平台版本](platform-fargate.md)。

## 已弃用的 Fargate Linux 版本更改日志
<a name="deprecated-version-changelog"></a>

### 1.3.0
<a name="platform-version-1-3"></a>

以下是平台版本的更新日志 `1.3.0`。
+ 从 2019 年 9 月 30 日开始，所启动的任何新的 Fargate 任务均支持 `awsfirelens` 日志驱动程序。配置 FireLens for Amazon ECS，使用任务定义参数将日志路由到 AWS 服务或 AWS 合作伙伴网络（APN）目标，以进行日志存储和分析。有关更多信息，请参阅 [将 Amazon ECS 日志发送到 AWS 服务或 AWS Partner](using_firelens.md)。
+ 增加了 Fargate 任务的任务回收，此过程用于刷新作为 Amazon ECS 服务一部分的任务。有关更多信息，请参阅 [Amazon ECS 上的 AWS Fargate 的任务停用和维护](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-maintenance.html)。
+ 从 2019 年 3 月 27 日开始，所启动的任何新的 Fargate 任务均可以使用其他任务定义参数，您可以通过这些参数定义代理配置、容器启动和关闭的依赖条件，以及每个容器的启动和停止超时值。有关更多信息，请参阅 [代理配置](task_definition_parameters.md#proxyConfiguration)、[容器依赖项](task_definition_parameters.md#container_definition_dependson) 和 [容器超时](task_definition_parameters.md#container_definition_timeout)。
+ 从 2019 年 4 月 2 日开始，所启动的任何新的 Fargate 任务均支持向容器中注入敏感数据，方式是将您的敏感数据存储在 AWS Secrets Manager 密钥或 AWS Systems Manager Parameter Store 参数中，然后在容器定义中引用它们。有关更多信息，请参阅 [将敏感数据传递给 Amazon ECS 容器](specifying-sensitive-data.md)。
+ 从 2019 年 5 月 1 日开始，所启动的任何新的 Fargate 任务均支持使用 `secretOptions` 容器定义参数来引用容器的日志配置中的敏感数据。有关更多信息，请参阅 [将敏感数据传递给 Amazon ECS 容器](specifying-sensitive-data.md)。
+ 从 2019 年 5 月 1 日开始，所启动的任何新的 Fargate 任务均支持 `splunk` 日志驱动程序以及 `awslogs` 日志驱动程序。有关更多信息，请参阅 [存储和日志记录](task_definition_parameters.md#container_definition_storage)。
+ 从 2019 年 7 月 9 日开始，启动的任何新 Fargate 任务都支持 CloudWatch Container Insights。有关更多信息，请参阅 [使用具有增强型可观测性的 Container Insights 监控 Amazon ECS 容器](cloudwatch-container-insights.md)。
+ 从 2019 年 12 月 3 日开始，支持 Fargate Spot 容量提供程序。有关更多信息，请参阅 [Fargate 的 Amazon ECS 集群](fargate-capacity-providers.md)。
+ 基于 Amazon Linux 2

### 1.2.0
<a name="platform-version-1-2"></a>

以下是平台版本的更新日志 `1.2.0`。

**注意**  
平台版本 `1.2.0` 不再可用。有关平台版本弃用的信息，请参阅 [AWS Fargate Linux 平台版本弃用](#platform-versions-retired)。
+ 添加了对使用 AWS Secrets Manager 进行私有注册表身份验证的支持。有关更多信息，请参阅 [在 Amazon ECS 中使用非 AWS 容器映像](private-auth.md)。

### 1.1.0
<a name="platform-version-1-1"></a>

以下是平台版本的更新日志 `1.1.0`。

**注意**  
平台版本 `1.1.0` 不再可用。有关平台版本弃用的信息，请参阅 [AWS Fargate Linux 平台版本弃用](#platform-versions-retired)。
+ 添加了对 Amazon ECS 任务元数据端点的支持。有关更多信息，请参阅 [Amazon ECS 任务元数据可用于 Fargate 上的任务](fargate-metadata.md)。
+ 增加了对容器定义中 Docker 运行状况检查的支持。有关更多信息，请参阅 [运行状况检查](task_definition_parameters.md#container_definition_healthcheck)。
+ 添加了对 Amazon ECS 服务发现的支持。有关更多信息，请参阅 [使用服务发现连接具有 DNS 名称的 Amazon ECS 服务](service-discovery.md)。

### 1.0.0
<a name="platform-version-1-0"></a>

以下是平台版本的更新日志 `1.0.0`。

**注意**  
平台版本 `1.0.0` 不再可用。有关平台版本弃用的信息，请参阅 [AWS Fargate Linux 平台版本弃用](#platform-versions-retired)。
+ 基于 Amazon Linux 2017.09
+ 初始版本。

# Fargate Windows 平台版本更改日志
<a name="platform-windows-fargate"></a>

下面是可用于 Windows 容器的平台版本。

## 1.0.0
<a name="platform-version-w1-0"></a>

以下是平台版本的更新日志 `1.0.0`。
+ 初次发布，旨在支持以下 Microsoft Windows Server 操作系统：
  + Windows Server 2019 Full
  + Windows Server 2019 Core
  + Windows Server 2022 Full
  + Windows Server 2022 Core

# 适用于 Amazon ECS 的 Fargate 上的 Windows 容器注意事项
<a name="windows-considerations"></a>

以下是在 AWS Fargate 上运行 Windows 容器时需要了解的区别和注意事项。

如果您需要在 Linux 和 Windows 容器上运行任务，则需要为每个操作系统创建单独的任务定义。

AWS 负责操作系统许可证管理，因此您不需要任何额外的 Microsoft Windows Server 许可证。

AWS Fargate 上的 Windows 容器支持以下操作系统：
+ Windows Server 2019 Full
+ Windows Server 2019 Core
+ Windows Server 2022 Full
+ Windows Server 2022 Core

AWS Fargate 上的 Windows 容器支持 awslog 驱动程序。有关更多信息，请参阅 [将 Amazon ECS 日志发送到 CloudWatch](using_awslogs.md)。

Fargate 上的 Windows 容器上不支持以下功能：
+ Amazon FSx
+ ENI 中继
+ 适用于 Windows 容器的 gMSA
+ 针对任务的 App Mesh 服务和代理集成
+ Firelens 日志路由器集成用于任务
+ EFS 卷
+ EBS 卷
+ 以下任务定义参数：
  + `maxSwap`
  + `swappiness`
  + `environmentFiles`
+ Fargate Spot 容量提供程序
+ 映像卷

  Dockerfile `volume` 选项被忽略。改为在任务定义中指定绑定挂载。有关更多信息，请参阅 [将绑定挂载与 Amazon ECS 结合使用](bind-mounts.md)。
+ Windows 容器将忽略任务级 CPU 和内存参数。我们建议为 Windows 容器指定容器级资源。
+ 用于任务的内存
+ 容器上的 mermoryReservation
+ 容器上的重启策略
+ 您无法更新服务的 platformFamily。

# Fargate 上的 Linux 容器的 Amazon ECS 容器映像拉取行为
<a name="fargate-pull-behavior"></a>

每个 Fargate 任务都在自己的单用途、单租户实例上运行。当您在 Fargate 上运行 Linux 容器时，容器映像或容器映像层不会缓存在实例上。因此，对于任务中定义的每个容器映像，需要从每个 Fargate 任务的容器映像注册表中提取整个容器映像。提取映像所需的时间与启动 Fargate 任务所花费的时间直接相关。

要优化映像提取时间，请考虑以下因素。

**容器映像近似**  
要缩短下载容器映像所需的时间，请将数据放置在尽可能靠近计算机的位置。通过互联网或跨 AWS 区域 提取容器映像可能会影响下载时间。建议您将容器映像存储在运行任务的同一区域。如果您将容器映像存储在 Amazon ECR 中，则请使用 VPC 接口端点来进一步缩短映像提取时间。有关更多信息，请参阅《Amazon ECR 用户指南》**中的 [Amazon ECR 接口 VPC 端点（AWS PrivateLink）](https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html)。

**缩小容器映像大小**  
容器映像的大小直接影响下载时间。减小容器映像的大小或容器映像层的数量可以缩短映像下载所需的时间。轻量级基础映像（例如最小的 Amazon Linux 2023 容器映像）可能比基于传统操作系统基础映像的映像小得多。有关最小映像的更多信息，请参阅《Amazon Linux 2023 用户指南》**中的 [AL2023 最小容器映像](https://docs.aws.amazon.com/linux/al2023/ug/minimal-container.html)。

**替代压缩算法**  
推送到容器映像注册表时，容器映像层通常会被压缩。压缩容器映像层可以减少必须通过网络传输并存储在容器映像注册表中的数据量。在容器运行时将容器映像层下载到实例后，将对该层进行解压缩。使用的压缩算法和运行时可用的 vCPU 数量会影响解压缩容器映像所需要的时间。在 Fargate 上，您可以增加任务的大小或利用性能更高的 zstd 压缩算法来缩短解压缩所需要的时间。有关更多信息，请参阅 GitHub 上的 [ztsd](https://github.com/facebook/zstd)。有关如何实现 Fargate 的映像的信息，请参阅[使用 zstd 压缩容器映像缩短 AWS Fargate 启动时间](https://aws.amazon.com/blogs/containers/reducing-aws-fargate-startup-times-with-zstd-compressed-container-images/)。

**延迟加载容器映像**  
对于大型容器映像（> 250mb），最好延迟加载容器映像，而不是下载所有容器映像。在 Fargate 上，您可以使用 Seekable OCI（SOCI）从容器映像注册表中延迟加载容器映像。有关更多信息，请参阅 GitHub 上的 [soci-snapshotter](https://github.com/awslabs/soci-snapshotter) 和[使用 Seekable OCI（SOCI）延迟加载容器映像](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/fargate-tasks-services.html#fargate-tasks-soci-images)。

# Fargate 上的 Windows 容器的 Amazon ECS 容器映像拉取行为
<a name="fargate-windows-behavior"></a>

Fargate Windows 缓存 Microsoft 提供的最近一个月和上个月的服务器核心基础映像。这些映像与每个补丁周二更新的 KB/Build 版本号补丁相匹配。例如，Microsoft 在 2024 年 4 月 9 日发布了适用于 Windows Server 2019 的 KB5036896（17763.5696）。上个月 2024 年 3 月 12 日的 KB 是 KB5035849（17763.5576）。因此，对于平台 `WINDOWS_SERVER_2019_CORE` 和 `WINDOWS_SERVER_2019_FULL`，已缓存以下容器映像：
+ `mcr.microsoft.com/windows/servercore:ltsc2019`
+ ` mcr.microsoft.com/windows/servercore:10.0.17763.5696`
+ `mcr.microsoft.com/windows/servercore:10.0.17763.5576`

 此外，Microsoft 在 2024 年 4 月 9 日发布了适用于 Windows Server 2022 的 KB5036909（20348.2402）。上个月 2024 年 3 月 12 日的 KB 是 KB5035857（20348.2340）。因此，对于平台 `WINDOWS_SERVER_2022_CORE` 和 `WINDOWS_SERVER_2022_FULL`，已缓存以下容器映像：
+ `mcr.microsoft.com/windows/servercore:ltsc2022`
+ `mcr.microsoft.com/windows/servercore:10.0.20348.2402`
+ `mcr.microsoft.com/windows/servercore:10.0.20348.2340` 

# 适用于 Amazon ECS 的 Fargate 临时存储
<a name="fargate-task-storage"></a>

预置后，AWS Fargate 上的 Linux 容器上托管的每个 Amazon ECS 任务都会收到绑定挂载的以下短暂存储。可在任务定义中使用 `volumes`、`mountPoints` 和 `volumesFrom` 参数在容器之间挂载和共享此存储。AWS Fargate 上的 Windows 容器不支持此选项。

## Fargate Linux 容器平台版本
<a name="fargate-task-storage-linux-pv"></a>

### 版本 1.4.0 或更高版本
<a name="fargate-task-storage-pv14"></a>

预设情况下，使用平台版本 `1.4.0` 或更高版本托管在 Fargate 上的 Amazon ECS 任务获得至少 20GiB 的短暂存储。临时存储总量可以增加，最多可达 200GiB。您可以通过在任务定义中指定 `ephemeralStorage` 参数执行此操作。

任务的拉出、压缩和未压缩容器映像存储在临时存储中。要确定任务必须使用的临时存储总量，必须从分配的任务临时存储总量中减去容器映像使用的存储量。

对于使用平台版本 `1.4.0` 或更高版本且在 2020 年 5 月 28 日或之后启动的任务，将使用 AES-256 加密算法对短暂存储进行加密。此算法使用由 AWS 所有的加密密钥，您也可以使用自己的客户自主管理型密钥。有关更多信息，请参阅 [Customer managed keys for AWS Fargate ephemeral storage](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/fargate-storage-encryption.html)。

对于使用平台版本 `1.4.0` 或更高版本且在 2022 年 11 月 18 日或之后启动的任务，将通过任务元数据端点报告短暂存储使用情况。任务中的应用程序可以查询任务元数据端点版本 4 以获取其短暂存储预留大小和已用量。

 此外，如果您启用 Container Insights，短暂存储预留大小和已用量将发送到 Amazon CloudWatch Container Insights。

**注意**  
Fargate 可保留磁盘空间。该磁盘空间仅由 Fargate 使用。您无需为此付费。它没有显示在这些指标中。但是，您可以在 `df` 等其他工具中看到这种额外的存储空间。

### 版本 1.3.0 或更早版本
<a name="fargate-task-storage-pv13"></a>

对于使用平台版本 `1.3.0` 或更早版本的 Fargate 任务上的 Amazon ECS，每个任务都会收到以下临时存储。
+ 10 GB 的 Docker 层存储
**注意**  
此数量包括压缩和未压缩的容器映像伪影。
+ 额外 4 GB 用于卷挂载。可在任务定义中使用 `volumes`、`mountPoints` 和 `volumesFrom` 参数在容器之间挂载和共享此存储。

## Fargate Windows 容器平台版本
<a name="fargate-task-storage-windows-pv"></a>

### 版本 1.0.0 或更高版本
<a name="fargate-task-storage-pvws1"></a>

预设情况下，使用平台版本 `1.0.0` 或更高版本托管在 Fargate 上的 Amazon ECS 任务获得至少 20GiB 的短暂存储。临时存储总量可以增加，最多可达 200GiB。您可以通过在任务定义中指定 `ephemeralStorage` 参数执行此操作。

任务的拉出、压缩和未压缩容器映像存储在临时存储中。要确定任务必须使用的临时存储总量，必须从分配的任务临时存储总量中减去容器映像使用的存储量。

有关更多信息，请参阅 [将绑定挂载与 Amazon ECS 结合使用](bind-mounts.md)。

# 用于 Amazon ECS 的 AWS Fargate 临时存储的客户自主管理型密钥
<a name="fargate-storage-encryption"></a>

AWS Fargate 支持使用客户自主管理型密钥来加密存储在临时存储中的 Amazon ECS 任务数据，以帮助监管敏感型客户满足其内部安全策略的需要。客户不仅可以继续享受 Fargate 的无服务器优势，同时还可让合规审计人员更好地了解自行管理的存储加密。尽管 Fargate 默认使用由 Fargate 托管的临时存储加密，但客户在加密财务或健康相关信息等敏感数据时也可以使用自行管理的密钥。

您可以将自己的密钥导入 AWS KMS 或在 AWS KMS 中创建密钥。这些自行管理的密钥存储在 AWS KMS 中并执行标准的 AWS KMS 生命周期操作，例如轮换、禁用和删除等。您可以利用 CloudTrail 日志来审计密钥访问和使用情况。

默认情况下，每个 KMS 密钥支持 5 万个授权。Fargate 为每个客户自主管理型密钥任务使用单个 AWS KMS 授权，因此每个密钥最多支持 5 万个并发任务。如果需要增加此上限，您可以申请增加配额，但需要逐一具体审批。

Fargate 不会因使用客户自主管理型密钥而收取额外的费用。您只需按标准价格为用于存储和 API 请求的 AWS KMS 密钥付费。

**Topics**
+ [为 Amazon ECS 的 Fargate 临时存储创建加密密钥](fargate-create-storage-key.md)
+ [管理 Amazon ECS 的 Fargate 临时存储的 AWS KMS 密钥](fargate-managing-kms-key.md)

# 为 Amazon ECS 的 Fargate 临时存储创建加密密钥
<a name="fargate-create-storage-key"></a>

创建一个客户自主管理型密钥来加密存储在 Fargate 临时存储上的数据。

**注意**  
使用客户自主管理型密钥加密 Fargate 临时存储的功能不适用于 Windows 任务集群。  
使用客户自主管理型密钥加密 Fargate 临时存储的功能不适用于早于 `1.4.0` 的 `platformVersions`。  
Fargate 在临时存储中预留了仅供 Fargate 使用的空间，您无需为此空间付费。具体分配可能与非客户自主管理密钥任务不同，但总空间保持不变。您可以通过 `df` 等工具查看此更改。  
Fargate 临时存储不支持多区域密钥。  
Fargate 临时存储不支持 KMS 密钥别名。

要在 AWS KMS 中创建客户自主管理型密钥（CMK）来加密 Fargate 临时存储，请执行以下步骤。

1. 导航到 [https://console.aws.amazon.com/kms](https://console.aws.amazon.com/kms)。

1. 按照《AWS Key Management Service 开发人员指南》中 [Creating Keys](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html)[https://docs.aws.amazon.com/kms/latest/developerguide/overview.html](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) 部分的说明操作。

1. 创建 AWS KMS 密钥时，请务必在密钥策略中提供 Fargate 服务相关 AWS KMS 操作权限。要将客户自主管理型密钥用于 Amazon ECS 集群资源，策略中必须允许以下 API 操作。
   + `kms:GenerateDataKeyWithoutPlainText` – 调用 `GenerateDataKeyWithoutPlainText` 以利用提供的 AWS KMS 密钥生成加密的数据密钥。
   + `kms:CreateGrant` – 向客户自主管理型密钥添加授权。这些授权会控制对指定 AWS KMS 密钥的访问权限，从而允许访问 Amazon ECS Fargate 所需的授权操作。有关[使用授权](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html)的更多信息，请参阅[https://docs.aws.amazon.com/kms/latest/developerguide/overview.html](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)《AWS Key Management Service 开发人员指南》。这将允许 Amazon ECS Fargate 执行以下操作：
     + 调用 `Decrypt` 以便 AWS KMS 获取加密密钥，以便解密临时存储数据。
     + 设置停用主体，以允许服务 `RetireGrant`。
   + `kms:DescribeKey` – 提供客户自主管理型密钥详细信息，以便 Amazon ECS 验证该密钥是否是对称密钥以及是否已经启用。

   以下示例演示了一个将应用到目标加密密钥的 AWS KMS 密钥策略。要使用示例策略语句，请将 *user input placeholders* 替换为您自己的信息。与往常一样，只配置您需要的权限，但需要向至少一个用户提供具有权限的 AWS KMS 以免出现错误。

   ```
   {
         "Sid": "Allow generate data key access for Fargate tasks.",
         "Effect": "Allow",
         "Principal": { "Service":"fargate.amazonaws.com" },
         "Action": [
           "kms:GenerateDataKeyWithoutPlaintext"
         ],
         "Condition": {
           "StringEquals": {
             "kms:EncryptionContext:aws:ecs:clusterAccount": [
               "customerAccountId"
             ],
             "kms:EncryptionContext:aws:ecs:clusterName": [
                "clusterName"
             ]   
           }
         },
         "Resource": "*"
       },
       {
         "Sid": "Allow grant creation permission for Fargate tasks.",
         "Effect": "Allow",
         "Principal": { "Service":"fargate.amazonaws.com" },
         "Action": [
           "kms:CreateGrant"
         ],
         "Condition": {
           "StringEquals": {
             "kms:EncryptionContext:aws:ecs:clusterAccount": [
               "customerAccountId"
             ],
             "kms:EncryptionContext:aws:ecs:clusterName": [
                "clusterName"
             ]   
           },
          "ForAllValues:StringEquals": {
             "kms:GrantOperations": [
                "Decrypt"
             ]
          }
         },
         "Resource": "*"
       },
       {
         "Sid": "Allow describe key permission for cluster operator - CreateCluster and UpdateCluster.",
         "Effect": "Allow",
         "Principal": { "AWS":"arn:aws:iam::customerAccountId:role/customer-chosen-role" },
         "Action": [
           "kms:DescribeKey"
         ],
         "Resource": "*"
       }
   ```

   Fargate 任务使用 `aws:ecs:clusterAccount` 和 `aws:ecs:clusterName` 加密上下文密钥来执行密钥的加密操作。客户应添加这些权限以限制对特定账户和/或集群的访问。当您指定集群时，请使用集群名称而不是 ARN。

   有关更多信息，请参阅 [AWS KMS 开发人员指南](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)中的[加密内容](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)。

   创建或更新集群时，您可以选择使用条件键 `fargateEphemeralStorageKmsKeyId`。借助此条件减，客户可以更精细地控制 IAM 策略。对 `fargateEphemeralStorageKmsKeyId` 配置的更新仅对新的服务部署生效。

   以下示例将允许客户仅向一组特定的已批准 AWS KMS 密钥授予权限。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Effect": "Allow",
         "Action": [
           "ecs:CreateCluster",
           "ecs:UpdateCluster"
         ],
         "Resource": "*",
         "Condition": {
           "StringEquals": {
             "ecs:fargate-ephemeral-storage-kms-key": "arn:aws:kms:us-west-2:111122223333:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
           }
         }
       }
     ]
   }
   ```

------

   下一个示例将拒绝删除已与集群关联的 AWS KMS 密钥的尝试。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": {
       "Effect": "Deny",
       "Action": [
           "ecs:CreateCluster",
           "ecs:UpdateCluster"
       ],
       "Resource": "*",
       "Condition": {
         "Null": {
           "ecs:fargate-ephemeral-storage-kms-key": "true"
         }
       }
     }
   }
   ```

------

   客户可以使用 AWS CLI `describe-tasks`、`describe-cluster` 或 `describe-services` 命令查看其非托管式任务或服务任务是否在使用该密钥进行加密。

   有关更多信息，请参阅《AWS KMS 开发人员指南》中的 [Condition keys for AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/policy-conditions.html)[https://docs.aws.amazon.com/kms/latest/developerguide/overview.html](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html)。

------
#### [ AWS 管理控制台 ]

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

1. 选择左侧导航栏中的**集群**，然后选择右上角的**创建集群**，或者选择一个现有的集群。对于现有集群，请选择右上角的**更新集群**。

1. 在工作流的**加密**部分下，您可以选择在**托管存储**和 **Fargate 临时存储**下选择您的 AWS KMS 密钥。您也可以在此处选择**创建 AWS KMS 密钥**。

1. 创建完新集群后选择**创建**，或在要更新现有集群时选择**更新**。

------
#### [ AWS CLI ]

以下是使用 AWS CLI 创建集群并配置 Fargate 临时存储的示例（请用自己的值替换*红色的*值）：

```
aws ecs create-cluster --cluster clusterName \
--configuration '{"managedStorageConfiguration":{"fargateEphemeralStorageKmsKeyId":"arn:aws:kms:us-west-2:012345678901:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"}}'
{
    "cluster": {
        "clusterArn": "arn:aws:ecs:us-west-2:012345678901:cluster/clusterName",
        "clusterName": "clusterName",
        "configuration": {
            "managedStorageConfiguration": {
                "fargateEphemeralStorageKmsKeyId": "arn:aws:kms:us-west-2:012345678901:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
            }
        },
        "status": "ACTIVE",
        "registeredContainerInstancesCount": 0,
        "runningTasksCount": 0,
        "pendingTasksCount": 0,
        "activeServicesCount": 0,
        "statistics": [],
        "tags": [],
        "settings": [],
        "capacityProviders": [],
        "defaultCapacityProviderStrategy": []
    },
    "clusterCount": 5
}
```

------
#### [ CloudFormation ]

以下是使用 CloudFormation 创建集群并配置 Fargate 临时存储的示例模板（请用自己的值替换*红色的*值）：

```
AWSTemplateFormatVersion: 2010-09-09
Resources:
  MyCluster: 
    Type: AWS::ECS::Cluster
    Properties: 
      ClusterName: "clusterName" 
      Configuration:
        ManagedStorageConfiguration:
          FargateEphemeralStorageKmsKeyId: "arn:aws:kms:us-west-2:012345678901:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
```

------

# 管理 Amazon ECS 的 Fargate 临时存储的 AWS KMS 密钥
<a name="fargate-managing-kms-key"></a>

创建或导入 AWS KMS 密钥以加密 Fargate 临时存储后，您可以像管理任何其他 AWS KMS 密钥一样对其进行管理。

**自动轮换 AWS KMS 密钥**  
您可以启用自动密钥轮换，也可以手动轮换密钥。自动密钥轮换通过每年为密钥生成新的加密材料来轮换密钥。AWS KMS 还会保存所有先前版本的加密材料，以便您能够解密使用早期密钥版本的任何数据。在删除密钥之前，AWS KMS 不会删除任何轮换的材料。

自动密钥轮换属于可选功能，您可以随时启用或禁用。

**禁用或撤销 AWS KMS 密钥**  
如果您在 AWS KMS 中禁用了某个客户自主管理型密钥，这不会对正在运行的任务产生任何影响，并且这些任务将在整个生命周期中继续正常运行。如果新任务使用已禁用或已撤销的密钥，则该任务将因无法访问该密钥而失败。建议您设置 CloudWatch 警报或类似机制，来确保永远不需要使用已禁用的密钥来解密已加密的数据。

**删除 AWS KMS 密钥**  
删除密钥应始终是最后的选择，并且仅在您确定永远不会再需要已删除的密钥时删除密钥。尝试使用已删除密钥的新任务将失败，因为这些任务将无法访问该密钥。AWS KMS 建议您禁用密钥，而不是将其删除。如果您觉得确有必要删除密钥，我们建议您首先将其禁用，然后设置 CloudWatch 警报以确保不需要该密钥。如果您确实删除了某个密钥，AWS KMS 将至少允许您在七天内改变主意。

**审计 AWS KMS 密钥访问情况**  
您可以使用 CloudTrail 日志来审计对 AWS KMS 密钥的访问情况。您可以检查 AWS KMS 操作 `CreateGrant`、`GenerateDataKeyWithoutPlaintext` 和 `Decrypt`。这些操作还将显示 `aws:ecs:clusterAccount` 和 `aws:ecs:clusterName`，以作为 CloudTrail 中记录的 `EncryptionContext` 的一部分。

以下是 `GenerateDataKeyWithoutPlaintext`、`GenerateDataKeyWithoutPlaintext (DryRun)`、`CreateGrant`、`CreateGrant (DryRun)` 和 `RetireGrant` 的示例 CloudTrail 事件（请将 *red* 值替换为您自己的值）。

------
#### [ GenerateDataKeyWithoutPlaintext ]

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AWSService",
        "invokedBy": "ec2-frontend-api.amazonaws.com"
    },
    "eventTime": "2024-04-23T18:08:13Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "GenerateDataKeyWithoutPlaintext",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "ec2-frontend-api.amazonaws.com",
    "userAgent": "ec2-frontend-api.amazonaws.com",
    "requestParameters": {
        "numberOfBytes": 64,
        "keyId": "arn:aws:kms:us-west-2:account-id:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
        "encryptionContext": {
            "aws:ecs:clusterAccount": "account-id",
            "aws:ebs:id": "vol-xxxxxxx",
            "aws:ecs:clusterName": "cluster-name"
        }
    },
    "responseElements": null,
    "requestID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
    "eventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE33333",
    "readOnly": true,
    "resources": [
        {
            "accountId": "AWS Internal",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:us-west-2:account-id:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "account-id",
    "sharedEventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLEaaaaa",
    "eventCategory": "Management"
}
```

------
#### [ GenerateDataKeyWithoutPlaintext (DryRun) ]

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AWSService",
        "invokedBy": "fargate.amazonaws.com"
    },
    "eventTime": "2024-04-23T18:08:11Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "GenerateDataKeyWithoutPlaintext",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "fargate.amazonaws.com",
    "userAgent": "fargate.amazonaws.com",
    "errorCode": "DryRunOperationException",
    "errorMessage": "The request would have succeeded, but the DryRun option is set.",
    "requestParameters": {
        "keyId": "arn:aws:kms:us-west-2:account-id:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
        "dryRun": true,
        "numberOfBytes": 64,
        "encryptionContext": {
            "aws:ecs:clusterAccount": "account-id",
            "aws:ecs:clusterName": "cluster-name"
        }
    },
    "responseElements": null,
    "requestID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
    "eventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE33333",
    "readOnly": true,
    "resources": [
        {
            "accountId": "AWS Internal",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:us-west-2:account-id:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "account-id",
    "sharedEventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLEaaaaa",
    "eventCategory": "Management"
}
```

------
#### [ CreateGrant ]

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AWSService",
        "invokedBy": "ec2-frontend-api.amazonaws.com"
    },
    "eventTime": "2024-04-23T18:08:13Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "CreateGrant",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "ec2-frontend-api.amazonaws.com",
    "userAgent": "ec2-frontend-api.amazonaws.com",
    "requestParameters": {
        "keyId": "arn:aws:kms:us-west-2:account-id:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
        "granteePrincipal": "fargate.us-west-2.amazonaws.com",
        "operations": [
            "Decrypt"
        ],
        "constraints": {
            "encryptionContextSubset": {
                "aws:ecs:clusterAccount": "account-id",
                "aws:ebs:id": "vol-xxxx",
                "aws:ecs:clusterName": "cluster-name"
            }
        },
        "retiringPrincipal": "ec2.us-west-2.amazonaws.com"
    },
    "responseElements": {
        "grantId": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
        "keyId": "arn:aws:kms:us-west-2:account-id:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
    },
    "requestID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
    "eventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE33333",
    "readOnly": false,
    "resources": [
        {
            "accountId": "AWS Internal",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:us-west-2:account-id:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "account-id",
    "sharedEventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLEaaaaa",
    "eventCategory": "Management"
}
```

------
#### [ CreateGrant (DryRun) ]

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AWSService",
        "invokedBy": "fargate.amazonaws.com"
    },
    "eventTime": "2024-04-23T18:08:11Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "CreateGrant",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "fargate.amazonaws.com",
    "userAgent": "fargate.amazonaws.com",
    "errorCode": "DryRunOperationException",
    "errorMessage": "The request would have succeeded, but the DryRun option is set.",
    "requestParameters": {
        "keyId": "arn:aws:kms:us-west-2:account-id:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
        "granteePrincipal": "fargate.us-west-2.amazonaws.com",
        "dryRun": true,
        "operations": [
            "Decrypt"
        ],
        "constraints": {
            "encryptionContextSubset": {
                "aws:ecs:clusterAccount": "account-id",
                "aws:ecs:clusterName": "cluster-name"
            }
        }
    },
    "responseElements": null,
    "requestID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
    "eventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE33333",
    "readOnly": false,
    "resources": [
        {
            "accountId": "AWS Internal",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:us-west-2:account-id:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "account-id",
    "sharedEventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLEaaaaa",
    "eventCategory": "Management"
}
```

------
#### [ RetireGrant ]

```
{
    "eventVersion": "1.08",
    "userIdentity": {
        "type": "AWSService",
        "invokedBy": "AWS Internal"
    },
    "eventTime": "2024-04-20T18:37:38Z",
    "eventSource": "kms.amazonaws.com",
    "eventName": "RetireGrant",
    "awsRegion": "us-west-2",
    "sourceIPAddress": "AWS Internal",
    "userAgent": "AWS Internal",
    "requestParameters": null,
    "responseElements": {
        "keyId": "arn:aws:kms:us-west-2:account-id:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
    },
    "additionalEventData": {
        "grantId": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
    },
    "requestID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
    "eventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLE33333",
    "readOnly": false,
    "resources": [
        {
            "accountId": "AWS Internal",
            "type": "AWS::KMS::Key",
            "ARN": "arn:aws:kms:us-west-2:account-id:key/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
        }
    ],
    "eventType": "AwsApiCall",
    "managementEvent": true,
    "recipientAccountId": "account-id",
    "sharedEventID": "a1b2c3d4-5678-90ab-cdef-EXAMPLEaaaaa",
    "eventCategory": "Management"
}
```

------

# Amazon ECS 上的 AWS Fargate 的任务停用和维护
<a name="task-maintenance"></a>

AWS 负责维护 AWS Fargate 的底层基础设施。AWS 确定何时需要将平台版本修订版替换为新的基础设施修订版。这称为任务停用。当平台版本版本修订停用时，AWS 会发送任务停用通知。我们会定期更新支持的平台版本以引入新版本，其中包含对 Fargate 运行时软件，以及底层依赖项（例如操作系统和容器运行时）的更新。提供较新修订版后，我们会停用旧版本，以确保所有客户工作负载均在最新修订版的 Fargate 平台版本上运行。当停用修订版时，系统会停用在该修订版上运行的所有任务。

Amazon ECS 任务可以分为服务任务和独立任务。服务任务作为服务的一部分进行部署，并由 Amazon ECS 计划控制。有关更多信息，请参阅 [Amazon ECS 服务](ecs_services.md)。独立任务是由 Amazon ECS `RunTask` API 直接启动或通过外部调度器启动的任务，例如计划任务（由 Amazon EventBridge 启动）、AWS Batch 或 AWS Step Functions。您不需要执行任何操作来响应服务任务的任务停用，因为 Amazon ECS 计划程序会自动替换这些任务。

对于独立任务，您可能需要执行额外处理来响应任务停用。有关更多信息，请参阅 [Amazon ECS 可以自动处理独立任务吗？](#task-retirement-standalone-tasks)。

对于服务任务，除非您想在 AWS 执行前替换这些任务，否则无需对任何停用执行任何操作。当 Amazon ECS 计划程序停止任务时，将使用 `maximumPercent` 并启动一个新任务，以尝试保持服务所需的任务数。遵循最佳实践，将任务停用的影响降至最低。对于使用 REPLICA 服务计划程序的服务，默认的 `maximumPercent` 值为 200%。因此，当 AWS Fargate 开始停用任务时，Amazon ECS 会首先安排一个新任务，然后等待其运行，然后再停用旧任务。将 `maximumPercent` 值设置为 100% 时，Amazon ECS 会首先停止任务，然后再将其替换。

对于独立任务停用，AWS 将在任务停用日期当天或之后停止任务。Amazon ECS 不会在任务停止时启动替换任务。如果您需要继续运行这些任务，则需要在通知中指示的时间之前停止正在运行的任务并启动替换任务。因此，我们建议客户监控独立任务的状态，并在需要时实施逻辑来替换已停止的任务。

在任何情景中停止任务时，您都可以运行 `describe-tasks`。响应中的 `stoppedReason` 是 `ECS is performing maintenance on the underlying infrastructure hosting the task`。

当有新的平台版本修订版并需要替换为新修订版时，任务维护适用。如果底层 Fargate 主机出现问题，则 Amazon ECS 会更换主机而不发出任务停用通知。

## 任务停用通知概述
<a name="task-retirement-notice"></a>

当 AWS 将平台版本修订版标记为需要停用时，我们会识别所有区域中该平台版本修订版上运行的所有任务。

下图显示了 Fargate 平台版本修订版的生命周期（从新修订版发布到平台修订版停用）。

![\[该图显示了 Fargate 任务停用生命周期。\]](http://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/images/fargate-task-retirement.png)


下面的信息提供了详细信息。
+ 新的平台版本修订版发布后，所有新任务均安排在此修订版上。
+ 已安排并正在运行的现有任务将在任务持续期间保留在最初放置它们的修订版上，不会迁移到新的修订版。
+ 新任务（如作为服务更新或 Fargate 任务停用的一部分）将置于发布时可用的最新平台版本修订版上。

任务停用通知通过 AWS Health Dashboard 以及通过电子邮件发送到注册的电子邮件地址，包含以下信息：
+ 任务停用日期：任务在此日期或之后停止。
+ 对于独立任务，任务的 ID。
+ 对于服务任务，运行服务的集群 ID 和服务 ID。
+ 您需要采取的后续步骤。

通常，我们会针对每个 AWS 区域 中的服务和独立任务各发送一条通知。但是，在某些情况下，每种任务类型可能会收到多个事件。例如，有太多要停用的任务，将超出我们通知机制中的限制时。

通过以下方式，您可以确定计划停用的任务：
+ 这些区域有：Health Dashboard

  您可以通过 Amazon EventBridge 将 AWS Health 通知发送到存档存储器（例如 Amazon Simple Storage Service）、执行自动操作（例如运行 AWS Lambda 函数）或其他通知系统（例如 Amazon Simple Notification Service）。有关更多信息，请参阅[使用 Amazon EventBridge 监控 AWS Health 事件](https://docs.aws.amazon.com/health/latest/ug/cloudwatch-events-health.html)。有关向 Amazon Chime、Slack 或 Microsoft Teams 发送通知的示例配置，请参阅 GitHub 上的 [AWS Health Aware](https://github.com/aws-samples/aws-health-aware) 存储库。

  以下是一个示例 EventBridge 事件。

  ```
  {
      "version": "0",
      "id": "3c268027-f43c-0171-7425-1d799EXAMPLE",
      "detail-type": "AWS Health Event",
      "source": "aws.health",
      "account": "123456789012",
      "time": "2023-08-16T23:18:51Z",
      "region": "us-east-1",
      "resources": [
          "cluster|service",
          "cluster|service"
      ],
      "detail": {
          "eventArn": "arn:aws:health:us-east-1::event/ECS/AWS_ECS_TASK_PATCHING_RETIREMENT/AWS_ECS_TASK_PATCHING_RETIREMENT_test1",
          "service": "ECS",
          "eventScopeCode": "ACCOUNT_SPECIFIC",
          "communicationId": "7988399e2e6fb0b905ddc88e0e2de1fd17e4c9fa60349577446d95a18EXAMPLE",
          "lastUpdatedTime": "Wed, 16 Aug 2023 23:18:52 GMT",
          "eventRegion": "us-east-1",
          "eventTypeCode": "AWS_ECS_TASK_PATCHING_RETIREMENT",
          "eventTypeCategory": "scheduledChange",
          "startTime": "Wed, 16 Aug 2023 23:18:51 GMT",
          "endTime": "Fri, 18 Aug 2023 23:18:51 GMT",
          "eventDescription": [
              {
                  "language": "en_US",
                  "latestDescription": "\\nA software update has been deployed to Fargate which includes CVE patches or other critical patches. No action is required on your part. All new tasks launched automatically uses the latest software version. For existing tasks, your tasks need to be restarted in order for these updates to apply. Your tasks running as part of the following ECS Services will be automatically updated beginning Wed, 16 Aug 2023 23:18:51 GMT.\\n\\nAfter Wed, 16 Aug 2023 23:18:51 GMT, the ECS scheduler will gradually replace these tasks, respecting the deployment settings for your service. Typically, services should see little to no interruption during the update and no action is required. When AWS stops tasks, AWS uses the minimum healthy percent (1) and launches a new task in an attempt to maintain the desired count for the service. By default, the minimum healthy percent of a service is 100 percent, so a new task is started first before a task is stopped. Service tasks are routinely replaced in the same way when you scale the service or deploy configuration changes or deploy task definition revisions. If you would like to control the timing of this restart you can update the service before Wed, 16 Aug 2023 23:18:51 GMT, by running the update-service command from the ECS command-line interface specifying force-new-deployment for services using Rolling update deployment type. For example:\\n\\n$ aws ecs update-service -service service_name \\\n--cluster cluster_name -force-new-deployment\\n\\nFor services using Blue/Green deployment type with AWS CodeDeploy:\\nPlease refer to create-deployment document (2) and create new deployment using same task definition revision.\\n\\nFor further details on ECS deployment types, please refer to ECS Deployment Developer Guide (1).\\nFor further details on Fargate's update process, please refer to the AWS Fargate User Guide (3).\\nIf you have any questions or concerns, please contact AWS Support (4).\\n\\n(1) https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-types.html\\n(2) https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment.html\\n(3) https://docs.aws.amazon.com/AmazonECS/latest/userguide/task-maintenance.html\\n(4) https://aws.amazon.com/support\\n\\nA list of your affected resources(s) can be found in the 'Affected resources' tab in the 'Cluster/ Service' format in the AWS Health Dashboard. \\n\\n"
              }
          ],
        "affectedEntities": [
                  {
                      "entityValue": "arn:aws:ecs:eu-west-1:111222333444:task/examplecluster/00805ce1d81940b5a37398e5a2c23333"
                  },
                  {
                      "entityValue": "arn:aws:ecs:eu-west-1:111222333444:task/examplecluster/00805ce1d81940b5a37398e5a2c25555"
                  }
              }
          ]
      }
  }
  ```
+ 电子邮件

  将向注册的电子邮件发送一封电子邮件以获取 AWS 账户 ID。

有关如何准备任务停用的信息，请参阅 [为 Amazon ECS 上的 AWS Fargate 任务停用做准备](prepare-task-retirement.md)。

## 我能否选择退出任务停用？
<a name="task-retirement-opt-out"></a>

否。作为 AWS 责任共担模式的一部分，AWS 负责管理和维护 AWS Fargate 的底层基础设施。这包括定期执行平台更新以确保安全性和稳定性。这些更新由 AWS 自动应用，客户无法选择退出。与在 EC2 实例上运行工作负载相比，使用 AWS Fargate 的一个主要优势是，维护底层平台的责任由 AWS 承担。此模型可让您专注于应用程序而非基础设施维护。通过自动应用这些平台更新，AWS 能够使 Fargate 环境保持最新和安全，而无需您作为客户采取任何行动。这有助于为在 Fargate 上运行工作负载提供可靠且安全的容器化环境。

## 我可以通过其他 AWS 服务获取任务停用通知吗？
<a name="task-retirement-event"></a>

AWS 向 Health Dashboard 和 AWS 账户 上的主要电子邮件联系人发送任务停用通知。Health Dashboard 提供了与其他 AWS 服务（包括 EventBridge）的许多集成。您可以使用 EventBridge 自动显示通知（例如，将消息转发到 ChatOps 工具）。有关更多信息，请参阅 [Solution overview: Capturing task retirement notifications](https://aws.amazon.com/blogs/containers/improving-operational-visibility-with-aws-fargate-task-retirement-notifications/)。

## 我可以在任务停用计划后更改任务停用吗？
<a name="task-retirement-change"></a>

 不可以。该计划基于任务停用等待时间（默认为 7 天）。如果您需要更多时间，则可以选择将等待期配置为 14 天。有关更多信息，请参阅 [步骤 2：获取任务停用通知以提醒团队并采取行动](prepare-task-retirement.md#prepare-task-retirement-capture-task-events)。

自 2025 年 12 月 18 日起，Amazon ECS 允许您为 Fargate 任务配置 [Amazon EC2 事件窗口](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/event-windows.html)。如果需要精确控制任务停用的确切时间（例如，将任务安排在周末以避免在工作时间中断），则可以为任务、服务或集群配置 Amazon EC2 事件窗口，请参阅[步骤 1：设置任务等待时间或使用 Amazon EC2 事件窗口](prepare-task-retirement.md#prepare-task-retirement-set-time)。请注意，此配置的更改适用于将来计划的停用。目前已计划的停用不受影响。此外，当您为 Fargate 任务配置 Amazon EC2 事件窗口时，它优先于您的任务停用等待时间配置。如有任何疑问，请联系 支持。

## Amazon ECS 如何处理属于服务一部分的任务？
<a name="task-retirement-service-works"></a>

对于服务任务，除非您想在 AWS 执行前替换这些任务，否则无需执行任何操作来响应任何停用。当 Amazon ECS 计划程序停止任务时，其使用最小正常百分比并启动一个新任务，以尝试保持服务所需的任务数。为了最大限度地降低 Fargate 任务停用的影响，应按照 Amazon ECS 最佳实践部署工作负载。例如，当将无状态应用程序部署为 Amazon ECS 服务（如 Web 或 API 服务器）时，客户应该部署多个任务副本并将 minimumHealthyPercent 设置为 100%。 默认情况下，服务的最小正常运行状况百分比为 100%。因此，当 Fargate 开始停用任务时，Amazon ECS 会首先安排一个新任务并等待其运行，然后再停用旧任务。当您扩展服务、部署配置更改或部署任务定义修订版时，服务任务会以相同的方式作为任务停用的一部分进行例行替换。要为任务停用流程做准备，请参阅 [为 Amazon ECS 上的 AWS Fargate 任务停用做准备](prepare-task-retirement.md)。

## Amazon ECS 可以自动处理独立任务吗？
<a name="task-retirement-standalone-tasks"></a>

 不可以。AWS 无法为通过 `RunTask`、计划任务（例如通过 EventBridge 调度器）、AWS Batch 或 AWS Step Functions 启动的独立任务创建替换任务。Amazon ECS 仅管理属于服务一部分的任务。

## 在任务停用期间排查服务可用性问题
<a name="task-retirement-service-availability"></a>

如果 Amazon ECS 在任务停用期间无法启动替换任务，则您的服务可用性可能受到影响。这可能因客户配置不正确所致，例如：
+ IAM 角色缺失或配置错误
+ 目标子网中容量不足
+ 安全组配置错误
+ 任务定义错误

当 Amazon ECS 无法启动替换任务时，停用的任务将被停止，而不会进行替换操作，这会降低您的服务可用容量，并有可能导致服务中断。监控服务的任务计数和 Amazon CloudWatch 指标，以确保在事件停用期间成功启动替换任务。

# 为 Amazon ECS 上的 AWS Fargate 任务停用做准备
<a name="prepare-task-retirement"></a>

要为任务停用做准备，请执行下面的操作：

1. 设置任务停用等待期或使用 Amazon EC2 事件窗口。

1. 捕获任务停用通知以通知团队成员。

1. 您可以通过使用 force-deployment 选项更新服务，确保所有服务的任务都在最新的平台版本上运行。此为可选步骤。

## 步骤 1：设置任务等待时间或使用 Amazon EC2 事件窗口
<a name="prepare-task-retirement-set-time"></a>

 您可以通过两种账户设置选项来配置 Fargate 启动任务停用的时间：`fargateTaskRetirementWaitPeriod` 和 `fargateEventWindows`。

**更新 fargateTaskRetirementWaitPeriod 账户设置**

您可以对 Fargate 开始停用任务的时间进行配置。默认等待期为 7 天。对于需要立即应用更新的工作负载，请选择即时设置（`0`）。如果需要更多时间，请配置 `7` 或 `14` 天选项。

建议您选择较短的等待时间，以便更快获得较新的平台版本修订版。

通过以根用户或管理员用户身份运行 `put-account-setting-default` 或 `put-account-setting` 配置等待期。将 `fargateTaskRetirementWaitPeriod` 选项用于设置为以下值之一的 `name` 和 `value` 选项：
+ `0`：AWS 发送通知，并立即开始停用受影响的任务。
+ `7`：AWS 发送通知，等待 7 个日历日后才开始停用受影响的任务。这是默认值。
+ `14`：AWS 发送通知，等待 14 个日历日后才开始停用受影响的任务。

有关更多信息，请参阅《Amazon Elastic Container Service API 参考》**中的 [put-account-setting-default](https://docs.aws.amazon.com/cli/latest/reference/ecs/put-account-setting-default.html) 和 [put-account-setting](https://docs.aws.amazon.com/cli/latest/reference/ecs/put-account-setting.html)。

**使用 fargateEventWindows 账户设置**

自 2025 年 12 月 18 日起，Amazon ECS 允许您为 Fargate 任务配置 [Amazon EC2 事件窗口](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/event-windows.html)。如果需要精确控制任务停用的确切时间（例如，将任务安排在周末以避免在工作时间中断），则可以为任务、服务或集群配置 Amazon EC2 事件窗口。

当您使用事件窗口时，Fargate 会确保您的任务运行至少 3 天，之后才会在下一个可用窗口中停用，除非任务因用户启动的操作或关键运行状况事件（例如底层硬件性能下降）而停止。

将 `fargateEventWindows` 账户设置设置为 `enabled`。您可以以根用户或管理用户身份使用以下任一 API：`put-account-setting-default` 或 `put-account-setting`。

 每个 Amazon EC2 事件窗口每周必须打开至少 4 小时，每个时间范围必须至少为 2 小时。对于大型集群和服务，我们建议配置持续时间较长（8 小时或更长）或时间范围更频繁（至少每 3 天发生一次）的事件窗口。您可以在[用户指南](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/event-windows.html#event-windows-considerations)中进一步查看 Amazon EC2 事件窗口的注意事项。AWS Fargate 会确保您的任务运行至少 3 天，之后才会停用，除非任务因用户启动的操作或关键运行状况事件（例如底层硬件性能下降）而停止。

**重要**  
在事件窗口内替换任务将尽力而为。如果发现任务在您的事件窗口之外停用，请考虑延长持续时间（8 小时或更长时间）或增加频率（至少每 3 天一次）。

要将 Amazon EC2 事件窗口应用于 Fargate 任务停用，请执行下面的操作：
+ 将 `fargateEventWindows` 账户设置设置为 `enabled`。您可以以根用户或管理用户身份使用以下任一 API：`put-account-setting-default` 或 `put-account-setting`。请注意，这是对 Fargate 任务使用 Amazon EC2 事件窗口功能的一次性启用操作。
+ 通过 AWS 管理控制台或 AWS CLI 创建 Amazon EC2 事件窗口。要使用 CLI 创建事件窗口，请使用带有时间范围或 cron 表达式的 EC2 `create-instance-event-window` API。记下响应中的 `InstanceEventWindowId`。

  ```
  aws ec2 create-instance-event-window \
                      --time-range StartWeekDay=monday,StartHour=2,EndWeekDay=wednesday,EndHour=8 \
                      --tag-specifications "ResourceType=instance-event-window,Tags=[{Key=K1,Value=V1" \
                      --name myEventWindowName
  ```

  或者，您可以在创建 EC2 事件窗口时使用 cron 表达式。

  ```
  aws ec2 create-instance-event-window \
                      --cron-expression "* 21-23 * * 2,3" \
                      --tag-specifications "ResourceType=instance-event-window,Tags=[{Key=K1,Value=V1" \
                      --name myEventWindowName
  ```
+ 然后，您可以使用 EC2 `associate-instance-event-window` API 将事件窗口与账户中的特定服务、集群或所有任务相关联。
  + 对于 ECS 服务任务

    ```
    aws ec2 associate-instance-event-window \
    --instance-event-window-id iew-0abcdef1234567890 \
    --association-target "InstanceTags=[{Key=aws:ecs:serviceArn,Value=your-service-arn}]"
    ```
  + 对于 ECS 集群

    ```
    aws ec2 associate-instance-event-window \
    --instance-event-window-id iew-0abcdef1234567890 \
    --association-target "InstanceTags=[{Key=aws:ecs:clusterArn,Value=your-cluster-arn}]"
    ```
  + 将事件窗口与账户中的所有任务相关联

    ```
    aws ec2 associate-instance-event-window \
    --instance-event-window-id iew-0abcdef1234567890 \
    --association-target "InstanceTags=[{Key=aws:ecs:fargateTask,Value=true}]"
    ```

您可以使用多个键值对，将一个事件窗口与多个服务或集群相关联。

Fargate 将按照以下顺序为每个任务选择事件窗口：
+ 如果存在与任务的服务关联的事件窗口，则将使用该窗口。这不适用于独立任务或非托管式任务。
+ 如果存在与任务的集群关联的事件窗口，则将使用该窗口。
+ 如果为所有 Fargate 任务设置了事件窗口，则将使用该窗口。
+ 如果没有事件窗口与任务匹配，则将使用 `fargateTaskRetirementWaitPeriod` 设置。

**配置 Fargate 任务维护的事件窗口**

假设您在 Fargate 上运行多个具有不同可用性要求的 ECS 服务。您想要精确控制任务停用。您可以按如下方式配置多个事件窗口：
+ **所有 Fargate 任务的默认维护：**为非高峰时段（每天凌晨 12 点至 4 点）的例行维护创建一个事件窗口，然后使用 ` aws:ecs:fargateTask` 标签将其与所有 Fargate 任务相关联。
+ **开发集群的仅周末维护**：对于具有可以容忍周末中断的服务的开发集群，请创建一个 24 小时周末窗口（周六和周日、全天），然后使用带有集群 ARN 的 `aws:ecs:clusterArn` 标签将其与集群关联。
+ **任务关键型服务的受限窗口**：对于工作日需要较长正常运行时间的任务关键型支付处理服务，请将维护限制在周末清晨（周六和周日凌晨 12 点至 4 点），然后使用带有服务 ARN 的 `aws:ecs:serviceArn` 标签将其与特定服务相关联。

在此配置中，支付服务使用其特定仅限周末的窗口，开发集群服务和任务使用周末 24 小时窗口，所有其他 Fargate 任务使用默认每天维护时段。

有关更多信息，请参阅《Amazon Elastic Container Service API 参考》**中的 [put-account-setting-default](https://docs.aws.amazon.com/cli/latest/reference/ecs/put-account-setting-default.html) 和 [put-account-setting](https://docs.aws.amazon.com/cli/latest/reference/ecs/put-account-setting.html)。

## 步骤 2：获取任务停用通知以提醒团队并采取行动
<a name="prepare-task-retirement-capture-task-events"></a>

当即将有任务停用时，AWS 会向 AWS Health Dashboard 和 AWS 账户 上的主要电子邮件联系人发送任务停用通知。AWS Health Dashboard 提供了与其他 AWS 服务（包括 Amazon EventBridge）的许多集成。您可以使用 EventBridge 从任务停用通知构建自动化，例如通过将消息转发到 ChatOps 工具来提高即将进行的停用的可见性。AWS HealthAware 是一种资源，它展示了 AWS Health Dashboard 的强大功能以及如何在整个组织中分发通知。您可以将任务停用通知转发到一个聊天应用程序（如 Slack）。

下图显示了解决方案概述。

![\[该图显示了用于捕获 Fargate 任务停用通知的 Fargate 解决方案。\]](http://docs.aws.amazon.com/zh_cn/AmazonECS/latest/developerguide/images/fargate-task-retirement-solution.png)


下面的信息提供了详细信息。
+ Fargate 将任务停用通知发送到 AWS Health Dashboard。
+ AWS Health Dashboard 将邮件发送到 AWS 账户 上的主要电子邮件联系人，并通知 EventBridge。
+ EventBridge 有一条捕获停用通知的规则。

  该规则查找具有以下事件详细信息类型的事件：`"AWS Health Event" and the Event Detail Type Code: "AWS_ECS_TASK_PATCHING_RETIREMENT"`
+ 该规则会触发一个 Lambda 函数，其使用 Slack Incoming Webhook 将信息转发到 Slack。有关更多信息，请参阅 [Incoming Webhooks](https://slack.com/marketplace/A0F7XDUAZ-incoming-webhooks)。

有关代码示例，请参阅 Github 上的 [Capturing AWS Fargate Task Retirement Notifications](https://github.com/aws-samples/capturing-aws-fargate-task-retirement-notifications/tree/main)。

## 步骤 3：控制任务的替换
<a name="prepare-task-retirement-change-time"></a>

您无法控制任务停用的确切时间，但是可以定义等待时间。如果想按自己的计划控制替换任务，则可以捕获任务停用通知以首先了解任务停用日期。然后，您可以重新部署服务以启动替换任务，并同样替换任何独立任务。对于使用滚动部署的服务，可以在停用开始时间之前使用 `update-service` 和 `force-deployment` 选项更新服务。

以下 `update-service` 示例使用 `force-deployment` 选项。

```
aws ecs update-service —-service service_name \ 
    --cluster cluster_name \
     --force-new-deployment
```

对于使用蓝/绿部署的服务，您需要在 AWS CodeDeploy 中创建新部署。有关如何创建部署的信息，请参阅《AWS Command Line Interface Reference》**中的 [create-deployment](https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment.html)。

# Amazon ECS 在 AWS Fargate 上的支持区域
<a name="AWS_Fargate-Regions"></a>

您可以使用下表来验证 AWS Fargate 上的 Linux 容器和 AWS Fargate 上的 Windows 容器的区域支持。

## AWS Fargate 上的 Linux 容器
<a name="linux-regions"></a>

AWS Fargate 上的 Amazon ECS Linux 容器在以下 AWS 区域 中受支持。根据需要记录支持的可用区 ID。


| 区域名称 | 区域 | 
| --- | --- | 
|  美国东部（俄亥俄州）  |  us-east-2  | 
|  美国东部（弗吉尼亚州北部）  |  us-east-1  | 
|  美国西部（北加利福尼亚）  |  us-west-1（仅限 `usw1-az1` 和 `usw1-az3`）  | 
|  美国西部（俄勒冈州）  |  us-west-2  | 
|  加拿大（中部）  |  ca-central-1  | 
|  加拿大西部（卡尔加里）  |  ca-west-1  | 
|  墨西哥（中部）  |  mx-central-1  | 
|  非洲（开普敦）  |  af-south-1  | 
|  亚太地区（香港）  |  ap-east-1  | 
|  亚太地区（孟买）  |  ap-south-1  | 
|  亚太地区（东京）  |  ap-northeast-1（仅限 `apne1-az1`、`apne1-az2` 和 `apne1-az4`）  | 
|  亚太地区（首尔）  |  ap-northeast-2  | 
|  亚太地区（大阪）  |  ap-northeast-3  | 
|  亚太地区（海得拉巴）  |  ap-south-2  | 
|  亚太地区（新加坡）  |  ap-southeast-1  | 
|  亚太地区（悉尼）  |  ap-southeast-2  | 
|  亚太地区（泰国）  |  ap-southeast-7  | 
|  亚太地区（雅加达）  |  ap-southeast-3  | 
|  亚太地区（墨尔本）  |  ap-southeast-4  | 
|  亚太地区（马来西亚）  |  ap-southeast-5  | 
|  加拿大（中部）  |  ca-central-1  | 
|  加拿大西部（卡尔加里）  |  ca-west-1  | 
|  中国（北京）  |  cn-north-1（仅限 `cnn1-az1` 和 `cnn1-az2`）  | 
|  中国（宁夏）  |  cn-northwest-1  | 
|  欧洲地区（法兰克福）  |  eu-central-1  | 
|  欧洲（苏黎世）  |  eu-central-2  | 
|  欧洲地区（爱尔兰）  |  eu-west-1  | 
|  欧洲地区（伦敦）  |  eu-west-2  | 
|  欧洲地区（巴黎）  |  eu-west-3  | 
|  欧洲地区（米兰）  |  eu-south-1  | 
|  欧洲（西班牙）  |  eu-south-2  | 
|  欧洲地区（斯德哥尔摩）  |  eu-north-1  | 
|  南美洲（圣保罗）  |  sa-east-1  | 
|  以色列（特拉维夫）  |  il-central-1  | 
|  中东（巴林）  |  me-south-1  | 
|  中东（阿联酋）  |  me-central-1  | 
|  AWS GovCloud（美国东部）  |  us-gov-east-1  | 
|  AWS GovCloud（美国西部）  |  us-gov-west-1  | 

## AWS Fargate 上的 Windows 容器
<a name="windows-regions"></a>

AWS Fargate 上的 Amazon ECS Windows 容器在以下 AWS 区域 中受支持。根据需要记录支持的可用区 ID。


| 区域名称 | 区域 | 
| --- | --- | 
|  美国东部（俄亥俄州）  |  us-east-2  | 
|  美国东部（弗吉尼亚州北部）  |  us-east-1（仅限 `use1-az1`、`use1-az2`、`use1-az4`、`use1-az5` 和 `use1-az6`）  | 
|  美国西部（北加利福尼亚）  |  us-west-1（仅限 `usw1-az1` 和 `usw1-az3`）  | 
|  美国西部（俄勒冈州）  |  us-west-2  | 
|  非洲（开普敦）  |  af-south-1  | 
|  亚太地区（香港）  |  ap-east-1  | 
|  亚太地区（孟买）  |  ap-south-1  | 
|  亚太地区（海得拉巴）  |  ap-south-2  | 
|  亚太地区（大阪）  |  ap-northeast-3  | 
|  亚太地区（首尔）  |  ap-northeast-2  | 
|  亚太地区（新加坡）  |  ap-southeast-1  | 
|  亚太地区（悉尼）  |  ap-southeast-2  | 
|  亚太地区（墨尔本）  |  ap-southeast-4  | 
|  亚太地区（马来西亚）  |  ap-southeast-5  | 
|  亚太地区（东京）  |  ap-northeast-1（仅限 `apne1-az1`、`apne1-az2` 和 `apne1-az4`）  | 
|  加拿大（中部）  |  ca-central-1（仅限 `cac1-az1` 和 `cac1-az2`）  | 
|  加拿大西部（卡尔加里）  |  ca-west-1  | 
|  中国（北京）  |  cn-north-1（仅限 `cnn1-az1` 和 `cnn1-az2`）  | 
|  中国（宁夏）  |  cn-northwest-1  | 
|  欧洲地区（法兰克福）  |  eu-central-1  | 
|  欧洲（苏黎世）  |  eu-central-2  | 
|  欧洲地区（爱尔兰）  |  eu-west-1  | 
|  欧洲地区（伦敦）  |  eu-west-2  | 
|  欧洲地区（巴黎）  |  eu-west-3  | 
|  欧洲地区（米兰）  |  eu-south-1  | 
|  欧洲（西班牙）  |  eu-south-2  | 
|  欧洲地区（斯德哥尔摩）  |  eu-north-1  | 
|  南美洲（圣保罗）  |  sa-east-1  | 
|  以色列（特拉维夫）  |  il-central-1  | 
|  中东（阿联酋）  |  me-central-1  | 
|  中东（巴林）  |  me-south-1  | 