【问题标题】:Is there a way to share my ECR repository across my organization or across different accounts?有没有办法在我的组织或不同账户之间共享我的 ECR 存储库?
【发布时间】:2021-06-04 22:11:19
【问题描述】:

我希望在启用了跨帐户策略的帐户中无需单独推送来实现此目的。有没有办法只在我的其他帐户的 lambda 函数中提及图像 uri 路径,以便它从原始帐户中获取我的 docker 图像。

我的图像已经存在于其中一个帐户中,我们称之为 ACC A。现在我想在 ACC B 中使用相同的存储库,而不必在 ACC B 中再次推送该图像。

【问题讨论】:

    标签: amazon-web-services docker amazon-iam amazon-ecr


    【解决方案1】:

    跨账户方式

    首先在您的 Account B Lambda IAM 角色中添加 ecr:GetAuthorizationToken 权限,以对 ECR 存储库进行身份验证。

    {
        "Version": "2008-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "ecr:GetAuthorizationToken"
                    ],
                "Resource": "*"
            }
        ]
    }
    

    然后,在Account A 中,在您的ECR repository (in Permissions) 中添加类似于以下内容的策略。以下策略允许 AWS 账户 111111111111 从/向您的 ECR 存储库推送和拉取图像。将 111111111111 替换为您的账户 B AWS 帐号

    {
        "Version": "2008-10-17",
        "Statement": [
            {
                "Sid": "AllowCrossAccountPush",
                "Effect": "Allow",
                "Principal": {
                    "AWS": "arn:aws:iam::111111111111:root"
                },
                "Action": [
                    "ecr:BatchCheckLayerAvailability,
                    "ecr:BatchGetImage,
                    "ecr:CompleteLayerUpload,
                    "ecr:GetDownloadUrlForLayer",
                    "ecr:InitiateLayerUpload",
                    "ecr:BatchCheckLayerAvailability",
                    "ecr:PutImage",
                    "ecr:UploadLayerPart"
                ]
            }
        ]
    }
    

    【讨论】:

    • 我尝试关注它,但最终出现错误 - ClientError: API 错误 (404): pull access denied for 11111111111.dkr.ecr.ap-south-1.amazonaws.com/demo- repo,存储库不存在或可能需要“docker login”:拒绝:用户:arn:aws:sts:::assumed-role/demoinput-role-16hufnye/SageMaker 无权执行:ecr:资源上的 BatchGetImage:arn:aws:ecr:ap-south-1:257169079289:repository/demo-repo。如何在我的 lambda 函数中使用带有 boto3 的 ecr login 命令?
    • 使用subprocess 模块或尝试使用docker 模块
    • 这对我有用,但显然不需要获得授权。
    【解决方案2】:

    我在另一个答案中关注了博文,发现就像添加一样简单

    {
      "Version": "2008-10-17",
      "Statement": [
        {
          "Sid": "share_dev",
          "Effect": "Allow",
          "Principal": "*",
          "Action": "ecr:DescribeImages",
          "Condition": {
            "ForAnyValue:StringLike": {
              "aws:PrincipalOrgPaths": [
                "o-<org-id>/r-<root-ou-id>/ou-<sub-ou-id>/*"
              ]
            }
          }
        }
      ]
    }
    

    在您存储库的权限集中。

    现在sub-ou-id 组织中的任何帐户/角色都可以描述图像。

    【讨论】:

      【解决方案3】:

      This blog post 将引导您完成设置(它专注于 ECS 作为图像的消费服务,但同样的概念也适用于 Lambda)

      【讨论】:

      • 这涉及创建 cloudformation 模板和所有内容。我只希望我的 ACC B 中的 sagemaker 从 ACC A 获取图像,所有这些都在我的 lambda 代码中提到。
      • 我不清楚您认为如何以完全透明的方式实现这一目标(即不执行访问策略)。这意味着任何人都可以访问 您的 ACC A 中的图像。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-09-22
      • 1970-01-01
      • 2017-05-06
      • 2010-12-14
      • 1970-01-01
      • 2017-02-10
      • 2012-02-07
      相关资源
      最近更新 更多