如何对 Amazon ECS 任务放置约束问题进行故障排除?
我想使用任务放置约束在 Amazon Elastic Container Service (Amazon ECS) 上运行任务。但是,任务卡在“待处理”状态且无法启动。
简短描述
如果您对任务定义、任务或服务配置任务放置约束,则您必须拥有与其属性相匹配的容器实例。否则,任务将卡在 PENDING(待处理)状态或无法启动,并且您会收到以下错误之一:
- 服务 (service-name) 无法放置任务,因为没有容器实例满足其所有要求。最匹配的容器实例 (a1b2c3d4-5678-90ab-cdef-11111EXAMPLE) 缺少一个必需属性。
- TaskFailedToStart: 未满足 MemberOf 放置约束。
- TaskFailedToStart: 属性
解决方法
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
要解决任务放置约束问题,请首先检查您在任务放置约束中指定的属性。然后,确保容器实例具有必需的属性。
检查仅在任务定义中指定的任务放置约束
如果您仅在任务定义中使用任务放置约束,请运行以下命令来检查容器实例是否缺少属性:
ecs-cli check-attributes --task-def example-task-def --cluster example-cluster --region region-code --container-instances example-container-instance-id
**注意:**请将 example-task-def 替换为您的任务定义,将 example-cluster 替换为您的集群名称,将 region-code 替换为您的 AWS 区域,将 example-container-instance-id 替换为您的容器实例 ID。
有关详细信息,请参阅 GitHub 网站上的 Checking for missing attributes and debugging reason attribute errors。
检查在任务定义、服务或任务中指定的任务放置约束
要检查任务定义中的放置约束,请完成以下步骤:
- 打开 Amazon ECS 控制台。
- 在导航窗格中,选择 Task definitions(任务定义)。
- 选择任务定义,然后选择您的任务定义修订版。
- 选择 Task placement(任务放置)。
要检查为服务指定的放置约束,请完成以下步骤:
- 打开 Amazon ECS 控制台。
- 在导航窗格中,选择 Clusters(集群)。
- 在 Clusters(集群)页面上,选择您的集群。
- 在 Services(服务)下,选择您的服务。
- 选择 Configuration and networking(配置和联网),然后选择 Task placement strategy and constraints(任务放置策略和约束)。
要检查在特定任务中指定的放置约束,请运行以下 AWS CLI 命令 describe-tasks:
aws ecs describe-tasks --cluster example-cluster --region region-code --tasks task-id
**注意:**请将 example-cluster 替换为您的集群名称,将 region-code 替换为您的区域,将 task-id 替换为您的任务 ID。在命令的输出中,检查 placementConstraints 值。
确保您的容器实例具有必需的属性
使用 Amazon ECS 控制台或 AWS CLI 来检查您的容器实例属性。
Amazon ECS 控制台
完成以下步骤:
- 打开 Amazon ECS 控制台。
- 在导航窗格中,选择 Clusters(集群)。
- 在 Clusters(集群)页面上,选择您的集群。
- 选择 Infrastructure(基础设施)选项卡。
- 在 Container instances(容器实例)下,选择您的容器实例。
- 选择 Actions(操作),然后选择 View/edit attributes(查看/编辑属性)。
- 确保容器实例具有放置约束中指定的必需属性。
AWS CLI
运行以下 describe-container-instances 命令:
aws ecs describe-container-instances --cluster example-cluster --region region-code --container-instances example-container-instance-id
**注意:**请将 example-cluster 替换为您的集群名称,将 region-code 替换为您的区域,将 example-container-instance-id 替换为您的容器实例 ID。
要查看具有特定属性的所有容器实例,请运行 list-container-instances 命令:
aws ecs list-container-instances --cluster example-cluster --region region-code --filter "attribute:ecs.instance-type == t2.micro"
**注意:**请将 example-cluster 替换为您的集群名称,将 region-code 替换为您的区域,将 attribute:ecs.instance-type == t2.micro 替换为您的属性。前面的命令将列出集群中具有 t2.micro 实例类型的所有容器实例。
要使用 AWS CLI 添加或更新容器实例的属性,请运行以下 put-attributes 命令:
aws ecs put-attributes \ --cluster example-cluster \ --region region-code \ --attributes name=stack,value=production,targetId=example-container-instance-id
**注意:**请将 example-cluster 替换为您的集群名称,将 region-code 替换为您的区域,将 example-container-instance-id 替换为您的容器实例 ID。将您的属性添加到 --attributes 选项中。前面的示例命令会将 stack 名称和 production 值添加到容器实例中。
(可选)更新任务放置约束
如果任务放置约束不正确或过于严格,请在任务定义或服务中对其进行更新。或者,运行以下 register-task-definition 来创建新的任务定义修订版:
aws ecs register-task-definition \ --cli-input-json file://jsonfilepath/filename.json
**注意:**请将 jsonfilepath.filename.json 替换为任务定义 JSON 文件。
要更新独立任务的放置约束,请运行以下 run-task 命令:
aws ecs run-task \ --cluster clustername \ --placement-constraints exampleconstraints
**注意:**请将 clustername 替换为您的集群名称,将 exampleconstraints 替换为您的放置约束。
- 语言
- 中文 (简体)
