

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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`未授予）
+ 檢閱 CloudTrail 日誌是否有失敗`CreateRepository`或 `ReplicateImage` API 呼叫

## 私有映像複寫的考量
<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 政策和生命週期政策) 不會進行複寫，除了它們定義的儲存庫外，也不會有任何影響。
+ 預設不會複寫儲存庫設定，您可以使用儲存庫建立範本複寫儲存庫設定。這些設定包括標籤可變性、加密、儲存庫許可和生命週期政策。如需儲存庫建立範本的詳細資訊，請參閱 [用於控制提取快取、推送時建立或複寫動作期間建立的儲存庫的範本](repository-creation-templates.md)。
+ 如果在儲存庫上啟用標籤不變性，而且複寫使用與現有映像相同標籤的映像，則會複寫映像，但不會包含重複的標籤。這可能導致映像未標籤。
+ 複寫映像時，如果已設定 Blob 掛載，ECR 將檢查以確保來源儲存庫中的任何層已存在於目的地登錄檔中。如果目的地登錄檔中已存在任何圖層，ECR 會掛載這些圖層。

**注意**  
如果來源登錄檔與其目的地登錄檔不同，則需要為 ECR 的兩個登錄檔啟用 Blob 掛載，以掛載複寫層。

# 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/repositories](https://console.aws.amazon.com/ecr/repositories) 開啟 Amazon ECR 主控台。

1. 從導覽列，選擇要為其設定登錄檔複寫設定的區域。

1. 在導覽窗格中，選擇 **Private registry** (私有登錄檔)。

1. 在**私有登錄**頁面上，選擇**設定**，然後選擇**複寫組態**下的**編輯**。

1. 在 **Replication** (複寫) 頁面上，選擇 **Add replication rule** (新增複寫規則)。

1. 在 **Destination types** (目的地類型) 頁面上，選擇要啟用跨區域複寫、跨帳戶複寫或兩者，然後選擇 **Next** (下一步)。

1. 如果啟用跨區域複寫，則對於 **Configure destination regions** (設定目的地區域)，選擇一或多個 **Destination regions** (目的地區域)，然後選擇 **Next** (下一步)。

1. 如果啟用跨帳戶複寫，則對於 **Cross-account replication** (跨帳戶複寫)，選擇登錄檔的跨帳戶複寫設定。對於 **Destination account** (目的地帳戶)，輸入目的地帳戶的帳戶 ID 和一或多個 **Destination regions** (目的地區域) 以進行複寫。選擇 **Destination account \$1** (目的地帳戶 \$1)，將其他帳戶設定為複寫目的地。
**重要**  
若要進行跨帳戶複寫，目的地帳戶必須設定登錄檔許可政策，以允許複寫發生。如需詳細資訊，請參閱[Amazon ECR 中的私有登錄檔許可](registry-permissions.md)。

1. (選用) 在 **Add filters** (新增篩選條件) 頁面上，指定複寫規則的一或多個篩選條件，然後選擇 **Add** (新增)。對於您要與複寫動作產生關聯的每個篩選條件重複此步驟。必須將篩選器指定為儲存庫名稱字首。如果未新增篩選器，則會複寫所有儲存庫的內容。一旦新增所有篩選條件，選擇 **Next** (下一步)。

1. 在 **Review and submit** (檢閱並提交) 頁面上，檢閱複寫規則組態，然後選擇 **Submit rule** (提交規則)。

## 設定登錄檔複寫設定 (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/repositories](https://console.aws.amazon.com/ecr/repositories) 開啟 Amazon ECR 主控台。

1. 從導覽列中，選擇要從中移除登錄檔複寫設定的區域。

1. 在導覽窗格中，選擇 **Private registry** (私有登錄檔)。

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`且沒有規則。

**重要**  
移除複寫設定不會刪除任何先前複寫的儲存庫或映像。如果不再需要複寫的內容，您必須手動刪除。