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

时间:2018-09-18 17:43:29

标签: amazon-web-services amazon-iam amazon-ecs aws-sdk-js

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

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

如果我在Fargate上运行代码,则该代码不会获得任何许可。

相比之下,实例中运行的所有bash脚本似乎都具有适当的权限。

实际上,the documentation并没有将其作为节点sdk的选项提及,只是:

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

有什么方法可以让您的节点代码获得ECS任务的权限?

这似乎是将权限传递给代码的逻辑方法。它与在实例上运行的代码完美结合。

我唯一想到的解决方法是为每个ECS服务创建一个IAM用户,并将API密钥/秘密作为环境变量传递到任务定义中。但是,这似乎并不十分安全,因为任何可以访问任务定义的人都可以用纯文本格式看到它。

2 个答案:

答案 0 :(得分:1)

您的问题缺少有关如何设置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"
    }
  ]
}

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

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

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

您是否使用ECS优化的AMI?如果不是,请将--net=host添加到启动代理的docker run命令中。查看此link以获取更多信息。

答案 1 :(得分:0)

我知道了。这很奇怪。

一位同事认为,如果我们在Object.freeze上致电proccess.env,那会“更安全”。这在某种程度上干扰了SDK访问凭据的能力。

删除了“改进”,一切都很好。我认为这一课是“不要惹process.env”。