跳至内容

如何对 Amazon ECS 任务放置约束问题进行故障排除?

2 分钟阅读
0

我想使用任务放置约束在 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。

检查在任务定义、服务或任务中指定的任务放置约束

要检查任务定义中的放置约束,请完成以下步骤:

  1. 打开 Amazon ECS 控制台。
  2. 在导航窗格中,选择 Task definitions(任务定义)。
  3. 选择任务定义,然后选择您的任务定义修订版。
  4. 选择 Task placement(任务放置)。

要检查为服务指定的放置约束,请完成以下步骤:

  1. 打开 Amazon ECS 控制台。
  2. 在导航窗格中,选择 Clusters(集群)。
  3. 在 Clusters(集群)页面上,选择您的集群。
  4. 在 Services(服务)下,选择您的服务。
  5. 选择 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 控制台

完成以下步骤:

  1. 打开 Amazon ECS 控制台。
  2. 在导航窗格中,选择 Clusters(集群)。
  3. 在 Clusters(集群)页面上,选择您的集群。
  4. 选择 Infrastructure(基础设施)选项卡。
  5. 在 Container instances(容器实例)下,选择您的容器实例。
  6. 选择 Actions(操作),然后选择 View/edit attributes(查看/编辑属性)。
  7. 确保容器实例具有放置约束中指定的必需属性。

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 替换为您的放置约束。

AWS 官方已更新 2 年前