

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

# Amazon ECR 介面 VPC 端點 (AWS PrivateLink)
<a name="vpc-endpoints"></a>

您可以將 Amazon ECR 設定為使用介面 VPC 端點，進而提升 VPC 的安全狀態。VPC 端點採用 AWS PrivateLink，這項技術可讓您透過私有 IP 地址 (IPv4 和 IPv6) 私密存取 Amazon ECR APIs。 AWS PrivateLink 會將 VPC 和 Amazon ECR 之間的所有網路流量限制在 Amazon 網路。您不需要網際網路閘道、NAT 裝置或虛擬私有閘道。

如需 AWS PrivateLink 和 VPC 端點的詳細資訊，請參閱《*Amazon* [VPC 使用者指南》中的 VPC 端點](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints.html)。

## Amazon ECR VPC 端點的考量事項
<a name="ecr-vpc-endpoint-considerations"></a>

在您設定 Amazon ECR 的 VPC 端點之前，請注意以下幾點考量。
+ 若要允許 Amazon EC2 執行個體上託管的 Amazon ECS 任務從 Amazon ECR 提取私有映像，請建立 Amazon ECS 的介面 VPC 端點。如需詳細資訊，請參閱《Amazon Elastic Container Service 開發人員指南》** 中的[介面 VPC 端點 (AWS PrivateLink)](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/vpc-endpoints.html)。
+ Fargate 上託管的從 Amazon ECR 提取容器映像的 Amazon ECS 任務可以透過向任務的任務執行 IAM 角色新增條件索引鍵來限制對其任務使用的特定 VPC 和服務使用的 VPC 端點的存取。如需詳細資訊，請參閱《Amazon Elastic Container Service 開發人員指南》**中的[透過介面端點提取 Amazon ECR 映像的 Fargate 任務的可選 IAM 許可](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_execution_IAM_role.html)。
+ 連接到 VPC 端點的安全群組，必須允許從 VPC 的私有子網路，透過 443 埠傳入的連線。
+ Amazon ECR VPC 端點支援雙堆疊 (IPv4 和 IPv6) 連線。當您建立雙堆疊 VPC 端點時，它可以處理透過 IPv4 和 IPv6 私有 IP 地址的流量。
+ VPC 端點透過美國東部 （維吉尼亞北部） 的 AWS API SDK 端點支援 Amazon ECR Public 儲存庫。
+ VPC 端點僅支援透過 Amazon Route 53 AWS 提供的 DNS。如果您想要使用自己的 DNS，您可以使用條件式 DNS 轉送。如需詳細資訊，請參閱《Amazon VPC 使用者指南》**中的 [DHCP 選項集](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html)。
+ 如果您的容器有現有的 Amazon S3 連線，則在您新增 Amazon S3 閘道端點時，其連線可能會短暫中斷。如果您想避免發生中斷情況，請建立採用 Amazon S3 閘道端點的​新 VPC，然後將 Amazon ECS 叢集及其容器遷移至新的 VPC​。
+ 第一次使用提取快取規則提取映像時，如果您已使用 AWS PrivateLink 將 Amazon ECR 設定為使用介面 VPC 端點，那麼您需要在同一個 VPC 中使用 NAT 閘道建立公有子網路，然後將所有傳出流量從其私有子網路路由到 NAT 閘道，以便提取至工作。隨後的映像提取不需要這樣做。如需詳細資訊，請參閱《Amazon Virtual Private Cloud 使用者指南》**中的[案例：從私有子網路存取網際網路](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html#public-nat-internet-access)。
+ 對於需要 FIPS 140-3 驗證密碼編譯模組的工作負載，Amazon ECR 支援 VPC 端點的 FIPS 端點。

### Windows 映像的考量
<a name="ecr-vpc-endpoint-windows-considerations"></a>

基於 Windows 作業系統的映像包括受授權限制無法分配的成品。預設情況下，當您將 Windows 映像推送到 Amazon ECR 儲存庫時，不推送包含這些成品的層，因為它們被視為*外來層*。當成品由 Microsoft 提供時，外部層將從 Microsoft Azure 基礎設施中擷取。因此，為了讓您的容器能夠從 Azure 中提取這些外部層，除了建立 VPC 端點之外，還需要其他步驟。

當使用 Docker 常駐程式中的 `--allow-nondistributable-artifacts` 標誌將 Windows 映像推送到 Amazon ECR 時，可以覆寫此行為。啟用後，此標誌將把授權層推送到 Amazon ECR，這樣就可以透過 VPC 端點從 Amazon ECR 中提取這些映像，而無需額外存取 Azure。

**重要**  
使用 `--allow-nondistributable-artifacts` 標誌並不排除您遵守 Windows 容器基礎映像授權條款的義務；您不能發佈 Windows 內容以進行公有或第三方重新分佈。允許在您自己的環境中使用。

若要在 Docker 安裝中啟用此標誌，您必須修改 Docker 常駐程式組態檔案，其根據 Docker 的安裝情況，通常可以在 **Docker Engine** (Docker 引擎) 區段下的設定或偏好設定選單中設定，也可以直接編輯 `C:\ProgramData\docker\config\daemon.json` 檔案。

以下為所需組態的範例。將該值替換為要將映像推送到的儲存庫 URI。

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

修改 Docker 常駐程式組態檔案後，在嘗試推送映像之前，必須重新啟動 Docker 常駐程式。透過驗證基本層是否已推送到儲存庫來確認推送是否有效。

**注意**  
Windows 映像的基本圖很大。層大小將導致較長的推送時間以及 Amazon ECR 中這些映像的額外存放成本。基於這些原因，我們建議僅在嚴格要求減少建置時間和持續儲存成本時使用此選項。例如，`mcr.microsoft.com/windows/servercore` 映像在 Amazon ECR 中壓縮時大約為 1.7 GiB。

## 為 Amazon ECR 建立 VPC 端點
<a name="ecr-setting-up-vpc-create"></a>

若要為 Amazon ECR 服務建立 VPC 端點，請使用《Amazon VPC 使用者指南》**中的 [Creating an Interface Endpoint](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-interface.html#create-interface-endpoint) (建立介面端點) 程序。

Amazon ECR VPC 端點支援雙堆疊 (IPv4 和 IPv6) 連線。當您建立雙堆疊 VPC 端點時，它會自動處理透過 IPv4 和 IPv6 私有 IP 地址的流量。端點會根據用戶端的網路組態和端點的功能，使用適當的 IP 版本路由流量。

如果您有現有的IPv4-only VPC 端點，並想要遷移至雙堆疊端點，您可以修改現有的端點以支援雙堆疊連線，或建立新的雙堆疊端點。建立或修改端點時，請確定您的 VPC 和子網路支援您要使用的 IP 版本。建立雙堆疊端點之後，端點將同時支援 IPv4 和 IPv6。

在 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 任務只需要 **com.amazonaws.{{region}}.ecr.dkr** Amazon ECR VPC 端點和 Amazon S3 閘道端點。

**注意**  
建立端點的順序並不重要。

**com.amazonaws.{{region}}.ecr.dkr**  
此端點用於 Docker 登錄檔 API。Docker 用戶端命令 (例如 `push` 和 `pull`) 會使用此端點。  
當您建立此端點時，需確實啟用私有 DNS 主機名稱。若要執行此操作，請務必在建立 VPC 端點時，選取 Amazon VPC 主控台中的 **Enable Private DNS Name** (啟用私有 DNS 名稱) 選項。  
對於符合 FIPS 140-3 的連線，請使用 FIPS 端點名稱 **com.amazonaws.{{region}}.ecr-fips.dkr**

**com.amazonaws.{{region}}.ecr.api**  
指定的{{區域}}代表 Amazon ECR 支援的 AWS 區域的區域識別符，例如`us-east-2`美國東部 （俄亥俄） 區域。
對於符合 FIPS 140-3 的連線，請使用 FIPS 端點名稱：**com.amazonaws.{{region}}.ecr-fips.dkr** 和 **com.amazonaws.{{region}}.ecr-fips.api**。  
此端點用於呼叫 Amazon ECR API。`DescribeImages` 和 `CreateRepository` 等 API 動作會移至此端點。  
建立此端點時，您可以選擇啟用私有 DNS 主機名稱。當您建立 VPC 端點時，在 VPC 主控台中選取 **Enable Private DNS Name (啟用私有 DNS 名稱)** 來啟用此設計。如果您為 VPC 端點啟用私有 DNS 主機名稱，請將 SDK 或 更新 AWS CLI 為最新版本，以便在使用 SDK 或 AWS CLI 時不需要指定端點 URL。  
對於符合 FIPS 140-3 的連線，請使用 FIPS 端點名稱 **com.amazonaws.{{region}}.ecr-fips.api**。  
如果您啟用私有 DNS 主機名稱，並使用 2019 年 1 月 24 日之前發行的 SDK 或 AWS 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
```
對於 FIPS 140-3 相容連線，請使用 FIPS 端點 URL：  

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

## 建立 Amazon S3 閘道端點
<a name="ecr-setting-up-s3-gateway"></a>

若要讓您的 Amazon ECS 任務從 Amazon ECR 提取私有映像，您必須為所有 Amazon S3 建立閘道端點。閘道端點是必要的，因為 Amazon ECR 使用 Amazon S3 來存放映像分層。容器從 Amazon ECR 下載映像時，必須存取 Amazon ECR 以取得​映像資訊清單，並透過 Amazon S3 下載實際映像層。以下是 Amazon S3 ​儲存貯體的 Amazon Resource Name (ARN)，該儲存貯體包含每個 Docker 映像的分層。

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

**注意**  
如果為 Amazon ECR 建立雙堆疊 VPC 端點，則您也需要建立雙堆疊 Amazon S3 Gateway 或介面端點。如需詳細資訊，請參閱 [S3 文件](https://docs.aws.amazon.com/AmazonS3/latest/userguide/privatelink-interface-endpoints.html#privatelink-ip-address-types)。

使用《Amazon VPC 使用者指南》**中的 [Creating a gateway endpoint](https://docs.aws.amazon.com/vpc/latest/userguide/vpce-gateway.html#create-gateway-endpoint) (建立閘道端點) 操作程序為 Amazon ECR 建立以下 Amazon S3 閘道端點。建立端點時，請務必為您的 VPC 選取路由表。

**com.amazonaws.{{region}}.s3**  
Amazon S3 閘道端點會使用 IAM 政策文件來限制服務的存取權限。您可以使用 **Full Access** (完整存取) 政策，​因為系統會以此政策為基礎，繼續套用您對任務 IAM 角色或其他 IAM 使用者政策的限制。如果您想將 ​Amazon S3 儲存貯體存取權限限制為使用 Amazon ECR 所需的​最低許可，請參閱 [Amazon ECR 的最低 Amazon S3 儲存貯體許可](#ecr-minimum-s3-perms)。

### Amazon ECR 的最低 Amazon S3 儲存貯體許可
<a name="ecr-minimum-s3-perms"></a>

Amazon S3 閘道端點會使用 IAM 政策文件來限制服務的存取權限。若要僅允許 Amazon ECR 的最低 Amazon S3 儲存貯體許可，請限制對 Amazon ECR 在為端點建立 IAM 政策文件時使用的 Amazon S3 儲存貯體的存取。

下表會說明 Amazon ECR 所需的​ Amazon S3 儲存貯體政策許可。


| 權限 | Description | 
| --- | --- | 
| `arn:aws:s3:::prod-{{region}}-starport-layer-bucket/*` | 提供對包含每個 Docker 映像分層之 Amazon S3 儲存貯體的存取權限。表示 Amazon ECR 支援的 AWS 區域的區域識別符，例如美國東部 (俄亥俄) 區域的 `us-east-2`。 | 

#### 範例
<a name="ecr-minimum-s3-perms-example"></a>

下方範例會說明如何提供 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 端點
<a name="ecr-setting-up-cloudwatch-logs"></a>

使用 Fargate 啟動類型的 Amazon ECS 任務 (使用 VPC 而不使用網際網路閘道，也使用 `awslogs` 記錄驅動程序向 CloudWatch Logs 傳送記錄資訊) 需要為 CloudWatch Logs 建立 **com.amazonaws.{{region}}.logs** 介面 VPC 端點。如需詳細資訊，請參閱《Amazon CloudWatch Logs 使用者指南》**中的 [CloudWatch Logs 搭配介面 VPC 端點一起使用](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch-logs-and-interface-VPC.html)。

## 為您的 Amazon ECR VPC 端點建立端點政策
<a name="ecr-vpc-endpoint-policy"></a>

當您建立或修改端點時，VPC 端點政策是您連接至端點的 IAM 資源政策。如果您在建立端點時未連接政策， 會為您 AWS 連接允許完整存取服務的預設政策。端點政策不會覆寫或取代使用者政策或服務特定的政策。這個另行區分的政策會控制從端點到所指定之服務的存取。端點政策必須以 JSON 格式撰寫。如需詳細資訊，請參閱《Amazon VPC 使用者指南》**中的[使用 VPC 端點控制服務的存取](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-endpoints-access.html)。

我們建議建立單一 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. 在 [https://console.aws.amazon.com/vpc/](https://console.aws.amazon.com/vpc/) 開啟 Amazon VPC 主控台。

1. 在導覽窗格中選擇 **Endpoints (端點)**。

1. 如果您尚未建立 Amazon ECR 的 VPC 端點，請參閱 [為 Amazon ECR 建立 VPC 端點](#ecr-setting-up-vpc-create)。

1. 選取要新增政策的 Amazon ECR VPC 端點，然後選擇畫面下半部的 **Policy** (政策) 索引標籤。

1. 選擇 **Edit Policy (編輯政策)**，並對政策做出變更。

1. 選擇 **Save (儲存)** 以儲存政策。

## 共用子網路
<a name="ecr-vpc-endpoint-shared-subnets"></a>

無法在與您共用的子網路中建立、描述、修改或刪除 VPC 端點。不過，可以在與您共用的子網路中使用 VPC 端點。