如何在节点AWS SDK代码中使用AWS ECS任务角色

Cri*_*bie 9 amazon-web-services amazon-ecs amazon-iam aws-sdk-js

使用AWS Node SDK的代码似乎无法获得ECS任务的角色权限.

如果我在EC2 ECS实例上运行代码,代码似乎继承了实例上的角色,而不是任务.

如果我在Fargate上运行代码,则代码不会获得任何权限.

相比之下,在实例中运行的任何bash脚本似乎都具有适当的权限.

实际上,文档没有提到这是节点sdk的一个选项,只是:

  1. 从Amazon EC2的IAM角色加载(如果在EC2上运行),
  2. 从共享凭证文件(〜/ .aws/credentials)加载,
  3. 从环境变量加载,
  4. 从磁盘上的JSON文件加载,
  5. 在您的应用程序中硬编码

有没有办法让您的节点代码获得ECS任务的权限?

这似乎是将权限传递给代码的合理方式.它与在实例上运行的代码完美配合.

我能想到的唯一解决方法是为每个ECS服务创建一个IAM用户,并将API Key/Secret作为环境变量传递给任务定义.但是,这似乎不太安全,因为对于有权访问任务定义的任何人来说,它都可以以纯文本形式显示.

Joh*_*ley 2

您的问题缺少很多有关如何设置 ECS 集群的详细信息,而且我不确定问题是针对 ECS 还是专门针对 Fargate。

确保您使用的是最新版本的 SDK。Javascript 支持 ECS 和 Fargate 任务凭证。

ECS 上的凭据经常会出现混淆。有分配给集群 EC2 实例的 IAM 角色和分配给 ECS 任务的 IAM 角色。

最常见的问题是ECS任务角色上尚未设置“信任关系”。选择您的 IAM 角色,然后选择“信任关系”选项卡并确保其如下所示:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "ecs-tasks.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

除了运行任务和服务所需的标准 Amazon ECS 权限之外,IAM 用户还需要iam:PassRole使用 IAM 角色执行任务的权限。

接下来验证您是否在任务定义中使用 IAM 角色。ARN在任务角色字段中指定正确的 IAM 角色。请注意,这与任务执行角色(允许容器拉取图像并发布日志)不同。

接下来,确保您的 ECS 实例使用最新版本的 ECS 代理。代理版本列在“ECS 实例”选项卡的右侧“代理版本”列下。当前版本是1.20.3.

您是否使用 ECS 优化的 AMI?如果没有,请添加--net=hostdocker run启动代理的命令中。查看此链接以获取更多信息。