使用AWS Node SDK的代码似乎无法获得ECS任务的角色权限。
如果我在EC2 ECS实例上运行代码,则该代码似乎继承了实例上的角色,而不是任务的角色。
如果我在Fargate上运行代码,则该代码不会获得任何许可。
相比之下,实例中运行的所有bash脚本似乎都具有适当的权限。
实际上,the documentation并没有将其作为节点sdk的选项提及,只是:
有什么方法可以让您的节点代码获得ECS任务的权限?
这似乎是将权限传递给代码的逻辑方法。它与在实例上运行的代码完美结合。
我唯一想到的解决方法是为每个ECS服务创建一个IAM用户,并将API密钥/秘密作为环境变量传递到任务定义中。但是,这似乎并不十分安全,因为任何可以访问任务定义的人都可以用纯文本格式看到它。
答案 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
”。