如何为 ECS 任务分配 IAM 角色

Posted

技术标签:

【中文标题】如何为 ECS 任务分配 IAM 角色【英文标题】:How to assign IAM Role for ECS Task 【发布时间】:2018-02-25 17:13:56 【问题描述】:

可以为 ECS 任务分配 IAM 角色,以便与 AWS API 进行通信,而无需将用户凭证传递给任务。 这适用于 AWS CLI 和 SDK。 here 有相当不错的文档,但我找不到涵盖所有细节的合适示例,我将创建一个自我回答问题,以免其他人感到痛苦。

【问题讨论】:

【参考方案1】:

我创建了一个Git repo with the full example。重要的一点是:

使用 AssumeRolePolicyDocument 创建 IAM 角色定义。 将 IAM 角色分配给任务。

使用 AWS JS 开发工具包。

IAMRole:
Type: AWS::IAM::Role
Properties:
    RoleName: !Sub role-task-$AWS::StackName # Doesn't matter too much but let's make it nice anyway
    Path: / # No idea about this one but / seems to work
    # This is the funky stuff.. don't try to understand just copy-paste. Source: http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_IAM_role.html
    AssumeRolePolicyDocument: |
        
            "Statement": [
                "Effect": "Allow",
                "Principal":  "Service": [ "ecs-tasks.amazonaws.com" ],
                "Action": [ "sts:AssumeRole" ]
            ]
        
    Policies:
        - PolicyName: !Sub ecs-task-$AWS::StackName
          # You can add any actions here you want your container to be allowed to execute.
          PolicyDocument:
            
                "Version": "2012-10-17",
                "Statement": [
                        "Effect": "Allow",
                        "Action": [
                            "cloudwatch:PutMetricData" # more actions if needed
                        ],
                        "Resource": "*"
                ]
            

AWS 开发工具包的初始化。 AWS 开发工具包将自动检测容器是否有权访问角色凭证并自行初始化。除了创建 API 对象之外,您无需进行任何初始化。

 var AWS = require('aws-sdk');

 var cw = new AWS.CloudWatch();
 var s3 = new AWS.S3();

【讨论】:

您不需要手动获取凭据或使用这些凭据初始化 SDK;所有 SDK(在引入该功能之后)都应该自动执行此操作。查看here 了解最低 SDK 版本。 那么初始化代码会是什么样子?只是new AWS.Config()?我试图在不手动获取凭据的情况下让它工作,但我没有管理。 我不熟悉用于 javascript 的 SDK,但看起来默认的凭据提供程序链是正确的:github.com/aws/aws-sdk-js/blob/… 所以解决方案是您根本不应该乱用 AWS.Config。你现在可以检查它是否正确@SamuelKarp?

以上是关于如何为 ECS 任务分配 IAM 角色的主要内容,如果未能解决你的问题,请参考以下文章

ECS CLI - 您不能为需要服务相关角色的服务指定 IAM 角色

如何为 AWS ECS 任务定义提供环境变量?

拒绝对 S3 的 ECS 任务访问

允许 ECS 任务从 Kinesis 数据流中读取

ECS 任务。如何在容器中使用 AWS CLI

如何为 TPL 中的任务分配名称