如何为 Fargate 任务提供上传到 S3 的正确权限

Posted

技术标签:

【中文标题】如何为 Fargate 任务提供上传到 S3 的正确权限【英文标题】:How to give a Fargate Task the right permissions to upload to S3 【发布时间】:2020-10-30 22:49:53 【问题描述】:

我想从 Fargate 任务上传到 S3。这可以通过仅指定 ExecutionRoleArn 而不是同时指定 ExecutionRoleArn 和 TaskRoleArn 来实现吗?

如果我指定一个附加了以下权限策略的 ExecutionRoleArn:

自定义政策:


    "Version": "2012-10-17",
    "Statement": [
        
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::example_bucket/*"
        
    ]

AmazonECSTaskExecutionRolePolicy:


    "Version": "2012-10-17",
    "Statement": [
        
            "Effect": "Allow",
            "Action": [
                "ecr:GetAuthorizationToken",
                "ecr:BatchCheckLayerAvailability",
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "logs:CreateLogStream",
                "logs:PutLogEvents"
            ],
            "Resource": "*"
        
    ]

具有以下信任关系:


  "Version": "2012-10-17",
  "Statement": [
    
      "Sid": "",
      "Effect": "Allow",
      "Principal": 
        "Service": [
          "events.amazonaws.com",
          "lambda.amazonaws.com",
          "ecs-tasks.amazonaws.com"
        ]
      ,
      "Action": "sts:AssumeRole"
    
  ]

这是否足以让任务上传到 S3?还是我需要定义一个 TaskRoleArn?

【问题讨论】:

【参考方案1】:

服务使用ExecutionRoleArn 来正确设置任务,这包括从 ECR 中提取任何图像。

任务使用TaskRoleArn 为其提供与其他 AWS 服务(例如 S3)交互所需的权限。

从技术上讲,两个 Arns 可能是相同的,但我建议将它们分开为不同的角色,以避免混淆角色用于两种场景所需的权限。

此外,您应该拥有ecs.amazonaws.com 的端点。事实上,根据您使用 ECS 的方式,服务的完整列表如下(尽管大多数可以删除,例如如果您不使用 Spot,则可以删除大部分服务,如果您不使用自动缩放,则可以删除自动缩放)。

"ecs.amazonaws.com",
"ecs-tasks.amazonaws.com",
"spot.amazonaws.com",
"spotfleet.amazonaws.com",
"ecs.application-autoscaling.amazonaws.com",
"autoscaling.amazonaws.com"

【讨论】:

很好地解释了这两个角色之间的区别。【参考方案2】:

在 Fargate 的情况下,两个 IAM 角色支付不同的角色

执行角色

这是角色是强制性的,没有这个角色你不能运行任务,即使你在 Task Role 中添加了 ExecutionRole 策略

要产生此错误,只需设置 Execution role =None,您将无法启动任务。

AWS Forums (Unable to create a new revision of Task Definition)

任务角色

这个角色是可选的,你可以在这个角色中添加s3相关的权限,

任务可用于向授权的 AWS 服务发出API 请求的可选 IAM 角色。

你的警察看起来还不错,

创建 ecs_s3_upload_role 添加以下政策

    "Version": "2012-10-17",
    "Statement": [
        
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::example_bucket/*"
        
    ]

现在 Fargate 任务将能够上传到 S3 存储桶。

【讨论】:

【参考方案3】:

您的政策不包含任何与s3 相关的权限。因此,您应该在task role 中定义您的s3 权限:

借助 Amazon ECS 任务的 IAM 角色,您可以指定一个可由任务中的容器使用的 IAM 角色。

【讨论】:

以上是关于如何为 Fargate 任务提供上传到 S3 的正确权限的主要内容,如果未能解决你的问题,请参考以下文章

我可以从 S3 中的特定文件上传触发 ECS/Fargate 任务吗?

如何为 Fargate 任务定义指定操作系统系列?

如何从远程执行的 Fargate 任务访问 S3 对象?

AWS S3 - 如何为 Android 获取正确的凭证?

如何为“无服务器”部署创建一个 s3 存储桶?

支持恢复将大文件上传到 S3