AWS ECS:运行任务失败原因:[“ATTRIBUTE”]

Cha*_*Hey 10 amazon-web-services aws-ecs

在尝试在 EC2 实例中运行任务时,我收到了这条可怕的错误消息。

Run tasks failed
Reasons : ["ATTRIBUTE"]
Run Code Online (Sandbox Code Playgroud)

像许多其他人一样,我被要求查看我发现此列表的任务的“requiresAttributes”部分:

  "requiresAttributes": [
    {
      "targetId": null,
      "targetType": null,
      "value": null,
      "name": "ecs.capability.execution-role-ecr-pull"
    },
    {
      "targetId": null,
      "targetType": null,
      "value": null,
      "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
    },
    {
      "targetId": null,
      "targetType": null,
      "value": null,
      "name": "ecs.capability.task-eni"
    },
    {
      "targetId": null,
      "targetType": null,
      "value": null,
      "name": "com.amazonaws.ecs.capability.ecr-auth"
    },
    {
      "targetId": null,
      "targetType": null,
      "value": null,
      "name": "com.amazonaws.ecs.capability.task-iam-role"
    },
    {
      "targetId": null,
      "targetType": null,
      "value": null,
      "name": "ecs.capability.execution-role-awslogs"
    },
    {
      "targetId": null,
      "targetType": null,
      "value": null,
      "name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
    },
    {
      "targetId": null,
      "targetType": null,
      "value": null,
      "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
    }
  ]
Run Code Online (Sandbox Code Playgroud)

在尝试将这些看似无用的属性添加到我的集群实例时,我被阻止了。AWS 控制台说不允许自定义/添加某些前缀,例如 ecs。

当平台不允许时,如何匹配属性?

我还研究过使用不同的 AMI 创建实例,但 Amazon ECS 不允许这样做,只是默认使用最新的实例。

Amazon ECS 是一个非常酷的产品,但这反映了它的一些不成熟。我实际上是从 beanstalk 背景进入 ECS 的,希望专业套件能够像承诺的那样编排容器。相反,在使用它 3 小时后,我有一些合理的抱怨!

Phy*_*yxx 6

我在尝试在 ECS 中运行 Windows docker 容器时遇到了同样的情况。

就我而言,任务定义显示了以下必需属性:

在此处输入图片说明

描述 ECS 实例aws ecs describe-container-instances --cluster=ClusterName --container-instances arn:<rest of the instance arn>表明他们缺少ecs.capability.execution-role-awslogscom.amazonaws.ecs.capability.logging-driver.awslogs属性。

该解决方案记录在https://github.com/aws/amazon-ecs-agent/issues/1395,并且是使用命令将ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE环境变量设置为。一旦服务重新启动,我就可以部署我的任务。True[Environment]::SetEnvironmentVariable("ECS_ENABLE_AWSLOGS_EXECUTIONROLE_OVERRIDE", $TRUE, "Machine")Amazon ECS

因此,根据您的情况,您可能会发现可以应用一些覆盖来为您的 ECS 实例提供它们所需的属性。


nat*_*eck 0

您不能只添加这些属性,除非实例和实例上的 ECS 代理具有该功能。例如,如果您没有运行使用远程 API 版本 1.19 的 Docker 版本,那么如果您添加该属性,您只会破坏一些东西,因为 ECS 会认为该实例能够执行某些操作,因为您添加了该属性,但该实例实际上无法做到这一点。

我的建议是使用 AWS 的官方 AMI,因为它已经具有 Docker 版本、代理版本、操作系统兼容性和正确属性的正确组合。