AWS ECS Fargate 从跨账户 ECR 存储库中提取映像

Posted

技术标签:

【中文标题】AWS ECS Fargate 从跨账户 ECR 存储库中提取映像【英文标题】:AWS ECS Fargate pull image from a cross account ECR repo 【发布时间】:2019-03-25 15:57:24 【问题描述】:

我有 2 个 AWS 账户: - 具有 ECR 回购的账户 A。 - 具有运行 Fargate 的 ECS 集群的账户 b。

我在账户 A 中创建了一个与账户 B 具有信任关系的“跨账户”角色,并且我已将“AmazonEC2ContainerRegistryPowerUser”策略附加到该角色。

我通过将账户 B 的 ID 和“跨账户”角色添加到存储库策略来授予对账户 A 中 ECR 存储库的访问权限。

我向 Fargate“TaskExecutionRole”附加了一个策略,允许 Fargate 承担“跨账户”角色。

尝试在账户 B 中部署 Fargate 任务并引用账户 A 中的图像时,我收到 500 错误。

【问题讨论】:

500 表示内部服务器错误,而不是权限错误。你确定拉是对的吗?我看到了一个 500 错误,层太多、太大并且有命名问题,但跨账户访问没有。 【参考方案1】:

Fargate 不会自动承担跨账户角色。幸运的是,您无需在另一个帐户中担任角色即可从该帐户的 ECR 存储库中提取图像。

要在 ECR 中启用对图像的跨账户访问,请在账户 A 的存储库中添加账户 B 的访问权限(通过设置 repository policy),然后在账户 B 中指定有权从 ECR 中提取的 TaskExecutionRole (" ecr:GetDownloadUrlForLayer", "ecr:BatchGetImage", "ecr:BatchCheckLayerAvailability")。

例如,在账户 A 中的存储库上设置存储库策略,如下所示:


  "Version": "2008-10-17",
  "Statement": [
    
      "Sid": "AllowCrossAccountPull",
      "Effect": "Allow",
      "Principal": 
        "AWS": "arn:aws:iam::ACCOUNT_B_ID:root"
      ,
      "Action": [
        "ecr:GetDownloadUrlForLayer",
        "ecr:BatchCheckLayerAvailability",
        "ecr:BatchGetImage"
      ]
    
  ]

然后,将账户 B 中的 TaskExecutionRole 设置为具有如下策略:


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

或者,您可以将托管策略 AmazonECSTaskExecutionRolePolicy 用于您的 TaskExecutionRole,而不是定义自己的。

【讨论】:

塞缪尔的回答非常好。但是,如果有人试图将资源限制为特定存储库,请保持 GetAuthorizationToken 操作适用于所有资源。实现起来很痛苦,但它是这里的文档:docs.aws.amazon.com/AmazonECR/latest/userguide/…

以上是关于AWS ECS Fargate 从跨账户 ECR 存储库中提取映像的主要内容,如果未能解决你的问题,请参考以下文章

AWS ECS Fargate ALB 错误(请求超时)

AWS ECS:在 ECR 中强制重新部署新的最新映像

ECS Fargate 计划任务无法连接到 ECR

如何诊断 ECS Fargate 任务启动失败?

将新映像推送到 ECR 存储库时如何自动部署到 ECS Fargate

AWS ECS Fargate 未创建任务 AmazonECSTaskExecutionRole 错误