Amazon ECR 接口 VPC 终端节点 ()Amazon PrivateLink - Amazon ECR
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

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

您可以将 Amazon ECR 配置为使用接口 VPC 终端节点以改善 VPC 的安全状况。VPC 终端节点由一项技术提供支持 Amazon PrivateLink,该技术使您能够通过私有 IP 地址私密访问 Amazon ECR API。 Amazon PrivateLink 将您的 VPC 和 Amazon ECR 之间的所有网络流量限制到亚马逊网络。您无需互联网网关、NAT 设备或虚拟私有网关。

有关 Amazon PrivateLink 和 VPC 终端节点的更多信息,请参阅 Amazon VPC 用户指南中的 VPC 终端节点

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

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

  • 要允许 Amazon EC2 实例上托管的 Amazon ECR 任务从 Amazon ECR 中提取私有镜像,请确保您也为 Amazon ECS 创建接口 VPC 终端节点。有关更多信息,请参阅 Amazon Elastic Container Service 开发人员指南中的接口 VPC 端点 (Amazon PrivateLink)

    重要

    在 Fargate 上托管的 Amazon ECS 任务不需要 Amazon ECS 接口 VPC 终端节点。

  • 使用 Linux 平台版本 1.3.0 或更早版本在 Fargate 上托管的 Amazon ECS 任务只需要 com.amazonaws.region.ecr.dkr Amazon ECR VPC 终端节点和 Amazon S3 网关终端节点,即可利用此功能。

  • 使用 Linux 平台版本 1.4.0 或更早版本在 Fargate 上托管的 Amazon ECS 任务需要 com.amazonaws.region.ecr.dkrcom.amazonaws.region.ecr.api Amazon ECR VPC 端点以及 Amazon S3 网关端点,才能利用此功能。

  • 使用 Windows 平台版本 1.0.0 或更早版本在 Fargate 上托管的 Amazon ECS 任务需要 com.amazonaws.region.ecr.dkrcom.amazonaws.region.ecr.api Amazon ECR VPC 端点以及 Amazon S3 网关端点,才能利用此功能。

  • 从 Amazon ECR 提取容器镜像的 Amazon ECS 任务(在 Fargate 上托管)可以通过向其任务的任务执行 IAM 角色添加条件键,限制对其任务使用的特定 VPC 和服务使用的 VPC 终端节点的访问。有关更多信息,请参阅 Amazon Elastic Container Service 开发人员指南中的用于通过接口终端节点提取 Amazon ECR 镜像的 Fargate 任务的可选 IAM 权限

  • 托管在 Fargate 上的 Amazon ECS 任务需要使用日志 CloudWatch VPC 终端节点,才能从 Amazon ECR 提取容器镜像,这些镜像也使用awslogs日志驱动程序向 CloudWatch 日志发送日志信息。有关更多信息,请参阅 创建 CloudWatch 日志端点

  • 附加到 VPC 端点的安全组必须允许端口 443 上来自 VPC 的私有子网的传入连接。

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

  • VPC 端点目前不支持 Amazon ECR 公有存储库。考虑使用缓存提取规则将公有映像托管在与 VPC 端点位于同一区域的私有存储库中。有关更多信息,请参阅 使用缓存提取规则

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

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

  • 首次使用缓存提取规则提取镜像时,如果您已将 Amazon ECR 配置为通过 Amazon PrivateLink 使用接口 VPC 终端节点,您需要在同一个 VPC 中创建一个带有 NAT 网关的公有子网,然后将至互联网的所有出站流量从私有子网路由到 NAT 网关,才能使提取操作正常工作。后续的镜像提取不需要此操作。有关更多信息,请参阅 Amazon Virtual Private Cloud 用户指南中的场景:从私有子网访问互联网

Windows 镜像注意事项

基于 Windows 操作系统的镜像包括受许可证限制而无法分发的构件。预设情况下,当您将 Windows 镜像推送到 Amazon ECR 存储库时,包含这些构件的层不会被推送,因为它们被视为外部层。当构件由 Microsoft 提供时,将从 Microsoft Azure 基础设施中检索外部层。因此,要使容器能够从 Azure 中提取这些外部层,除了创建 VPC 终端节点之外,还需要执行其他步骤。

当您将 Windows 镜像推送到 Amazon ECR 时,可以通过使用 Docker 守护进程中的 --allow-nondistributable-artifacts 标记覆盖此行为。启用后,此标记会将许可层推送到 Amazon ECR,从而使这些镜像可以通过 VPC 终端节点从 Amazon ECR 提取,而无需额外访问 Azure。

重要

使用 --allow-nondistributable-artifacts 标记不会排除您遵守 Windows 容器基础镜像许可证条款的义务;您不能发布 Windows 内容以供公共或第三方重新分发。允许在您自己的环境中使用。

要在 Docker 安装中启用此标记,您必须修改 Docker 守护进程配置文件,根据您的 Docker 安装,该配置文件通常可以在 Docker Engine 部分下的设置或首选项菜单中配置,也可以通过直接编辑 C:\ProgramData\docker\config\daemon.json 文件配置。

以下是所需配置的示例。将值替换为要将镜像推送到其中的存储库 URI。

{ "allow-nondistributable-artifacts": [ "111122223333.dkr.ecr.us-west-2.amazonaws.com" ] }

