Amazon ECR
用户指南 (API 版本 2015-09-21)
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

Amazon ECR 接口 VPC 终端节点 (AWS PrivateLink)

您可以将 Amazon ECR 配置为使用接口 VPC 终端节点以改善 VPC 的安全状况。VPC 终端节点由 AWS PrivateLink 提供支持,您可以使用该技术通过私有 IP 地址私下访问 Amazon ECR API。AWS PrivateLink 将 VPC 和 Amazon ECR 之间的所有网络流量限制在 Amazon 网络以内。而且,您无需 Internet 网关、NAT 设备或虚拟专用网关。对于使用 Fargate 启动类型的 Amazon ECS 任务,这使任务能够从 Amazon ECR 中提取私有镜像,而无需为任务分配公共 IP 地址。

有关 AWS PrivateLink 和 VPC 终端节点的更多信息,请参阅通过 AWS PrivateLink 访问 AWS 服务

Amazon ECR VPC 终端节点的注意事项

在为 Amazon ECR 配置 VPC 终端节点之前,请注意以下事项:

  • 要允许使用 EC2 启动类型的 Amazon ECS 任务从 Amazon ECR 中提取私有镜像,请确保也为 Amazon ECS 创建接口 VPC 终端节点。有关更多信息,请参阅 Amazon Elastic Container Service Developer Guide 中的接口 VPC 终端节点 (AWS PrivateLink)

    重要

    使用 Fargate 启动类型的 Amazon ECS 任务不需要 Amazon ECS 接口 VPC 终端节点。

  • 使用 Fargate 启动类型的任务仅需要 com.amazonaws.region.ecr.dkr Amazon ECR VPC 终端节点和 Amazon S3 网关终端节点即可利用此功能。

  • 使用 Fargate 启动类型从 Amazon ECR 拉取容器映像的任务可以通过向其任务执行角色添加条件键,限制对其任务使用的特定 VPC 和服务使用的 VPC 终端节点的访问。有关更多信息,请参阅 Amazon Elastic Container Service Developer Guide 中的 Amazon ECS 任务执行 IAM 角色

  • VPC 终端节点当前不支持跨区域请求。确保在计划向 Amazon ECR 发出 API 调用的同一区域中创建终端节点。

  • VPC 终端节点仅通过 Amazon Route 53 支持 Amazon 提供的 DNS。如果您希望使用自己的 DNS,可以使用条件 DNS 转发。有关更多信息,请参阅 Amazon VPC 用户指南 中的 DHCP 选项集

  • 附加到 VPC 终端节点的安全组必须允许从 VPC 的私有子网通过端口 443 进行传入连接。

  • 如果您的容器具有与 Amazon S3 的现有连接,则在添加 Amazon S3 网关终端节点时,其连接可能会短暂中断。如果要避免此中断,请创建一个使用 Amazon S3 网关终端节点的新 VPC,然后将 Amazon ECS 集群及其容器迁移到该新 VPC。

为 Amazon ECR 创建 VPC 终端节点

要为 Amazon ECR 服务创建 VPC 终端节点,请使用 Amazon VPC 用户指南 中的创建接口终端节点过程。

如果您的 Amazon ECS 任务使用 EC2 启动类型,则同时需要以下两个终端节点。创建终端节点的顺序无关紧要。如果您的任务使用的是 Fargate 启动类型,则仅需要 com.amazonaws.region.ecr.dkr 终端节点。

com.amazonaws.region.ecr.api

注意

指定的 region 表示 Amazon ECR 支持的 AWS 区域的区域标识符,例如美国东部(俄亥俄)区域的 us-east-2

此终端节点用于对 Amazon ECR API 执行的调用。诸如 DescribeImages 和 CreateRepositories 这样的 API 操作会转至此终端节点。

在创建 com.amazonaws.region.ecr.api 终端节点时,您可以选择启用私有 DNS 主机名。在创建 VPC 终端节点时,通过在 VPC 控制台中选择 Enable Private DNS Name (启用私有 DNS 名称),可启用此主机名。如果您为 VPC 终端节点启用私有 DNS 主机名,请将开发工具包或 AWS CLI 更新到最新版本,以便在使用开发工具包或 AWS CLI 时无需指定终端节点 URL。

如果您启用私有 DNS 主机名并使用 2019 年 1 月 24 日版之前发布的开发工具包或 AWS CLI 版本,则必须使用 --endpoint-url 参数指定接口终端节点。以下示例 CLI 命令显示了终端节点 URL 的格式。

aws ecr create-repository --repository-name name --endpoint-url https://api.ecr.region.amazonaws.com

如果您不为 VPC 终端节点启用私有 DNS 主机名,则必须使用 --endpoint-url 参数并指定接口终端节点的 VPC 终端节点 ID。下面是终端节点 URL 的格式。

aws ecr create-repository --repository-name name --endpoint-url https://VPC_endpoint_ID.api.ecr.region.vpce.amazonaws.com
com.amazonaws.region.ecr.dkr

