使用 AWS Fargate 容量提供程序 - Amazon ECS
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用 AWS Fargate 容量提供程序

Amazon ECS 集群容量提供程序使您能够在 Amazon ECS 任务中同时使用 Fargate 和 Fargate Spot 容量。有关集群容量提供程序的更多信息,请参阅Amazon ECS 集群容量提供程序

利用 Fargate Spot,您可以按照与 Fargate 价格相比的折扣价格运行能够容忍中断的 Amazon ECS 任务。Fargate Spot 使用备用计算容量运行任务。当 AWS 需要恢复容量时,您的任务将被中断,并发出两分钟的警告。下文将进一步详细说明这一点。

Fargate 容量提供程序注意事项

使用 Fargate 容量提供程序时应考虑以下因素。

  • 无需创建 Fargate 和 Fargate Spot 容量提供程序。它们对所有账户都可用,只需要与集群关联即可供使用。

  • 当使用 Amazon ECS 控制台以及 仅网络 集群模板创建新集群时,FARGATEFARGATE_SPOT 容量提供程序将自动与新集群关联。

  • 要将 FARGATEFARGATE_SPOT 容量提供程序添加到现有集群,您必须使用 AWS CLI 或 API。有关更多信息,请参阅 向现有集群添加 Fargate 容量提供程序

  • 使用 Fargate Spot 要求您的任务使用平台版本 1.3.0 或更高版本。有关更多信息,请参阅 AWS Fargate 平台版本

  • 使用 Fargate 和 Fargate Spot 容量提供程序的任务停止时,任务状态更改事件发送到 Amazon EventBridge。停止原因说明了原因。有关更多信息,请参阅 任务状态更改事件

  • 集群可能同时包含 Fargate 和 Auto Scaling 组容量提供程序,但容量提供程序策略只能包含 Fargate 或 Auto Scaling 组容量提供程序中的一种,而不能同时包含两者。有关更多信息,请参阅 Amazon Elastic Container Service Developer Guide 中的 Auto Scaling 组容量提供程序

处理 Fargate Spot 终止通知

当使用 Fargate Spot 容量的任务因 Spot 中断而停止时,系统会在任务停止之前发送两分钟的警告。警告作为任务状态更改事件发送到 Amazon EventBridge 并向正在运行的任务发送 SIGTERM 信号。作为服务的一部分使用 Fargate Spot 时,服务计划程序将收到中断信号,并在容量可用时尝试在 Fargate Spot 上启动额外任务。

为了确保容器在任务停止之前正常退出,可以配置以下内容:

  • 可以在任务使用的容器定义中指定 120 秒或更小的 stopTimeout 值。指定 stopTimeout 值为您在收到任务状态更改事件和强制停止容器之间留出时间。有关更多信息,请参阅容器超时

  • 必须从容器内接收 SIGTERM 信号才能执行任何清理操作。

以下是任务状态更改事件的一个代码段,显示了 Fargate Spot 中断的停止原因和停止代码。

{ "version": "0", "id": "9bcdac79-b31f-4d3d-9410-fbd727c29fab", "detail-type": "ECS Task State Change", "source": "aws.ecs", "account": "111122223333", "resources": [ "arn:aws:ecs:us-east-1:111122223333:task/b99d40b3-5176-4f71-9a52-9dbd6f1cebef" ], "detail": { "clusterArn": "arn:aws:ecs:us-east-1:111122223333:cluster/default", "createdAt": "2016-12-06T16:41:05.702Z", "desiredStatus": "STOPPED", "lastStatus": "RUNNING", "stoppedReason": "Your Spot Task was interrupted.", "stopCode": "TerminationNotice", "taskArn": "arn:aws:ecs:us-east-1:111122223333:task/b99d40b3-5176-4f71-9a52-9dbd6fEXAMPLE", ... } }

以下是用于为 Amazon ECS 任务状态更改事件创建 EventBridge 规则的事件模式。您可以有选择地在 detail 字段中指定一个群集,用于接收任务状态更改事件。有关详细信息,请参阅 Amazon EventBridge 用户指南 中的创建 EventBridge 规则

{ "source": [ "aws.ecs" ], "detail-type": [ "ECS Task State Change" ], "detail": { "clusterArn": [ "arn:aws:ecs:us-west-2:111122223333:cluster/default" ] } }

