侧边栏壁纸
  • 累计撰写 208 篇文章
  • 累计创建 16 个标签
  • 累计收到 5 条评论

目 录CONTENT

文章目录
AWS

AWS EKS使用同帐号ECR与跨帐号ECR的问题

Wake
2022-08-31 / 0 评论 / 1 点赞 / 1,125 阅读 / 1,122 字

前言:工作过程中需要使用EKS拉取aws ecr镜像仓库里面的镜像,所以记录一下如何连接AWS ECR镜像仓库

同个账号下:

在一般情况下, EKS 工作节点要能够成功加入至EKS集群,会绑定 IAM 角色,且该 IAM 角色需要至少下面两个策略 [1]:

- AmazonEKSWorkerNodePolicy
- AmazonEC2ContainerRegistryReadOnly

EKS 节点 kubelet 守护进程会代表您调用 AWS API,进行 ECR 拉取镜像相关权限的操作,代码您可以参考此处 [2],因此您可以直接拉取同帐号之镜像。 只要保证这两个策略在EKS节点的iam角色中,EKS集群就可以访问同账号下的ecr仓库了。

跨账号下:

允许一个二级账户或者其他一级账号推送或拉取我的 Amazon Elastic 容器注册表 (Amazon ECR) 映像存储库中的映像。

解决方法

如果要通过另一个账户在 Amazon ECR 存储库中推送或拉取映像。首先,您必须创建一个策略,以允许二级账户对存储库执行 API 调用。然后,使用从二级账户生成的 Docker 身份验证令牌对一级账户的存储库执行推送和拉取命令。
创建一个策略,以允许二级账户对映像存储库执行 API 调用

  1. 为您的一级账户打开 Amazon ECR 控制台。
  2. 选择要修改的存储库的超链接存储库名称。
  3. 从左侧导航窗格中的“Amazon ECR - Repositories”(Amazon ECR – 存储库) 下,选择 Permissions (权限)。
  4. 要从您的一级账户为您的二级账户添加存储库策略,请选择 Edit policy JSON (编辑策略 JSON)。在代码编辑器中输入您的策略,然后选择 Save (保存)。

重要提示:在您的策略中,包含二级账户的账号和该账户可对存储库执行的操作。

以下示例存储库策略允许特定账户推送和拉取映像:

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "AllowPushPull",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::account-id:root"
            },
            "Action": [
                "ecr:GetDownloadUrlForLayer",
                "ecr:BatchGetImage",
                "ecr:BatchCheckLayerAvailability",
                "ecr:PutImage",
                "ecr:InitiateLayerUpload",
                "ecr:UploadLayerPart",
                "ecr:CompleteLayerUpload"
            ]
        }
    ]
}
  1. 在任务定义中,设置您想用于 Amazon ECS 的映像。您的映像托管在一级账户的 Amazon ECR 存储库中。
    从二级账户中生成临时的 Docker 身份验证令牌并执行推送或拉取测试
    注意:如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请确保您运行的是最新版本的 AWS CLI。

二级账户在收到有效期为 12 小时的临时身份验证令牌之前,无法对存储库执行策略操作。该令牌允许二级账户对一级账户的存储库使用 Docker 推送和拉取命令。get-login-password 命令可检索并解码授权令牌,然后您可以将授权令牌传送到 docker login 命令以进行身份验证。

注意:获取令牌的账户必须具有相关的 AWS Identify and Access Management (IAM) API 权限才能修改存储库。有关示例,请参阅 Amazon ECR 托管策略。要排查 Docker 的问题,请对您的 Docker 守护程序启用调试模式。使用 AWS CLI 版本 2 的最新版本,或 AWS CLI 版本 1 的 1.17.10 版本或更新版本时,支持此命令。有关更多信息,请参阅 get-login-password。

  1. 要为在 Amazon ECS 之外推送和拉取映像的账户生成 Docker 身份验证令牌,请运行以下命令。将 aws_account_id 替换为您的一级账户 ID,然后将 regionID 替换为您的区域 ID。

使用 AWS CLI:

aws ecr get-login-password --region regionID | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.regionID.amazonaws.com

当看到以下输出:

aws ecr get-login-password --region ap-south-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.ap-south-1.amazonaws.com
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See https://docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

对一级账户执行映像拉取或推送测试。

1

评论区