如何在 AWS CloudFormation 中让 Amazon ECS 服务稳定工作?

上次更新时间:2020 年 9 月 9 日

我的 Amazon Elastic Container Service (Amazon ECS) 服务无法在 AWS CloudFormation 中稳定工作。我遇到以下错误:“Service arn:aws:ecs:us-east-accountID:service/ServiceName did not stabilize”(服务 arn:aws:ecs:us-east-accountID:service/ServiceName 不稳定)。

简短描述

如果 Amazon ECS 中创建的服务未处于 AWS CloudFormation 模板指定的状态,则该服务无法稳定工作。为了确保服务使用所需的任务定义启动了所需数量的任务,AWS CloudFormation 会重复 DescribeService API 调用。这些调用检查服务的状态,直到满足所需的状态。调用过程最多可能需要三个小时。然后 AWS CloudFormation 超时,并返回“Service ARN did not stabilize”(服务 ARN 不稳定)消息。AWS CloudFormation 检查服务的状态时,包含该服务的堆栈将保持处于 CREATE_IN_PROGRESS 或 UPDATE_IN_PROGRESS 状态,并且无法更新。

如果您无法立即修复 Amazon ECS 服务任务的底层问题,并且您不希望等待 DescribeService API 调用超时,则可以手动强制让 Amazon ECS 服务资源的状态在 AWS CloudFormation 中进入 CREATE_COMPLETE 状态。为此,请在 Amazon ECS 控制台中手动将所需的服务计数设置为零,以停止正在运行的任务。然后,AWS CloudFormation 会将更新视为成功,因为任务数达到所需的数字零。

重要:对于生产服务,手动强制让 AWS CloudFormation 进入 CREATE_COMPLETE 状态并非最佳做法,因为所有任务都会停止,这样做可能会导致生产中断。

解决方法

验证资源的创建

1.    在 AWS CloudFormation 模板中,创建 AWS::ECS::Service 资源。例如:

Resources:           
ECSServiceA:
 Type: AWS::ECS::Service
Properties:
  DesiredCount: 1
  Cluster: awsExampleECSCluster
  LaunchType: EC2
  ServiceName: "MyNginxService2"
  TaskDefinition: NginxTask:1

2.    打开 AWS CloudFormation 控制台,然后选择您的堆栈。

3.    选择事件选项卡,然后验证是否正在创建资源。

更新所需的服务计数

您可以使用 AWS 命令行界面 (AWS CLI) 或 Amazon ECS 控制台将所需的服务计数更新为原始值。

使用 AWS CLI:

1.    要描述服务并列出服务事件,请运行以下命令:

aws ecs describe-services --cluster awsExampleECSCluster --services MyNginxService2

2.    要更新所需的服务计数,请运行以下命令:

aws ecs update-service --cluster awsExampleECSCluster --service MyNginxService2 --desired-count 0

3.    将 --desired-count 更新为原始值。

使用 Amazon ECS 控制台:

1.    打开 Amazon ECS 控制台

2.    在导航窗格中,选择集群,然后选择包含您创建的 ECS 服务的集群。

3.    选择事件选项卡,然后选择更新

4.    对于任务数,输入 0

该服务现在达到稳定状态,并将 AWS CloudFormation 中的 Amazon ECS 服务资源转换为 CREATE_COMPLETE 或 UPDATE_COMPLETE。

5.    对于任务数,输入原始值。

注意:要在修复底层任务问题后使 AWS CloudFormation 堆栈与 Amazon ECS 服务属性同步,您必须根据模板手动将所需的计数更改回原始值。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?