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

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

您可以将 Amazon ECR 配置为使用接口 VPC 终端节点以改善 VPC 的安全状况。VPC 终端节点由 Amazon PrivateLink 提供支持,您可以使用该技术通过私有 IP 地址私下访问 Amazon ECR API。AmazonPrivateLink 将 VPC 和 Amazon ECR 之间的所有网络流量限制在 Amazon 网络以内。您无需互联网网关、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 终端节点 (AmazonPrivateLink)

    重要

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

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

  • 使用平台版本 1.4.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 权限

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

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

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

  • VPC 终端节点仅支持 Amazon 通过 Amazon Route 53 提供的 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 主机名,请将开发工具包或 Amazon CLI 更新到最新版本,以便在使用开发工具包或 Amazon CLI 时无需指定终端节点 URL。

如果您启用私有 DNS 主机名并使用 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 策略文档来限制对服务的访问。可以使用完全访问权限策略,因为您在任务 IAM 角色或其他 IAM 用户策略中设置的任何限制仍然适用于此策略。如果要将 Amazon S3 存储桶访问权限限制为使用 Amazon ECR 所需的最低权限,请参阅 Amazon ECR 的 Amazon S3 存储桶最低权限

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

Amazon S3 网关终端节点使用 IAM 策略文档来限制对服务的访问。要仅允许 Amazon ECR 的 Amazon S3 存储桶最低权限,请在为终端节点创建 IAM 策略文档时,限制对 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 Logs 终端节点

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

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

VPC 终端节点策略是一种 IAM 资源策略,您在创建或修改端点时可将它附加到端点。如果您在创建终端节点时未附加策略,Amazon 会为您附加一个默认策略,该策略允许对服务的完全访问。端点策略不会覆盖或替换 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", "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. 在导航窗格中,选择 Endpoints(端点)

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

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

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

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