创建使用 Fargate 容量提供程序的新集群

创建新 Amazon ECS 集群时,指定一个或多个与集群关联的容量提供程序。关联的容量提供程序确定要在其上运行任务的基础设施。

使用 AWS 管理控制台时,FARGATEFARGATE_SPOT 容量提供程序在使用 仅网络 集群模板时会自动与集群关联。有关更多信息,请参阅创建集群

使用 Fargate 容量提供程序创建 Amazon ECS 集群 (AWS CLI)

使用以下命令创建新集群,并将 Fargate 和 Fargate Spot 容量提供程序与其关联。

  • create-cluster (AWS CLI)

    aws ecs create-cluster \ --cluster-name FargateCluster \ --capacity-providers FARGATE FARGATE_SPOT \ --region us-west-2

向现有集群添加 Fargate 容量提供程序

您可以使用 PutClusterCapacityProviders API 更新现有 Amazon ECS 集群的可用容量提供程序池。

AWS 管理控制台 中不支持向现有集群添加 Fargate 或 Fargate Spot 容量提供程序。您必须在控制台中创建新 Fargate 集群,或使用 Amazon ECS API 或 AWS CLI 将 Fargate 或 Fargate Spot 容量提供程序添加到现有集群。

将 Fargate 容量提供程序添加到现有集群 (AWS CLI)

使用以下命令将 Fargate 和 Fargate Spot 容量提供程序添加到现有集群。如果指定的集群具有关联的现有容量提供程序,则除了要添加的任何新容量提供程序之外,还必须指定所有现有容量提供程序。与 PutClusterCapacityProviders API 调用中忽略的集群关联的任何现有容量提供程序都将与集群取消关联。仅当现有容量提供程序未使用某个集群时,您才可以取消现有容量提供程序与该集群的关联。这些相同的规则适用于集群的默认容量提供程序策略。如果集群已定义现有的默认容量提供程序策略,则必须将其包括在 PutClusterCapacityProviders API 调用中。否则,它将被覆盖。

  • put-cluster-capacity-providers (AWS CLI)

    aws ecs put-cluster-capacity-providers \ --cluster FargateCluster \ --capacity-providers FARGATE FARGATE_SPOT existing_capacity_provider1 existing_capacity_provider2 \ --default-capacity-provider-strategy existing_default_capacity_provider_strategy \ --region us-west-2

使用 Fargate 容量提供程序运行任务

您可以通过指定容量提供程序策略,使用 Fargate 或 Fargate Spot 容量提供程序运行任务或创建服务。如果未提供容量提供程序策略,则使用集群的默认容量提供程序策略。

AWS 管理控制台中支持使用 Fargate 或 Fargate Spot 容量提供程序运行任务。如果使用AWS 管理控制台,则必须将 Fargate 或 Fargate Spot 容量提供程序添加到集群的默认容量提供程序策略。使用 Amazon ECS API 或 AWS CLI 时,您可以指定容量提供程序策略或使用集群的默认容量提供程序策略。

使用 Fargate 容量提供程序 (AWS CLI) 运行任务

通过以下命令使用 Fargate 和 Fargate Spot 容量提供程序运行任务。

  • run-task (AWS CLI)

    aws ecs run-task \ --capacity-provider-strategy capacityProvider=FARGATE,weight=1 capacityProvider=FARGATE_SPOT,weight=1 \ --cluster FargateCluster \ --task-definition task-def-family:revision \ --network-configuration "awsvpcConfiguration={subnets=[string,string],securityGroups=[string,string],assignPublicIp=string}" \ --count integer \ --region us-west-2

使用 Fargate 容量提供程序 (AWS CLI) 创建服务

通过以下命令使用 Fargate 和 Fargate Spot 容量提供程序创建服务。

  • create-service (AWS CLI)

    aws ecs create-service \ --capacity-provider-strategy capacityProvider=FARGATE,weight=1 capacityProvider=FARGATE_SPOT,weight=1 \ --cluster FargateCluster \ --service-name FargateService \ --task-definition task-def-family:revision \ --network-configuration "awsvpcConfiguration={subnets=[string,string],securityGroups=[string,string],assignPublicIp=string}" \ --desired-count integer \ --region us-west-2