此终端节点用于 Docker Registry API。诸如 pushpull 这样的 Docker 客户端命令使用此终端节点。

在创建 com.amazonaws.region.ecr.dkr 终端节点时,您必须启用私有 DNS 主机名。为此,请确保在创建 VPC 终端节点时,在 VPC 控制台中选择 Enable Private DNS Name (启用私有 DNS 名称) 选项。

创建 Amazon S3 网关终端节点

要从 Amazon ECR 获取私有映像,您必须针对所有 Amazon ECS 任务,为 Amazon S3 创建网关终端节点。网关终端节点是必需的,因为 Amazon ECR 使用 Amazon S3 来存储 Docker 映像层。当容器从 Amazon ECR 下载 Docker 镜像时,它们必须访问 Amazon ECR 以获取镜像清单并访问 Amazon S3 以下载实际镜像层。以下是包含每个 Docker 映像层的 Amazon S3 存储桶的 Amazon 资源名称 (ARN):

arn:aws:s3:::prod-region-starport-layer-bucket/*

使用 Amazon VPC 用户指南 中的创建网关终端节点过程,为 Amazon ECR 服务创建以下 Amazon S3 网关终端节点。在创建终端节点时,请务必为您的 VPC 选择路由表。

com.amazonaws.region.s3

Amazon S3 网关终端节点使用 IAM 策略文档来限制对服务的访问。由于您在任务 IAM 角色或其他 IAM 用户策略中放入的任何限制仍适用于 Full Access (完全访问) 策略,因此可使用此策略。如果要将 Amazon S3 存储桶访问权限限制为使用 Amazon ECR 所需的最低权限,请参阅Amazon ECR 的最低 Amazon S3 存储桶权限

创建 CloudWatch Logs 终端节点

对于使用 Fargate 启动类型的任务,如果您的 VPC 没有 Internet 网关,并且您的任务使用 awslogs 日志驱动程序将日志信息发送到 CloudWatch Logs,则您必须为 CloudWatch Logs 创建 com.amazonaws.region.logs 接口 VPC 终端节点。有关更多信息,请参阅 Amazon CloudWatch Logs User Guide 中的将 CloudWatch Logs 与接口 VPC 终端节点一起使用

为 Amazon ECR VPC 终端节点创建终端节点策略

VPC 终端节点策略是一种 IAM 资源策略,该策略在您创建或修改终端节点时可附加到该终端节点。如果您在创建终端节点时未附加策略,AWS 会为您附加一个默认策略,该策略允许对服务的完全访问。终端节点策略不会覆盖或替换 IAM 用户策略或服务特定的策略。这是一个单独的策略,用于控制从终端节点中对指定服务进行的访问。终端节点策略必须采用 JSON 格式编写。有关更多信息,请参阅 Amazon VPC 用户指南 中的使用 VPC 终端节点控制对服务的访问

我们建议您创建一个 IAM 资源策略,并将该策略同时附加到两个 Amazon ECR VPC 终端节点。

下面是 Amazon ECR 的终端节点策略示例。此策略允许特定 IAM 角色从 Amazon ECR 中拉取映像。

{ "Statement": [{ "Sid": "AllowPull", "Principal": { "AWS": "arn:aws:iam::1234567890:role/role_name" }, "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ], "Effect": "Allow", "Resource": "*" }] }

下面的终端节点策略示例阻止删除指定的存储库。

{ "Statement": [{ "Sid": "AllowAll", "Principal": "*", "Action": "*", "Effect": "Allow", "Resource": "*" }, { "Sid": "PreventDelete", "Principal": "*", "Action": "ecr:DeleteRepository", "Effect": "Deny", "Resource": "arn:aws:ecr:region:1234567890:repository/repository_name" } ] }

下面的终端节点策略示例将前面的两个示例组合到一个策略中。

{ "Statement": [{ "Sid": "AllowAll", "Effect": "Allow", "Principal": "*", "Action": "*", "Resource": "*" }, { "Sid": "PreventDelete", "Effect": "Deny", "Principal": "*", "Action": "ecr:DeleteRepository", "Resource": "arn:aws:ecr:region:1234567890:repository/repository_name" }, { "Sid": "AllowPull", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::1234567890:role/role_name" }, "Action": [ "ecr:BatchGetImage", "ecr:GetDownloadUrlForLayer" ], "Resource": "*" } ] }

修改 Amazon ECR 的 VPC 终端节点策略

  1. 打开 Amazon VPC 控制台 https://console.amazonaws.cn/vpc/

  2. 在导航窗格中,选择终端节点

  3. 如果您没有为 Amazon ECR 创建 VPC 终端节点,请参阅为 Amazon ECR 创建 VPC 终端节点

  4. 选择要将策略添加到的 Amazon ECR VPC 终端节点,然后在屏幕的下半部分中选择策略选项卡。

  5. 选择编辑策略并对策略进行更改。

  6. 选择保存以保存策略。