注册错误:NoCredentialProviders: 链中没有有效的提供程序 ECS代理错误。

25
我正在尝试使用 EC2 容器服务,使用 Terraform 进行创建。我已定义了 ECS 集群、自动缩放组和启动配置,所有似乎都能正常工作,除了一个问题:EC2 实例已经被创建,但它们未在集群中注册,集群仅显示“没有可用实例”。在创建的实例上的 ECS 代理日志中,我发现有一个错误不断重复:
``` Error registering: NoCredentialProviders: no valid providers in chain ```
EC2 实例是使用正确的 ecs_role 角色创建的,而这个角色有两个策略,其中一个如下所示,符合文档要求:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ecs:CreateCluster",
        "ecs:DeregisterContainerInstance",
        "ecs:DiscoverPollEndpoint",
        "ecs:Poll",
        "ecs:RegisterContainerInstance",
        "ecs:StartTelemetrySession",
        "ecs:Submit*",
        "ecs:StartTask"
      ],
      "Resource": "*"
    }
  ]
}

我正在使用ami ami-6ff4bd05。最新的terraform。

7个回答

37

角色的信任关系存在问题,因为该角色应包括 ec2。不幸的是,错误消息并没有什么帮助。

信任关系的示例:

{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Action": "sts:AssumeRole",
      "Principal": {
        "Service": ["ecs.amazonaws.com", "ec2.amazonaws.com"]
      },
      "Effect": "Allow"
    }
  ]
}

4
我的天啊,我已经连续三到四天尝试了所有的方法,但是这个解决方案起作用了。你是怎么发现它的,我在其他地方都没看到过!!很多人提到公共IP、角色等等,但你是唯一一个提到信任关系的人。谢谢! - Pedro Mata-Mouros
它就这样奏效了!这太愚蠢了,亚马逊!(希望你在听)ECS集群是通过你们的首次运行向导创建的,并且一切都按照ECS开发人员手册完成,但你们仍然浪费了我3个小时的时间,直到我找到了这个答案。 - Johan Thomsen
2018年11月27日 - 当我尝试使用该策略时,我得到了以下错误信息:此策略包含以下错误:具有禁止字段Principal。 - Kappacake
我同意。这个问题的错误报告太糟糕了。 - user1607158
这是一个相当老的答案,我相信AWS已经解决了这个问题。不知道确切操作的情况下更改IAM角色是很危险的,所以如果可能的话,请避免使用此解决方案。 - Sarang

2

请确保在启动配置中选择正确的ECS角色。

enter image description here


2
今天我遇到了这个错误并找出了问题所在:我忘记在启动模板中设置IAM角色(它位于高级部分)。您需要将其设置为ecsInstanceRole(这是AWS默认的名称-因此请检查是否已更改并相应地使用)。
我从启动配置切换到启动模板,而在设置启动模板时,我忘记添加角色!

我没有错过 IAM 角色,在我的情况下,LT 丢失了对它的引用。谢谢您在这里的回答 - 在超过 24 小时充满压力的情况下非常有帮助! - Roy Hinkley

1

您可能需要将AmazonEC2RoleforSSM(或AmazonSSMFullAccess)添加到您的EC2角色中。


这对我在terraform批处理资源上起作用了。我必须将arn:aws:iam::aws:policy/service-role/AmazonEC2RoleforSSM策略附加到batch_instance_role - VitoshKa

0

我花了两天时间尝试了所有的方法,但都没有成功。我的设置是标准的,即私有子网中的ecs集群实例,公共子网中的ELB,在各自的安全组中正确设置了NAT和IGW,在IAM角色中正确定义,NACL中的标准配置等等。尽管如此,ec2实例仍无法注册到ecs集群。最后我发现,我的自定义VPC的DHCP选项集被配置为“domain-name-servers: xx.xx.xx.xx, xx.xx.xx.xx”,这是我们公司内部DNS IP地址的IP地址...

解决方案是将DHCP选项集的以下值设置为: 域名:us-west-2.compute.internal(假设您的vpc在us-west-2中), 选项:domain-name:us-west-2.compute.internal domain-name-servers:AmazonProvidedDNS


0

显然,当传递无效的aws-profile时,也会出现此错误消息。


-1

如果您使用taskDefinition,请检查是否设置了执行和任务角色ARN,并为这些角色设置了正确的策略。


我认为这个问题与任务定义无关,因为它发生在实例注册之后。 - Sarang
在我的情况下,问题是我没有给予角色足够的权限。因此,我正在更改任务定义的角色设置。 - Kampaii
问题在于实例未被注册。这发生在任务在实例上运行之前。因此,taskDefinition的角色对结果没有影响(因此我会投反对票)。启动配置/启动模板中定义的角色才是重要的。也许您在两个地方都使用了相同的角色? - Sarang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接