修改 Docker 守护进程配置文件后,您必须在尝试推送镜像之前重新启动 Docker 守护进程。通过验证基础层是否推送到您的存储库,确认推送工作运转正常。

注意

Windows 镜像的基础层很庞大。层太大将导致延长推送时间,并在 Amazon ECR 中增加这些镜像的存储成本。出于这些原因,我们建议仅在严格要求此选项以减少构建时间和持续存储成本时使用此选项。例如,在 Amazon ECR 中压缩之后,mcr.microsoft.com/windows/servercore 镜像的大小约为 1.7 GiB。

为 Amazon ECR 创建 VPC 终端节点

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

在 Amazon EC2 实例上托管的 Amazon ECS 任务需要 Amazon ECR 终端节点和 Amazon S3 网关终端节点。

使用平台版本 1.4.0 或更高版本在 Fargate 上托管的 Amazon ECS 任务需要 Amazon ECR VPC 终端节点和 Amazon S3 网关终端节点。

使用平台版本 1.3.0 或更早版本在 Fargate 上托管的 Amazon ECS 任务只需要 cn.com.amazonaws.cn-northwest-1.ecr.dkr Amazon ECR VPC 终端节点和 Amazon S3 网关终端节点。

注意

创建终端节点的顺序无关紧要。

cn.com.amazonaws.cn-northwest-1.ecr.dkr

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

在创建此终端节点时,您必须启用私有 DNS 主机名。为此,请确保在创建 VPC 终端节点时,在 Amazon VPC 控制台中选择启用私有 DNS 名称选项。

cn.com.amazonaws.cn-northwest-1.ecr.api

此终端节点用于对 Amazon ECR API 执行的调用。API 操作(如 DescribeImagesCreateRepository)转到此终端节点。

在创建此终端节点时,您可以选择启用私有 DNS 主机名。在创建 VPC 终端节点时,通过在 VPC 控制台中选择启用私有 DNS 名称,可启用此设置。如果您为 VPC 终端节点启用私有 DNS 主机名,请将您的 SDK 或更新 Amazon CLI 到最新版本,以便在使用 SDK 或 Amazon CLI 时无需指定终端节点 URL。

如果您启用私有 DNS 主机名并且使用的是 2019 年 1 月 24 日之前发布的 SDK 或 2019 年 1 月 24 日之前发布的 Amazon CLI 版本,则必须使用--endpoint-url参数来指定接口终端节点。以下示例显示了终端节点 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

创建 Amazon S3 网关终端节点

对于从 Amazon ECR 提取私有镜像的 Amazon ECS 任务,您必须为 Amazon S3 创建网关终端节点。必须创建网关终端节点,因为 Amazon ECR 使用 Amazon S3 来存储您的镜像层。当容器从 Amazon ECR 下载镜像时,它们必须访问 Amazon ECR 才能获取镜像清单,然后 Amazon S3 才能下载实际镜像层。以下是包含每个 Docker 镜像层的 Amazon S3 存储桶的 Amazon Resource Name (ARN)。

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

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

com.amazonaws.region.s3

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

Amazon ECR 的 Amazon S3 存储桶最低权限

Amazon S3 网关终端节点使用 IAM policy 文档来限制对服务的访问。要仅允许 Amazon ECR 的 Amazon S3 存储桶最低权限,请在为终端节点创建 IAM policy 文档时,限制对 Amazon ECR 使用的 Amazon S3 存储桶的访问权限。

下表描述了 Amazon ECR 所需的 Amazon S3 存储桶策略权限。

权限 描述

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

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

提供对包含每个 Docker 镜像层的 Amazon S3 存储桶的访问权限。表示 Amazon ECR 支持的 Amazon 区域的区域标识符,例如美国东部(俄亥俄)区域的 us-east-2

示例

以下示例说明如何提供对 Amazon ECR 操作所需的 Amazon S3 存储桶的访问权限。

{ "Statement": [ { "Sid": "Access-to-specific-bucket-only", "Principal": "*", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": ["arn:aws:s3:::prod-region-starport-layer-bucket/*"] } ] }

创建 CloudWatch 日志端点

使用 Fargate 启动类型的 Amazon ECS 任务需要您创建 com.amazonaws,这些任务使用没有互联网网关的 VPC,同时使用awslogs CloudWatch 日志驱动程序向日志发送日志信息。 regi@@ on .logs 接口日志的 VPC 终端节点。 CloudWatch 有关更多信息,请参阅 Amazon CloudWatch Logs 用户指南中的将 CloudWatch 日志与接口 VPC 终端节点配合使用

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

VPC 端点策略是一种 IAM 资源策略,您在创建或修改端点时可将它附加到端点。如果您在创建终端节点时未附加策略, Amazon 则会为您附加允许完全访问服务的默认策略。端点策略不会覆盖或替换用户策略或服务特定的策略。这是一个单独的策略,用于控制从端点中对指定服务进行的访问。端点策略必须采用 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", "ecr:GetAuthorizationToken" ], "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", "ecr:GetAuthorizationToken" ], "Resource": "*" } ] }
修改 Amazon ECR 的 VPC 终端节点策略
  1. 通过以下网址打开 Amazon VPC 控制台:https://console.aws.amazon.com/vpc/

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

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

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

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

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

共享子网

您无法在与您共享的子网中创建、描述、修改或删除 VPC 端点。但是,您可以在与您共享的子网中使用 VPC 端点。