

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

# Amazon ECR 中的私有映像复制
<a name="replication"></a>

您可以配置 Amazon ECR 私有注册表以支持存储库的复制。Amazon ECR 同时适用于跨区域和跨账户复制。要进行跨账户复制，目标账户必须配置注册表权限策略，以允许从源注册表进行复制。有关更多信息，请参阅 [Amazon ECR 中的私有注册表权限](registry-permissions.md)。

**Topics**
+ [跨账户复制策略要求](#replication-policy-clarification)
+ [私有镜像复制的注意事项](#replication-considerations)
+ [Amazon ECR 的私有映像复制示例](registry-settings-examples.md)
+ [在 Amazon ECR 中配置私有映像复制](registry-settings-configure.md)
+ [移除 Amazon ECR 中的私有映像复制设置](registry-settings-remove.md)

## 跨账户复制策略要求
<a name="replication-policy-clarification"></a>

要使跨账户 ECR 复制正常运行，您必须了解哪个账户需要配置哪些策略。本部分阐明了源账户和目标账户的策略要求。

### 策略配置概述
<a name="replication-policy-overview"></a>

跨账户 ECR 复制仅需要在**目标账户**上配置策略。源账户不需要任何特殊的存储库或注册表策略。
+ **源账户**：在注册表设置中配置复制规则。无需为源存储库设置其他策略。
+ **目标账户**：配置注册表权限策略以允许源账户复制映像。

### 目标注册表策略要求
<a name="destination-registry-policy-requirements"></a>

目标账户必须配置注册表权限策略，以授予源账户执行以下操作的权限：
+ `ecr:ReplicateImage` - 允许源账户将映像复制到目标注册表中
+ `ecr:CreateRepository` - 允许 ECR 在目标注册表中自动创建存储库（如果这些存储库尚不存在）

**重要**  
如果您不授予 `ecr:CreateRepository` 权限，则必须在目标账户中手动创建同名的存储库，然后才能成功复制。

目标注册表策略示例：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowCrossAccountReplication",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:root"
            },
            "Action": [
                "ecr:ReplicateImage",
                "ecr:CreateRepository"
            ],
            "Resource": "*"
        }
    ]
}
```

------

### 源账户要求
<a name="source-account-requirements"></a>

源账户只需：
+ 在注册表设置中配置复制规则以指定目标账户和区域
+ 确保配置复制的 IAM 主体拥有必要的 ECR 权限

**源存储库不需要其他策略。**源存储库不需要授予复制权限的存储库策略。

### 常见误解
<a name="common-misconceptions"></a>

以下是关于 ECR 跨账户复制策略的常见误解：
+ **误解**：源存储库需要一个允许目标账户复制映像的策略。

  **现实**：源存储库不需要任何特殊的复制策略。
+ **误解**：源账户和目标账户都需要注册表策略。

  **现实**：只有目标账户需要注册表权限策略。
+ **误解**：存储库策略和注册表策略是一回事。

  **现实**：存储库策略控制对单个存储库的访问，而注册表策略控制注册表级别的操作，例如复制。

### 对复制失败进行问题排查
<a name="replication-troubleshooting"></a>

如果跨账户复制失败，请检查以下内容：
+ 验证目标账户是否配置了注册表权限策略
+ 确保注册表策略同时包含 `ecr:ReplicateImage` 和 `ecr:CreateRepository` 操作
+ 确认在目标注册表策略中正确指定了源帐户 ID
+ 检查目标存储库是否存在（如果未授予 `ecr:CreateRepository`）
+ 查看失败`CreateRepository`或 `ReplicateImage` API 调用的 CloudTrail 日志

## 私有镜像复制的注意事项
<a name="replication-considerations"></a>

使用私有镜像复制时应注意以下事项。
+ 只有在配置复制后推送或还原到存储库的存储库内容才会被复制。存储库中任何先前存在的内容都不会复制。如果在开启复制功能后恢复映像，则会对其进行复制。如果在开启复制功能之前将其恢复，则不会对其进行复制。
+ 复制完成后，跨区域和账户的存储库名称将保持不变。Amazon ECR 不支持在复制过程中更改存储库名称。
+ 首次配置私有注册表以进行复制时，Amazon ECR 会代表您创建服务相关 IAM 角色。服务相关 IAM 角色授予 Amazon ECR 复制服务在注册表中创建存储库和复制镜像所需的权限。有关更多信息，请参阅 [对 Amazon ECR 使用服务相关角色](using-service-linked-roles.md)。
+ 要进行跨账户复制，私有注册表目标必须授予允许源注册表复制其镜像的权限。通过设置私有注册表权限策略来完成此授权。有关更多信息，请参阅 [Amazon ECR 中的私有注册表权限](registry-permissions.md)。
+ 如果更改私有注册表的权限策略以删除权限，则以前授予权限的任何进行中复制都可能完成。
+ 要进行跨区域复制，在该区域内或向该区域进行任何复制操作之前，源账户和目标账户都必须选择加入该区域。有关更多信息，请参阅《Amazon Web Services 一般参考》**中的[管理 AWS 区域](https://docs.aws.amazon.com/general/latest/gr/rande-manage.html)。
+ 不支持在 AWS 分区之间进行跨区域复制。例如，`us-west-2` 中的存储库无法复制到 ` cn-north-1`。有关 AWS 分区的更多信息，请参阅《*AWS 一般*参考》中的 [ARN 格式](https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arns-syntax)。
+ 私有注册表的复制配置最多可以包含 25 个跨所有规则的唯一目标，最多共有 10 个规则。每个规则最多可包含 100 个筛选条件。这允许为包含用于生产和测试的镜像的存储库指定单独的规则。
+ 复制配置支持通过指定存储库前缀来筛选私有注册表中复制的存储库。有关示例，请参阅 [示例：使用存储库筛选条件配置跨区域复制](registry-settings-examples.md#registry-settings-examples-crr-filter)。
+ 每次推送映像或恢复映像时，复制操作仅发生一次。例如，如果您配置了从 `us-west-2` 到 ` us-east-1` 以及从 `us-east-1` 到 `us-east-2` 的跨区域复制，则推送到 `us-west-2` 的镜像仅复制到 `us-east-1`，它不会再复制到 `us-east-2`。此行为同时适用于跨区域和跨账户复制。
+ 大多数映像会在不到 30 分钟的时间内复制，但在极少数情况下，复制可能需要更长的时间。
+ 注册表复制不执行任何删除操作或存档操作。复制的映像和存储库在不再使用时可以将其删除或存档。
+ 如果要复制的图像已存档到目标，则将在目标中恢复。
+ 在源区域存档图像时，不会将其存档到复制配置指定的目标区域。
+ 存储库策略 (包括 IAM policy) 和生命周期策略不会被复制，而且除了对为其定义的存储库之外，不会产生任何影响。
+ 默认情况下不会复制存储库设置，您可以使用存储库创建模板来复制存储库设置。这些设置包括标签可变性、加密、存储库权限和生命周期策略。有关存储库创建模板的更多信息，请参阅 [用于控制在缓存拉取、推送时创建或复制操作期间创建的存储库的模板](repository-creation-templates.md)。
+ 如果在存储库上启用了标签不变性，并且复制了与现有镜像使用相同标签的镜像，则该镜像将被复制，但不包含重复的标签。这可能会形成未标记的镜像。
+ 复制映像时，如果已配置 blob 挂载，ECR 将进行检查以确保目标注册表中已存在源存储库中的所有层。如果目标注册表中已存在任何层，ECR 将装载这些层。

**注意**  
如果源注册表与其目标注册表不同，则需要为两个注册表启用 blob 挂载，ECR 才能挂载复制的层。

# Amazon ECR 的私有映像复制示例
<a name="registry-settings-examples"></a>

以下各示例演示了私有映像复制的常见应用场景。如果您使用配置复制 AWS CLI，则可以在创建 JSON 文件时使用 JSON 示例作为起点。如果您使用 AWS 管理控制台配置复制，则在**查看并提交**页面上查看复制规则时，您将看到类似的 JSON。

## 示例：配置跨区域复制到单个目标区域
<a name="registry-settings-examples-crr-single"></a>

下面显示了在单个注册表中配置跨区域复制的示例。此示例假定您的账户 ID 为 ` 111122223333`，并且您正在区域 (而不是 `us-west-2`) 中指定此复制配置。

```
{
    "rules": [
        {
            "destinations": [
                {
                    "region": "us-west-2",
                    "registryId": "111122223333"
                }
            ]
        }
    ]
}
```

## 示例：使用存储库筛选条件配置跨区域复制
<a name="registry-settings-examples-crr-filter"></a>

下面显示了为与前缀名称值匹配的存储库配置跨区域复制的示例。此示例假定您的账户 ID 为` 111122223333`，您正在区域 (而不是 `us-west-1`) 中指定此复制配置，并且具有前缀为 `prod` 的存储库。

```
{
	"rules": [{
		"destinations": [{
			"region": "us-west-1",
			"registryId": "111122223333"
		}],
		"repositoryFilters": [{
			"filter": "prod",
			"filterType": "PREFIX_MATCH"
		}]
	}]
}
```

## 示例：配置跨区域复制到多个目标区域
<a name="registry-settings-examples-crr-multipledestinations"></a>

下面显示了在单个注册表中配置跨区域复制的示例。此示例假设您的账户 ID 为，` 111122223333`并且您在`us-west-1`或以外的区域中指定此复制配置`us-west-2`。

```
{
    "rules": [
        {
            "destinations": [
                {
                    "region": "us-west-1",
                    "registryId": "111122223333"
                },
                {
                    "region": "us-west-2",
                    "registryId": "111122223333"
                }
            ]
        }
    ]
}
```

## 示例：配置跨账户复制
<a name="registry-settings-examples-crossaccount"></a>

下面显示了为注册表配置跨账户复制的示例。此示例将配置复制到 `444455556666` 账户和 `us-west-2` 区域。

**重要**  
要进行跨账户复制，目标账户必须配置注册表权限策略，以允许进行复制。有关更多信息，请参阅 [Amazon ECR 中的私有注册表权限](registry-permissions.md)。

```
{
    "rules": [
        {
            "destinations": [
                {
                    "region": "us-west-2",
                    "registryId": "444455556666"
                }
            ]
        }
    ]
}
```

## 示例：在配置中指定多个规则
<a name="registry-settings-examples-multiple-rules"></a>

以下显示了配置注册表的多个复制规则的示例。此示例配置 * 111122223333* 账户的复制，其具备一个规则，即将前缀为 `prod` 的存储库复制到 `us-west-2` 区域，并将前缀为 `test` 的存储库复制到 `us-east-2` 区域。复制配置最多可以包含 10 个规则，每个规则最多指定 25 个目标。

```
{
	"rules": [{
			"destinations": [{
				"region": "us-west-2",
				"registryId": "111122223333"
			}],
			"repositoryFilters": [{
				"filter": "prod",
				"filterType": "PREFIX_MATCH"
			}]
		},
		{
			"destinations": [{
				"region": "us-east-2",
				"registryId": "111122223333"
			}],
			"repositoryFilters": [{
				"filter": "test",
				"filterType": "PREFIX_MATCH"
			}]
		}
	]
}
```

## 示例：移除所有复制设置
<a name="registry-settings-examples-remove"></a>

下面显示了从注册表中移除所有复制设置的示例。要移除复制设置，必须配置一个空的规则数组。

```
{
    "rules": []
}
```

**重要**  
移除复制设置不会删除任何以前复制的存储库或映像。如果不再需要复制的内容，则必须手动将其删除。

# 在 Amazon ECR 中配置私有映像复制
<a name="registry-settings-configure"></a>

为您的私有注册表配置每个区域的复制。您可以配置跨区域复制或跨账户复制。

有关常用复制的示例，请参阅 [Amazon ECR 的私有映像复制示例](registry-settings-examples.md)。

## 配置注册表复制设置 (AWS 管理控制台)
<a name="registry-settings-configure-console"></a>

1. 在[https://console.aws.amazon.com/ecr/存储库](https://console.aws.amazon.com/ecr/repositories)中打开 Amazon ECR 控制台。

1. 从导航栏中，选择要配置注册表复制设置的区域。

1. 在导航窗格中，选择**私有注册表**。

1. 在 “**私有注册表**” 页面上，选择 “**设置”**，然后选择 “**复制配置****” 下的 “编辑”**。

1. 在**复制**页面上，选择**添加复制规则**。

1. 在**目标类型**页面上，选择是启用跨区域复制、跨账户复制还是两者，然后选择**下一步**。

1. 如果启用了跨区域复制，则在**配置目标区域**中，选择一个或多个**目标区域**，然后选择**下一步**。

1. 如果启用了跨账户复制，则在**跨账户复制**中，选择注册表的跨账户复制设置。对于**目标帐户**，输入目标账户的账户 ID 以及复制到其中的一个或多个**目标区域**。选择**目标账户 \$1** 以将其他账户配置为复制目标。
**重要**  
要进行跨账户复制，目标账户必须配置注册表权限策略，以允许执行复制。有关更多信息，请参阅 [Amazon ECR 中的私有注册表权限](registry-permissions.md)。

1. (可选) 在**添加筛选条件**页面上，为复制规则指定一个或多个筛选条件，然后选择**添加**。对要与复制操作相关联的每个筛选条件重复此步骤。必须将筛选条件指定为存储库名称前缀。如果未添加筛选条件，则复制所有存储库的内容。添加所有筛选条件后，选择**下一步**。

1. 在存储库的**审核和提交**页面上，查看复制规则配置，然后选择**提交规则**。

## 配置注册表复制设置 (AWS CLI)
<a name="registry-settings-configure-cli"></a>

1. 创建包含要为注册表定义的复制规则的 JSON 文件。复制配置最多可以包含 10 个规则，所有规则最多包含 25 个唯一目标，每个规则最多包含 100 个筛选条件。要在自己的账户中配置跨区域复制，请指定自己的账户 ID。有关更多示例，请参阅[Amazon ECR 的私有映像复制示例](registry-settings-examples.md)。

   ```
   {
   	"rules": [{
   		"destinations": [{
   			"region": "destination_region",
   			"registryId": "destination_accountId"
   		}],
   		"repositoryFilters": [{
   			"filter": "repository_prefix_name",
   			"filterType": "PREFIX_MATCH"
   		}]
   	}]
   }
   ```

1. 创建注册表的复制配置。

   ```
   aws ecr put-replication-configuration \
        --replication-configuration file://replication-settings.json \
        --region us-west-2
   ```

1. 确认您的注册表设置。

   ```
   aws ecr describe-registry \
        --region us-west-2
   ```

# 移除 Amazon ECR 中的私有映像复制设置
<a name="registry-settings-remove"></a>

要移除或禁用私有注册表的复制设置，您需要配置一个空的复制配置。 AWS CLI中没有专用的移除命令。

## 要移除注册表复制设置 (AWS 管理控制台)
<a name="registry-settings-remove-console"></a>

1. 在[https://console.aws.amazon.com/ecr/存储库](https://console.aws.amazon.com/ecr/repositories)中打开 Amazon ECR 控制台。

1. 从导航栏中，选择要移除注册表复制设置的区域。

1. 在导航窗格中，选择**私有注册表**。

1. 在 “**私有注册表**” 页面上，选择 “**设置”**，然后选择 “**复制配置****” 下的 “编辑”**。

1. 通过为每个规则选择删除选项来移除所有现有的复制规则。

1. 选择**保存**以应用空的复制配置。

## 要移除注册表复制设置 (AWS CLI)
<a name="registry-settings-remove-cli"></a>

1. 创建包含空规则数组的 JSON 文件以删除所有复制设置。

   ```
   {
       "rules": []
   }
   ```

1. 将空的复制配置应用于您的注册表。

   ```
   aws ecr put-replication-configuration \
        --replication-configuration file://empty-replication-settings.json \
        --region us-west-2
   ```

1. 确认复制设置已移除。

   ```
   aws ecr describe-registry \
        --region us-west-2
   ```

   输出应显示没有规则的空 `replicationConfiguration`。

**重要**  
移除复制设置不会删除任何以前复制的存储库或映像。如果不再需要复制的内容，则必须手动将其删除。