我在使用 AWS Command Line Interface (AWS CLI) 或 API 删除 Amazon Elastic Container Service (Amazon ECS) 集群的容量提供程序时收到错误。
简短描述
如果您尝试使用 AWS CLI 或 API 删除集群的容量提供程序,则可能会收到以下错误之一:
- "updateStatus": "DELETE_FAILED"
- “updateStatusReason”:“由于容量提供程序与集群(your-cluster-name)关联,无法删除容量提供程序。从集群中删除容量提供程序,然后重试。”
您可能收到这些错误的原因如下:
- 您尝试删除的容量提供程序正在容量提供程序策略中被 Amazon ECS 服务使用。AWS 管理控制台不允许您删除 Amazon ECS 服务正在使用的容量提供程序。在这种情况下,您会在控制台中收到以下错误消息:“指定的容量提供程序正在使用中,无法删除”。只有当现有容量提供程序未被任何现有任务使用时,您才能将其与集群取消关联。如果您运行 DeleteCapacityProvider AWS CLI 命令,则容量提供程序会转换到 DELETE_FAILED 状态。要解决此问题,请完成检查容量提供程序是否正在容量提供程序策略中被 Amazon ECS 服务使用部分中的步骤。
- 您的容量提供程序被默认策略使用。如果您在运行任务或创建服务时未选择容量提供程序策略或启动类型,则默认情况下,容量提供程序策略将与集群关联。但是,仅当容量提供程序被设置为集群的默认容量提供程序策略时,才会发生关联。您只能删除未与集群关联的容量提供程序。要解决此问题,请完成检查容量提供程序是否已在集群的默认容量提供程序策略中设置部分中的步骤。
**注意:**如果在运行 AWS CLI 命令时收到错误,请确保您使用的是最新的 AWS CLI 版本。
解决方法
检查您的容量提供程序是否正在容量提供程序策略中被 Amazon ECS 服务使用
1. 如果集群中有多个服务,则使用以下脚本验证使用容量提供程序的服务。
在运行脚本之前,请执行以下操作:
将集群和容量提供程序参数设置为您的值。将 AWS CLI 凭证设置到您的 AWS 区域。从 jq 网站安装 jq。
#! /bin/bash
cluster=clustername
capacityprovider=capacityprovidername
services=$(aws ecs list-services --cluster ${cluster} | jq --raw-output '.serviceArns[]')
aws ecs describe-services \
--cluster ${cluster} \
--services ${services} \
| jq -r --arg capacityprovider "${capacityprovider}" \
'.services[] | select(.capacityProviderStrategy[]?.capacityProvider == $capacityprovider) | .serviceName'
注意:如果脚本返回空白输出,则集群中的任何服务都不在使用容量提供程序。跳至检查容量提供程序是否已在集群的默认容量提供程序策略中设置部分。
2. 使用新的容量提供程序更新脚本输出中返回的服务。
3. 删除旧的容量提供程序。
**重要提示:**您无法使用容量提供程序策略或启动类型更新服务。您必须使用另一个容量提供程序更新服务。
检查容量提供程序是否已在集群的默认容量提供程序策略中设置
1. 要查找集群的默认容量提供程序,请运行以下命令:
$ aws ecs describe-clusters --cluster mycluster | jq '.clusters[].defaultCapacityProviderStrategy'
[
{
"capacityProvider": "oldCP",
"weight": 0,
"base": 0
}
]
2. 要删除容量提供程序,您必须使用 Amazon ECS 控制台或 AWS CLI 修改集群的默认容量提供程序策略。
使用 Amazon ECS 控制台:
1. 打开 Amazon ECS 控制台。
2. 在导航窗格中,选择集群,然后选择您的集群。
3. 选择更新集群。
使用 AWS CLI:
$ aws ecs put-cluster-capacity-providers \
--cluster mycluster \
--capacity-providers newCP \
--default-capacity-provider-strategy capacityProvider=newCP \
--region us-east-1
$ aws ecs delete-capacity-provider --capacity-provider oldCP
$ aws ecs describe-capacity-providers --capacity-provider oldCP
**注意:**在前面的代码示例中,将 mycluster 替换为您的集群。将 newCP 替换为您想添加的新容量提供程序。将 oldCP 替换为您想删除的容量提供程序。
4. 删除旧的容量提供程序。
将任何从 PutClusterCapacityProviders API 调用中忽略的与某个集群关联的现有容量提供程序与该集群解除关联。同样的规则适用于集群的默认容量提供程序策略。