

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

# 架構您的 Amazon ECS 應用程式
<a name="application_architecture"></a>

您可以透過為應用程式建立任務定義來架構自己的應用程式。任務定義包含用於定義應用程式相關資訊的參數，包括：
+ 所要使用的容量，會決定託管任務的基礎結構。

  在使用 EC2 容量提供者時，您也需選擇執行個體類型。在使用 Amazon ECS 受管執行個體容量提供者時，您可為 Amazon ECS 提供執行個體需求來管理運算容量。對於部分執行個體類型 (例如 GPU)，您需要設定特定參數。如需詳細資訊，請參閱[Amazon ECS 任務定義使用案例](use-cases.md)。
+ 容器映像，會包含應用程式程式碼，以及應用程式程式碼執行所需的所有相依性。
+ 任務中容器所要使用的聯網模式。

  聯網模式決定了任務如何透過網路進行通訊。

  對於在 EC2 執行個體與 Amazon ECS 受管執行個體上執行的任務，雖有多種選項可供選擇，但建議使用 `awsvpc` 網路模式。`awsvpc` 網路模式可簡化容器聯網設定，賦予您更高的控制權來控管應用程式彼此之間以及應用程式與 VPC 內其他服務之間的通訊方式。

  對於在 Fargate 上執行的任務，必須使用 `awsvpc` 網路模式。
+ 任務所要使用的記錄組態。
+ 任務中容器所使用的任何資料磁碟區。

如需有關任務定義參數的完整清單，請參閱 [Fargate 的 Amazon ECS 任務定義參數](task_definition_parameters.md)。

建立任務定義時，請遵循下列準則：
+ 將每個任務定義系列僅用於一個業務目的。

  如果您將多種類型的應用程式容器分組在相同的任務定義中，則無法獨立擴展這些容器。例如，網站與 API 通常需要不同的擴展模式。隨著流量增加，所需的 Web 容器數量可能與 API 容器不同。如果這兩個容器部署在相同的任務定義中，則每個任務都會執行相同數量的 Web 容器與 API 容器。
+ 將每個應用程式版本與任務定義系列中的任務定義修訂版進行比對。

  在任務定義系列中，每個任務定義修訂版皆代表特定容器映像設定的時間點快照。這類似於容器是執行特定版本應用程式程式碼所需所有元件的快照。

  建立應用程式程式碼版本、容器映像標籤與任務定義修訂版之間的一對一映射關係。典型的發佈過程涉及 git commit，該提交會轉換為使用 git commit SHA 標記的容器映像。然後，該容器映像標籤會取得自己的 Amazon ECS 任務定義修訂版。最後，更新 Amazon ECS 服務以部署這個新的任務定義修訂版。
+ 針對每個任務定義系列使用不同的 IAM 角色。

  使用自己的 IAM 角色定義每個任務定義。除了實作此實務，還需為每個業務元件提供專屬的任務定義系列。透過實作這兩個最佳實務，您可以限制每個服務對您 AWS 帳戶中資源的存取量。例如，您可以授予身分驗證服務存取權限以連線到您的密碼資料庫。同時，您還可以確保只有您的訂單服務才能存取信用卡付款資訊。

# Amazon ECS 任務大小的最佳實務
<a name="capacity-tasksize"></a>

 容器與任務大小對於擴展與容量規劃都至關重要。在 Amazon ECS 中，CPU 與記憶體是用於容量的兩個資源指標。CPU 以完整 vCPU 的 1/1024 為單位進行計量 (其中 1024 個單位等於 1 個完整 vCPU)。記憶體以 MiB 為單位進行計量。在任務定義中，您可以設定資源保留量與限制。

設定保留量時，您要設定任務所需的資源數量下限。任務至少會收到請求的資源量。應用程式實際使用的 CPU 或記憶體，可能會超出設定的保留量。但這受您同時設定的所有限制的約束。使用超過保留數量稱為爆量。在 Amazon ECS 中，保留量會得到保證。例如，若使用 Amazon EC2 執行個體提供容量，當無法滿足保留需求時，Amazon ECS 不會將該任務置放於該執行個體上。

限制是容器或任務所能使用的 CPU 單位或記憶體的最大數量。任何嘗試使用超過此限制之 CPU 的行為，都會導致限流。任何嘗試使用更多記憶體的行為，都會導致容器停止。

精準選擇這些值可能具有挑戰性。這是因為最適合應用程式的值，在很大程度上取決於應用程式的資源需求。對應用程式進行負載測試，是成功規劃資源需求以及更清楚地了解應用程式需求的關鍵。

## 無狀態應用程式
<a name="capacity-tasksize-stateless"></a>

對於可水平擴展的無狀態應用程式 (如負載平衡器後端的應用程式)，建議先決定應用程式在處理請求時所耗用的記憶體量。若要做到這一點，您可以使用 `ps` 或 `top` 等傳統工具，也可以使用 CloudWatch Container Insights 這類監控解決方案。

在決定 CPU 保留量時，需考量如何擴展應用程式來滿足業務需求。您可以使用較小的 CPU 保留量，例如 256 個 CPU 單位 (或 1/4 vCPU)，以將成本降至最低的精細方式橫向擴充。但它們的擴展速度可能不足以應對需求的大幅激增。您可以使用較大的 CPU 保留量，更快速地進行縮減與橫向擴充，從而更快匹配需求激增。但較大的 CPU 保留量會帶來更高的成本。

## 其他應用程式
<a name="capacity-tasksize-other"></a>

對於無法水平擴展的應用程式 (例如單例工作線程或資料庫伺服器)，可用容量與成本是最重要的考量因素。您應根據負載測試的結果選擇記憶體與 CPU 的配置量，確保能應對流量並達成服務水準目標。Amazon ECS 可確保應用程式置放在具有足夠容量的主機上。

# Amazon ECS 受管執行個體的 Amazon ECS 任務聯網
<a name="managed-instance-networking"></a>

在 Amazon ECS 受管執行個體上執行之 Amazon ECS 任務的聯網行為，由任務定義中指定的*網路模式*決定。您必須在任務定義中指定網路模式。若使用未指定網路模式的任務定義，將無法在 Amazon ECS 受管執行個體上執行任務。Amazon ECS 受管執行個體支援以下聯網模式，可確保從 Fargate 或 Amazon EC2 上的 Amazon ECS 遷移工作負載時具備向後相容性：


| 網路模式 | Description | 
| --- | --- | 
|  `awsvpc`  |  每項任務皆會取得專屬的彈性網路介面 (ENI) 與私有 IPv4 位址。這能提供與 Amazon EC2 執行個體相同的聯網屬性，且與傳統 Fargate 任務相容。此模式透過 ENI 主幹功能實現高任務密度。  | 
|  `host`  |  任務會直接共用主機的網路命名空間。容器聯網與底層主機執行個體緊密綁定。  | 

## 在純 IPv6 模式下使用 VPC
<a name="managed-instances-networking-ipv6-only"></a>

在純 IPv6 組態中，Amazon ECS 任務只會透過 IPv6 進行通訊。若要為純 IPv6 組態設定 VPC 與子網路，您必須將 IPv6 CIDR 區塊新增至 VPC，並建立僅包含 IPv6 CIDR 區塊的子網路。如需詳細資訊，請參閱 *Amazon VPC User Guide* 中的 [Add IPv6 support for your VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-migrate-ipv6-add.html) 與 [Create a subnet](https://docs.aws.amazon.com/vpc/latest/userguide/create-subnets.html)。您還必須更新路由表，加入 IPv6 目標，並在安全群組中設定 IPv6 規則。如需詳細資訊，請參閱 *Amazon VPC User Guide* 中的 [Configure route tables](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html) 與 [Configure security group rules](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-security-group-rules.html)。

適用下列注意事項：
+ 您可透過以下兩種方式，將純 IPv4 或雙堆疊的 Amazon ECS 服務升級為純 IPv6 組態：一是直接將服務更新為使用純 IPv6 子網路；二是建立平行的純 IPv6 服務，再透過 Amazon ECS 藍綠部署將流量遷移至新服務。如需有關 Amazon ECS 藍/綠部署的詳細資訊，請參閱 [Amazon ECS 藍/綠部署](deployment-type-blue-green.md)。
+ 純 IPv6 的 Amazon ECS 服務必須使用具 IPv6 目標群組的雙堆疊負載平衡器。若要遷移的現有 Amazon ECS 服務後端掛載了 Application Load Balancer 或 Network Load Balancer，可建立新的雙堆疊負載平衡器並將流量從舊負載平衡器遷移過去，或直接更新現有負載平衡器的 IP 位址類型。

   如需有關 Network Load Balancer 的詳細資訊，請參閱 *User Guide for Network Load Balancers* 中的 [Create a Network Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/create-network-load-balancer.html) 與 [Update the IP address types for your Network Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-ip-address-type.html)。如需有關 Application Load Balancer 的詳細資訊，請參閱 *User Guide for Application Load Balancers* 中的 [Create an Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-application-load-balancer.html) 與 [Update the IP address types for your Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-ip-address-type.html)。
+ 若要讓純 IPv6 組態中的 Amazon ECS 任務與純 IPv4 端點通訊，您可以設定 DNS64 與 NAT64，實現從 IPv6 到 IPv4 的網路位址轉換。如需更多詳細資訊，請參閱《*Amazon VPC 使用者指南*》中的「[DNS64 和 NAT64](https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-nat64-dns64.html)」。
+ 在純 IPv6 組態中，Amazon ECS 工作負載從 Amazon ECR 拉取映像時，必須使用 Amazon ECR 雙堆疊映像 URI 端點。如需詳細資訊，請參閱 *Amazon Elastic Container Registry User Guide* 中的 [Getting started with making requests over IPv6](https://docs.aws.amazon.com/AmazonECR/latest/userguide/ecr-requests.html#ipv6-access-getting-started)。
**注意**  
Amazon ECR 不支援可供純 IPv6 組態中任務使用的雙堆疊介面 VPC 端點。如需詳細資訊，請參閱 *Amazon Elastic Container Registry User Guide* 中的 [Getting started with making requests over IPv6](https://docs.aws.amazon.com/AmazonECR/latest/userguide/ecr-requests.html#ipv6-access-getting-started)。
+ 純 IPv6 組態不支援 Amazon ECS Exec。

# 為 Amazon ECS 受管執行個體上的任務配置網路介面
<a name="managed-instances-awsvpc-mode"></a>

 使用 Amazon ECS 受管執行個體中的 `awsvpc` 網路模式可簡化容器聯網設定，因為您有更高的控制權來控管應用程式彼此之間以及應用程式與 VPC 內其他服務之間的通訊方式。`awsvpc` 網路模式也讓可以您在任務中更精細地使用安全群組與網路監控工具，為您的容器提供更高的安全性。

依預設，若執行個體類型支援主幹功能，每個 Amazon ECS 受管執行個體在啟動時皆會連接一個主幹彈性網路介面 (ENI)，並將其作為主要 ENI。如需有關支援 ENI 主幹功能之執行個體類型的詳細資訊，請參閱[適用於更多 Amazon ECS 容器網路介面的支援執行個體](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/eni-trunking-supported-instance-types.html)。

**注意**  
若選擇的執行個體類型不支援中繼 ENI，該執行個體將會搭配一般 ENI 啟動。

在執行個體上執行的每項任務，皆會取得連接至中繼 ENI 的專屬 ENI，並配有一個主要私有 IP 位址。如果 VPC 已設定為雙堆疊模式，且使用的子網路帶有 IPv6 CIDR 區塊，則該 ENI 還會取得一個 IPv6 位址。使用公有子網路時，您可透過為子網路啟用 IPv4 公有定址功能，選擇是否將公有 IP 位址指派給 Amazon ECS 受管執行個體的主要 ENI。如需詳細資訊，請參閱 *Amazon VPC User Guide* 中的 [Modify the IP addressing attributes of your subnet](https://docs.aws.amazon.com//vpc/latest/userguide/subnet-public-ip.html)。任務在指定時間內只能有一個相關聯的 ENI。

 屬於同一個任務的容器也可透過 `localhost` 介面進行通訊。如需有關 VPC 與子網路的詳細資訊，請參閱 *Amazon VPC User Guide* 中的 [How Amazon VPC works](https://docs.aws.amazon.com/vpc/latest/userguide/how-it-works.html)

下列操作使用連接至執行個體的主要 ENI：
+ **映像下載** – 透過主要 ENI 從 Amazon ECR 下載容器映像。
+ **秘密擷取** – 透過主要 ENI 擷取 Secrets Manager 秘密與其他憑證。
+ **日誌上傳** – 日誌透過主要 ENI 上傳至 CloudWatch。
+ **環境檔案下載** – 環境檔案透過主要 ENI 下載。

應用程式流量會流經任務 ENI。

因為每項任務都會取得自己的 ENI，所以您可以利用聯網功能，例如 VPC 流程日誌，以便您監控任務的進出流量。如需詳細資訊，請參閱「Amazon VPC 使用者指南」**中的 [VPC 流程日誌](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html)。

您也可以利用 AWS PrivateLink。您可以設定 VPC 介面端點，以便透過私有 IP 地址存取 Amazon ECS API。 AWS PrivateLink 會將您 VPC 與 Amazon ECS 之間的所有網路流量限制於 Amazon 網路中。您不需要網際網路閘道、NAT 裝置或虛擬私有閘道。如需詳細資訊，請參閱 [Amazon ECS 介面 VPC 端點 (AWS PrivateLink)](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/vpc-endpoints.html)。

`awsvpc` 網路模式也可讓您在使用未連接中繼 ENIs 的執行個體類型時，利用 Amazon VPC 流量鏡射進行安全性和網路流量監控。如需詳細資訊，請參閱 *Amazon VPC Traffic Mirroring Guide* 中的 [What is Traffic Mirroring?](https://docs.aws.amazon.com/vpc/latest/mirroring/what-is-traffic-mirroring.html)。

## `awsvpc` 模式考量
<a name="managed-instances-awsvpc-considerations"></a>
+ 任務需要 Amazon ECS 服務連結角色，才能進行 ENI 管理。此角色會在您建立叢集或服務時自動建立。
+ 任務 ENI 由 Amazon ECS 管理，無法手動卸離或修改。
+ 不支援在執行獨立任務 (`RunTask`) 或建立/更新服務 (`CreateService`/`UpdateService`) 時，使用 `assignPublicIp` 將公有 IP 位址指派給任務 ENI。
+ 在任務層級設定 `awsvpc` 聯網時，必須使用在 Amazon ECS 受管執行個體容量提供者啟動範本中指定的相同 VPC。您可以使用與啟動範本中指定之子網路和安全群組不同的子網路與安全群組。
+ 對於 `awsvpc` 網路模式任務，請在設定負載平衡器目標群組時使用 `ip` 目標類型。Amazon ECS 會針對支援的聯網模式，自動管理目標群組註冊。

## 在雙堆疊模式下使用 VPC
<a name="managed-instance-networking-vpc-dual-stack"></a>

在雙堆疊模式中使用 VPC 時，任務可透過 IPv4 或 IPv6 或兩者進行通訊。IPv4 與 IPv6 位址彼此獨立。因此，您必須在 VPC 中為 IPv4 與 IPv6 分別配置路由與安全設定。如需如何將 VPC 設定為雙堆疊模式的詳細資訊，請參閱《Amazon VPC 使用者指南》中的[遷移至 IPv6](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-migrate-ipv6.html)。

如果您為 VPC 設定網際網路閘道或傳出限定網際網路閘道，則可以在雙堆疊模式下使用 VPC。藉此，指派 IPv6 位址的工作就能透過網際網路閘道或僅限出口的網際網路閘道存取網際網路。NAT 閘道是選用。如需詳細資訊，請參閱 *《Amazon VPC 使用者指南》* 中的[網際網路閘道](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html)和[輸出限定網際網路閘道](https://docs.aws.amazon.com/vpc/latest/userguide/egress-only-internet-gateway.html)。

如果符合下列條件，將會為 Amazon ECS 任務指派 IPv6 地址：
+ Amazon ECS 受管執行個體託管的任務正在使用版本 `1.45.0` 或更新版本的容器代理程式。如需如何檢查執行個體使用之代理程式版本以及視需要進行更新的相關資訊，請參閱 [更新 Amazon ECS 容器代理程式](ecs-agent-update.md)。
+ 此 `dualStackIPv6` 帳戶設定已啟用。如需詳細資訊，請參閱[透過帳戶設定使用 Amazon ECS 功能](ecs-account-settings.md)。
+ 您的任務是使用 `awsvpc` 網路模式。
+ 您的 VPC 與子網路已針對 IPv6 進行設定。組態包含在指定子網路中建立的網路介面。如需如何將 VPC 設定為雙堆疊模式的詳細資訊，請參閱《Amazon VPC 使用者指南》中的[遷移至 IPv6](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-migrate-ipv6.html) 和[修改您子網路的公有 IPv6 定址屬性](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-ipv6)。

# 主機網路模式
<a name="managed-instances-host-modes"></a>

在 `host` 模式下，任務會直接共用主機的網路命名空間。容器的聯網組態會與底層的 Amazon ECS 受管執行個體主機執行個體綁定，而該主機執行個體是您建立 Amazon ECS 受管執行個體容量提供者時透過 `networkConfiguration` 參數所指定。``

使用此網路模式存在重大的缺點。您不能在每台主機上執行多個任務的執行個體化。這是因為只有第一個任務可以繫結至 Amazon EC2 執行個體上所需的連接埠。使用 `host` 網路模式時，也無法重新對應容器連接埠。例如，如果應用程式需要接聽特定的連接埠號碼，則無法直接重新對應連接埠號碼。相反地，您必須透過變更應用程式組態來管理任何連接埠衝突。

使用 `host` 網路模式時也存在安全隱患。此模式允許容器模擬主機，並允許容器連線至主機上的私有迴路網路服務。

僅在需要直接存取主機聯網，或遷移需具備主機層級網路存取權的應用程式時，才使用主機模式。

# EC2 的 Amazon ECS 任務聯網選項
<a name="task-networking"></a>

在 Amazon EC2 執行個體上託管的 Amazon ECS 任務聯網行為取決於任務定義中定義的*網路模式*。建議使用 `awsvpc` 網路模式，除非您有使用不同網路模式的特定需要。

以下是可用的網路模式。


| 網路模式 | EC2 上的 Linux 容器 | EC2 上的 Windows 容器 | Description | 
| --- | --- | --- | --- | 
|  `awsvpc`  |  是  |  是  |  任務會配置專屬的彈性網路介面 (ENI) 與主要私有 IPv4 位址或 IPv6 位址。這會為任務提供與 Amazon EC2 執行個體相同的聯網屬性。  | 
|  `bridge`  |  是  |  否  |  任務會使用 Docker 的 Linux 內建虛擬網路，該虛擬網路在託管任務的每個 Amazon EC2 執行個體內執行。Linux 上的內建虛擬網路會使用 `bridge` Docker 網路驅動程式。如果未在任務定義中指定網路模式，則此為 Linux 上的預設網路模式。  | 
|  `host`  |  是  |  否  |  任務會使用主機網路，並直接將容器連接埠映射至託管任務的 Amazon EC2 執行個體 ENI，以略過 Docker 的內建虛擬網路。動態連接埠映射無法在此網路模式下使用。任務定義中使用此模式的容器必須指定特定 `hostPort` 數字。主機上的連接埠號碼無法由多個任務使用。因此，您無法在單一 Amazon EC2 執行個體上執行同一個任務定義的多個任務。  | 
|  `none`  |  是  |  否  |  任務沒有外部網路連線。  | 
|  `default`  |  否  |  是  |  任務會使用 Docker 的 Windows 內建虛擬網路，該虛擬網路在託管任務的每個 Amazon EC2 執行個體內執行。Windows 上的內建虛擬網路會使用 `nat` Docker 網路驅動程式。如果未在任務定義中指定網路模式，則此為 Windows 上的預設網路模式。  | 

如需有關 Linux 上 Docker 聯網的詳細資訊，請參閱 *Docker Documentation* 中的 [Networking overview](https://docs.docker.com/engine/network/)。

如需有關 Windows 上 Docker 聯網的詳細資訊，請參閱 Microsoft *Containers on Windows Documentation* 中的 [Windows container networking](https://learn.microsoft.com/en-us/virtualization/windowscontainers/container-networking/architecture)。

## 在純 IPv6 模式下使用 VPC
<a name="networking-ipv6-only"></a>

在純 IPv6 組態中，Amazon ECS 任務只會透過 IPv6 進行通訊。若要為純 IPv6 組態設定 VPC 與子網路，您必須將 IPv6 CIDR 區塊新增至 VPC，並建立僅包含 IPv6 CIDR 區塊的新子網路。如需詳細資訊，請參閱 *Amazon VPC User Guide* 中的 [Add IPv6 support for your VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-migrate-ipv6-add.html) 與 [Create a subnet](https://docs.aws.amazon.com/vpc/latest/userguide/create-subnets.html)。

您還必須更新路由表，加入 IPv6 目標，並在安全群組中設定 IPv6 規則。如需詳細資訊，請參閱 *Amazon VPC User Guide* 中的 [Configure route tables](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html) 與 [Configure security group rules](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-security-group-rules.html)。

適用下列注意事項：
+ 您可透過以下兩種方式，將純 IPv4 或雙堆疊的 Amazon ECS 服務升級為純 IPv6 組態：一是直接將服務更新為使用純 IPv6 子網路；二是建立平行的純 IPv6 服務，再透過 Amazon ECS 藍綠部署將流量遷移至新服務。如需有關 Amazon ECS 藍/綠部署的詳細資訊，請參閱 [Amazon ECS 藍/綠部署](deployment-type-blue-green.md)。
+ 純 IPv6 的 Amazon ECS 服務必須使用具 IPv6 目標群組的雙堆疊負載平衡器。若要遷移的現有 Amazon ECS 服務後端掛載了 Application Load Balancer 或 Network Load Balancer，可建立新的雙堆疊負載平衡器並將流量從舊負載平衡器遷移過去，或直接更新現有負載平衡器的 IP 位址類型。

  如需有關 Network Load Balancer 的詳細資訊，請參閱 *User Guide for Network Load Balancers* 中的 [Create a Network Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/create-network-load-balancer.html) 與 [Update the IP address types for your Network Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-ip-address-type.html)。如需有關 Application Load Balancer 的詳細資訊，請參閱 *User Guide for Application Load Balancers* 中的 [Create an Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-application-load-balancer.html) 與 [Update the IP address types for your Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-ip-address-type.html)。
+ Windows 不支援純 IPv6 組態。若要在純 IPv6 組態中執行任務，必須使用 Amazon ECS 最佳化 Linux AMI。如需有關 Amazon ECS 最佳化 AMI 的詳細資訊，請參閱 [Amazon ECS 最佳化 Linux AMI](ecs-optimized_AMI.md)。
+ 在啟動容器執行個體以在純 IPv6 組態中執行任務時，必須透過 `--enable-primary-ipv6` EC2 參數為該執行個體設定一個主要 IPv6 位址。
**注意**  
如果沒有主要 IPv6 位址，在容器執行個體上以主機或橋接網路模式執行的任務，將無法向負載平衡器或 AWS Cloud Map註冊。

  如需有關用於執行 Amazon EC2 執行個體的 `--enable-primary-ipv6` 的詳細資訊，請參閱 *AWS CLI Command Reference* 中的 [run-instances](https://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html)。

  如需使用 啟動容器執行個體的詳細資訊 AWS 管理主控台，請參閱 [啟動 Amazon ECS Linux 容器執行個體](launch_container_instance.md)。
+ 依預設，Amazon ECS 容器代理程式會透過偵測執行個體的預設 IPv4 與 IPv6 路由，判斷容器執行個體是否相容純 IPv6 組態。若要覆寫此行為，您可以在執行個體的 `/etc/ecs/ecs.config` 檔案中將 ` ECS_INSTANCE_IP_COMPATIBILITY` 參數設定為 `ipv4` 或 `ipv6`。
+ 任務必須使用版本 `1.99.1` 或更新版本的容器代理程式。如需有關如何檢查執行個體使用之代理程式版本以及視需要進行更新的資訊，請參閱[更新 Amazon ECS 容器代理程式](ecs-agent-update.md)。
+ 若要讓純 IPv6 組態中的 Amazon ECS 任務與純 IPv4 端點通訊，您可以設定 DNS64 與 NAT64，實現從 IPv6 到 IPv4 的網路位址轉換。如需更多詳細資訊，請參閱《*Amazon VPC 使用者指南*》中的「[DNS64 和 NAT64](https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-nat64-dns64.html)」。
+ 在純 IPv6 組態中，Amazon ECS 工作負載從 Amazon ECR 拉取映像時，必須使用 Amazon ECR 雙堆疊映像 URI 端點。如需詳細資訊，請參閱 *Amazon Elastic Container Registry User Guide* 中的 [Getting started with making requests over IPv6](https://docs.aws.amazon.com/AmazonECR/latest/userguide/ecr-requests.html#ipv6-access-getting-started)。
**注意**  
Amazon ECR 不支援可供純 IPv6 組態中任務使用的雙堆疊介面 VPC 端點。如需詳細資訊，請參閱 *Amazon Elastic Container Registry User Guide* 中的 [Getting started with making requests over IPv6](https://docs.aws.amazon.com/AmazonECR/latest/userguide/ecr-requests.html#ipv6-access-getting-started)。
+ 純 IPv6 組態不支援 Amazon ECS Exec。

### AWS 區域 支援 IPv6-only 模式
<a name="networking-ipv6-only-regions"></a>

您可以在 Amazon ECS 可用的下列 AWS 區域中，在IPv6-only 的組態中執行任務：
+ 美國東部 (俄亥俄)
+ 美國東部 (維吉尼亞北部)
+ 美國西部 (加利佛尼亞北部)
+ 美國西部 (奧勒岡)
+ 非洲 (開普敦)
+ 亞太地區 (香港)
+ 亞太區域 (海德拉巴)
+ 亞太地區 (雅加達)
+ 亞太地區 (墨爾本)
+ 亞太地區 (孟買)
+ 亞太區域 (大阪)
+ 亞太區域 (首爾)
+ 亞太區域 (新加坡)
+ 亞太地區 (雪梨)
+ 亞太區域 (東京)
+ 加拿大 (中部)
+ 加拿大西部 (卡加利)
+ 中國 (北京)
+ 中國 (寧夏)
+ 歐洲 (法蘭克福)
+ 歐洲 (倫敦)
+ 歐洲 (米蘭)
+ Europe (Paris)
+ 歐洲 (西班牙)
+ 以色列 (特拉維夫)
+ Middle East (Bahrain)
+ 中東 (阿拉伯聯合大公國)
+ 南美洲 (聖保羅)
+ AWS GovCloud （美國東部）
+ AWS GovCloud （美國西部）

# 為 Amazon ECS 任務配置網路介面
<a name="task-networking-awsvpc"></a>

`awsvpc` 網路模式提供的任務聯網功能可為 Amazon ECS 任務提供與 Amazon EC2 執行個體相同的聯網屬性。使用 `awsvpc` 網路模式可簡化容器聯網設定，因為您有更高的控制權來控管應用程式彼此之間以及應用程式與 VPC 內其他服務之間的通訊方式。`awsvpc` 網路模式也讓可以您在任務中更精細地使用安全群組與網路監控工具，為您的容器提供更高的安全性。您也可以利用其他 Amazon EC2 聯網功能，例如 VPC 流程日誌，以便您監控任務的進出流量。此外，屬於同一個任務的容器可以透過 `localhost` 界面進行通訊。

任務彈性網路介面 (ENI) 是 Amazon ECS 的全受管功能。Amazon ECS 會建立 ENI 並將其連接到具有指定安全群組的主機 Amazon EC2 執行個體。任務在 ENI 上傳送和接收網路流量的方式，與 Amazon EC2 執行個體處理其主要網路介面的方式相同。根據預設，會對每個任務 ENI 指派一個私有 IPv4 地址。如果已對雙堆疊模式啟用 VPC，並且您使用具有 IPv6 CIDR 區塊的子網路，則任務 ENI 也會收到 IPv6 地址。每個任務只能有一個 ENI。

這些 ENI 會顯示在帳戶的 Amazon EC2 主控台中。帳戶無法卸離或修改這些 ENI。這是為了防止意外刪除與正在執行之任務相關聯的 ENI。您可以在 Amazon ECS 主控台中或使用 [DescribeTasks](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTasks.html) API 操作來檢視任務的 ENI 連接資訊。當任務停止或服務縮小規模時，任務 ENI 即予以分離和刪除。

如需增加 ENI 密度，請使用 `awsvpcTrunking` 帳戶設定。Amazon ECS 也會為容器執行個體建立並連接「中繼」網路介面。幹線網路由 Amazon ECS 全受管。當您在 Amazon ECS 叢集中終止或取消註冊您的容器執行個體時，即會刪除幹線 ENI。如需有關 `awsvpcTrunking` 帳戶設定的詳細資訊，請參閱[先決條件](container-instance-eni.md#eni-trunking-launching)。

您可以在任務定義的 `networkMode` 參數中指定 `awsvpc`。如需詳細資訊，請參閱[網路模式](task_definition_parameters.md#network_mode)。

接著，當您執行任務或建立服務時，請使用 `networkConfiguration` 參數。該參數包含一或多個用於置放任務的子網路，以及一個或多個要連接至 ENI 的安全群組。如需詳細資訊，請參閱[網路組態](service_definition_parameters.md#sd-networkconfiguration)。任務放置在與這些子網相同之可用區域中的有效 Amazon EC2 執行個體上，而指定之安全群組則與針對任務所佈建的 ENI 建立關聯。

## Linux 考量事項
<a name="linux"></a>

 使用 Linux 作業系統時，請考量下列事項。
+ 如果在 `awsvpc` 模式下使用 p5.48xlarge 執行個體，則無法在執行個體上執行超過 1 項任務。
+ 使用 `awsvpc` 網路模式的任務和服務需要 Amazon ECS 服務連結角色為 Amazon ECS 提供代表您呼叫其他 AWS 服務的許可。這個角色會在您建立叢集，或在 AWS 管理主控台中建立或更新服務時，自動為您建立。如需詳細資訊，請參閱[使用 Amazon ECS 的服務連結角色](using-service-linked-roles.md)。您也可以使用下列 AWS CLI 命令建立服務連結角色：

  ```
  aws iam [create-service-linked-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-service-linked-role.html) --aws-service-name ecs.amazonaws.com
  ```
+ 您的 Amazon EC2 Linux 執行個體需要容器代理程式的版本 `1.15.0` 或更新版本，以執行使用 `awsvpc` 網路模式的任務。如果您使用的是 Amazon ECS 最佳化 AMI，您的執行個體至少需要 `1.15.0-4` 版的 `ecs-init` 套件。
+ 在 VPC 上同時啟用 `enableDnsHostnames` 和 `enableDnsSupport` 選項時，Amazon ECS 會使用 Amazon 提供的 (內部) DNS 主機名稱填入任務的主機名稱。如果未啟用這些選項，任務的 DNS 主機名稱會設定為隨機的主機名稱。如需 VPC DNS 設定的詳細資訊，請參閱《Amazon VPC 使用者指南》中的[搭配使用 DNS 與 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html)。
+ 使用 `awsvpc` 網路模式的每個 Amazon ECS 任務都會收到自己的彈性網路介面 (ENI)，它連接到託管該任務的 Amazon EC2 執行個體。Amazon EC2 Linux 執行個體可連接的網路介面數量有預設配額。主要網路介面視為一個配額。例如，根據預設，`c5.large` 執行個體最多只有三個可與其連接的 ENI。執行個體的主要網路介面視為一個配額。您可以將額外兩個 ENI 連接到執行個體。因為每項使用 `awsvpc` 網路模式的任務都需要 ENI，所以通常只能對此執行個體類型執行兩個這類任務。如需有關每個執行個體類型的預設 ENI 限制的詳細資訊，請參閱 *Amazon EC2 User Guide* 中的 [IP addresses per network interface per instance type](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html#AvailableIpPerENI)。
+ Amazon ECS 支援使用受支援的 Amazon EC2 Linux 執行個體類型啟動加強 ENI 密度的容器執行個體。當您選擇加入 `awsvpcTrunking` 帳戶設定並使用這些執行個體類型向叢集註冊 Amazon EC2 Linux 執行個體，則這些執行個體的 ENI 配額較高。使用這些具有更高配額的執行個體代表您可以在每個 Amazon EC2 Linux 執行個體中安排更多任務。若要使用具有中繼功能的增強 ENI 密度，您的 Amazon EC2 執行個體必須使用 `1.28.1` 版或更新版本的容器代理程式。如果您使用的是 Amazon ECS 最佳化 Linux AMI，您的執行個體也至少需要 `1.28.1-2` 版的 `ecs-init` 套裝服務。如需選擇使用的 `awsvpcTrunking` 帳戶設定詳細資訊，請參閱 [透過帳戶設定使用 Amazon ECS 功能](ecs-account-settings.md)。如需 ENI 中繼的詳細資訊，請參閱[增加 Amazon ECS Linux 容器執行個體網路介面數量](container-instance-eni.md)。
+ 當在 Amazon EC2 Linux 執行個體上託管使用 `awsvpc` 網路模式的任務時，您的任務 ENI 不會提供公有 IP 位址。若要存取網際網路，必須在設定為使用 NAT 閘道的私有子網路中啟動任務。如需詳細資訊，請參閱 *《Amazon VPC 使用者指南》*中的 [NAT 閘道](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)。入站網路存取必須出自使用私有 IP 位址的 VPC，或自 VPC 透過負載平衡器路由。從公有子網路內啟動的任務無法存取網際網路。
+ Amazon ECS 只會識別連接到您的 Amazon EC2 Linux 執行個體的 ENI。如果您將 ENI 手動連接到執行個體，Amazon ECS 可能會嘗試向沒有足夠網路介面卡的執行個體新增任務。這可能導致任務逾時並進入解除佈建狀態，然後進入已停止狀態。建議您不要將 ENI 手動連接到容器執行個體。
+ Amazon EC2 Linux 執行個體必須使用 `ecs.capability.task-eni` 註冊，用以考量來放置具 `awsvpc` 網路模式的任務。執行 `1.15.0-4` 版或更新版本 `ecs-init` 的容器執行個體使用此屬性註冊。
+ 您的帳戶無法手動分離或修改由 Amazon EC2 Linux 執行個體建立並連接的 ENI。這是為了防止意外刪除與正在執行之任務相關聯的 ENI。若要釋出任務的 ENI，請停止該任務。
+ 當執行任務或建立使用 `awsvpc` 網路模式的服務時，限制只能在 `awsVpcConfiguration` 中指定 16 個子網路和 5 個安全群組。如需詳細資訊，請參閱 *Amazon Elastic Container Service API 參考* 中的 [AwsVpcConfiguration](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_AwsVpcConfiguration.html)。
+ 當任務在 `awsvpc` 網路模式中啟動時，Amazon ECS 容器代理程式會先為每項任務建立額外的 `pause` 容器，然後在任務定義中啟動容器。接著，它會執行 `pause`amazon-ecs-cni-plugins[ CNI 外掛程式，來設定 ](https://github.com/aws/amazon-ecs-cni-plugins) 容器的網路命名空間。然後代理會啟動任務中的其他容器，讓它們共用 `pause` 容器的網路堆疊。這表示任務中的所有容器都可由 ENI 的 IP 地址定址，而且它們彼此之間可以透過 `localhost` 界面通訊。
+ 服務的任務使用 `awsvpc` 網路模式僅支援 Application Load Balancer 和 Network Load Balancer。當您為這些服務建立任何目標群組時，必須選擇 `ip` 做為目標類型。請勿選擇 `instance`。這是因為使用 `awsvpc` 網路模式的任務與 ENI 相關聯，不與 Amazon EC2 Linux 執行個體相關聯。如需詳細資訊，請參閱[使用負載平衡分佈 Amazon ECS 服務流量](service-load-balancing.md)。
+ 如果您的 VPC 已更新以變更其使用的 DHCP 選項集，則無法將這些變更套用到現有的任務。啟動套用這些變更的新任務，驗證這些任務是否正確運作，接著停止現有的任務，以便安全地變更這些網路組態。

## Windows 考量
<a name="windows"></a>

 當您使用 Windows 作業系統時，請考慮下列事項：
+ 使用 Amazon ECS 最佳化 Windows Server 2016 AMI 的容器執行個體無法託管使用 `awsvpc` 網路模式的任務。如果您的叢集包含 Amazon ECS 最佳化且支援 `awsvpc` 網路模式的 Windows Server 2016 AMI 和 Windows AMI，使用 `awsvpc` 網路模式的任務不會在 Windows 2016 Server 執行個體上啟動。但會在支援 `awsvpc` 網路模式的執行個體上啟動。
+ 您的 Amazon EC2 Windows 執行個體需要容器代理程式的版本 `1.57.1` 或更新版本，以使用採用 `awsvpc` 網路模式的 Windows 容器 CloudWatch 指標。
+ 使用 `awsvpc` 網路模式的任務和服務需要 Amazon ECS 服務連結角色為 Amazon ECS 提供代表您呼叫其他 AWS 服務的許可。這個角色會在您建立叢集，或在 AWS 管理主控台中建立或更新服務時，自動為您建立。如需詳細資訊，請參閱[使用 Amazon ECS 的服務連結角色](using-service-linked-roles.md)。您也可以使用下列 AWS CLI 命令建立服務連結角色。

  ```
  aws iam [create-service-linked-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-service-linked-role.html) --aws-service-name ecs.amazonaws.com
  ```
+ 您的 Amazon EC2 Windows 執行個體需要容器代理程式的版本 `1.54.0` 或更新版本，以執行使用 `awsvpc` 網路模式的任務。啟動執行個體時，必須設定 `awsvpc` 網路模式所需的選項。如需詳細資訊，請參閱[引導 Amazon ECS Windows 容器執行個體傳遞資料](bootstrap_windows_container_instance.md)。
+ 在 VPC 上同時啟用 `enableDnsHostnames` 和 `enableDnsSupport` 選項時，Amazon ECS 會使用 Amazon 提供的 (內部) DNS 主機名稱填入任務的主機名稱。如果未啟用這些選項，任務的 DNS 主機名稱會是隨機的主機名稱。如需 VPC DNS 設定的詳細資訊，請參閱《Amazon VPC 使用者指南》中的[搭配使用 DNS 與 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html)。
+ 每項使用 `awsvpc` 網路模式的 Amazon ECS 任務都會收到自己的彈性網路介面 (ENI)，連接到裝載該任務的 Amazon EC2 Windows 執行個體。Amazon EC2 Windows 執行個體可連接的網路介面數量有預設配額。主要網路介面視為一個配額。例如，根據預設，`c5.large` 執行個體最多只有三個可與其連接的 ENI。執行個體的主要網路介面視為一個配額。您可以將額外兩個 ENI 連接到執行個體。因為每項使用 `awsvpc` 網路模式的任務都需要 ENI，所以通常只能對此執行個體類型執行兩個這類任務。如需有關每個執行個體類型的預設 ENI 限制的詳細資訊，請參閱 *Amazon EC2 User Guide* 中的 [IP addresses per network interface per instance type](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/using-eni.html#AvailableIpPerENI)。
+ 當在 Amazon EC2 Windows 執行個體上託管使用 `awsvpc` 網路模式的任務時，您的任務 ENI 不會提供公有 IP 位址。若要存取網際網路，在設定為使用 NAT 閘道的私有子網路中啟動任務。如需詳細資訊，請參閱 *《Amazon VPC 使用者指南》*中的 [NAT 閘道](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)。入站網路存取必須出自使用私有 IP 位址的 VPC，或自 VPC 透過負載平衡器路由。從公有子網路內啟動的任務無法存取網際網路。
+ Amazon ECS 只會識別連接到您的 Amazon EC2 Windows 執行個體的 ENI。如果您將 ENI 手動連接到執行個體，Amazon ECS 可能會嘗試向沒有足夠網路介面卡的執行個體新增任務。這可能導致任務逾時並進入解除佈建狀態，然後進入已停止狀態。建議您不要將 ENI 手動連接到容器執行個體。
+ Amazon EC2 Windows 執行個體必須使用 `ecs.capability.task-eni` 註冊，用以考量來放置具 `awsvpc` 網路模式的任務。
+  您無法手動修改或分離由 Amazon EC2 Windows 執行個體建立並連接的 ENI。這是為了防止您意外刪除與正在執行之任務相關聯的 ENI。若要釋出任務的 ENI，請停止該任務。
+  您在執行任務或建立使用 `awsvpc` 網路模式的服務時，您最多只能在 `awsVpcConfiguration` 指定 16 個子網和五個安全群組。如需詳細資訊，請參閱 *Amazon Elastic Container Service API 參考* 中的 [AwsVpcConfiguration](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_AwsVpcConfiguration.html)。
+ 當任務在 `awsvpc` 網路模式中啟動時，Amazon ECS 容器代理程式會先為每項任務建立額外的 `pause` 容器，然後在任務定義中啟動容器。接著，它會執行 `pause`amazon-ecs-cni-plugins[ CNI 外掛程式，來設定 ](https://github.com/aws/amazon-ecs-cni-plugins) 容器的網路命名空間。然後代理會啟動任務中的其他容器，讓它們共用 `pause` 容器的網路堆疊。這表示任務中的所有容器都可由 ENI 的 IP 地址定址，而且它們彼此之間可以透過 `localhost` 界面通訊。
+ 服務的任務使用 `awsvpc` 網路模式僅支援 Application Load Balancer 和 Network Load Balancer。當您為這些服務建立任何目標群組時，必須選擇 `ip` 做為目標類型，而不是選擇 `instance`。這是因為使用 `awsvpc` 網路模式的任務與 ENI 相關聯，不與 Amazon EC2 Windows 執行個體相關聯。如需詳細資訊，請參閱[使用負載平衡分佈 Amazon ECS 服務流量](service-load-balancing.md)。
+ 如果您的 VPC 已更新以變更其使用的 DHCP 選項集，則無法將這些變更套用到現有的任務。啟動套用這些變更的新任務，驗證這些任務是否正確運作，接著停止現有的任務，以便安全地變更這些網路組態。
+ 若您在 EC2 Windows 組態中使用 `awsvpc` 網路模式，則系統不支援下列項目：
  + 雙堆疊組態
  + IPv6
  + ENI 中繼

## 在雙堆疊模式下使用 VPC
<a name="task-networking-vpc-dual-stack"></a>

在雙堆疊模式中使用 VPC 時，任務可透過 IPv4 或 IPv6 或兩者進行通訊。IPv4 與 IPv6 位址彼此獨立。因此，您必須在 VPC 中為 IPv4 與 IPv6 分別配置路由與安全設定。如需如何將 VPC 設定為雙堆疊模式的詳細資訊，請參閱《Amazon VPC 使用者指南》中的[遷移至 IPv6](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-migrate-ipv6.html)。

如果您為 VPC 設定網際網路閘道或傳出限定網際網路閘道，則可以在雙堆疊模式下使用 VPC。藉此，指派 IPv6 位址的工作就能透過網際網路閘道或僅限出口的網際網路閘道存取網際網路。NAT 閘道是選用。如需詳細資訊，請參閱 *《Amazon VPC 使用者指南》* 中的[網際網路閘道](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html)和[輸出限定網際網路閘道](https://docs.aws.amazon.com/vpc/latest/userguide/egress-only-internet-gateway.html)。

如果符合下列條件，將會為 Amazon ECS 任務指派 IPv6 地址：
+ Amazon EC2 Linux 執行個體託管的任務正在使用版本 `1.45.0` 或更新版本的容器代理程式。如需如何檢查執行個體使用之代理程式版本以及視需要進行更新的相關資訊，請參閱 [更新 Amazon ECS 容器代理程式](ecs-agent-update.md)。
+ 此 `dualStackIPv6` 帳戶設定已啟用。如需詳細資訊，請參閱[透過帳戶設定使用 Amazon ECS 功能](ecs-account-settings.md)。
+ 您的任務是使用 `awsvpc` 網路模式。
+ 您的 VPC 與子網路已針對 IPv6 進行設定。組態包含在指定子網路中建立的網路介面。如需如何將 VPC 設定為雙堆疊模式的詳細資訊，請參閱《Amazon VPC 使用者指南》中的[遷移至 IPv6](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-migrate-ipv6.html) 和[修改您子網路的公有 IPv6 定址屬性](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html#subnet-ipv6)。

# 將 Amazon ECS 容器連接埠映射至 EC2 執行個體網路介面
<a name="networking-networkmode-host"></a>

僅 Amazon EC2 執行個體上託管的 Amazon ECS 任務支援 `host` 網路模式。使用 Fargate 上的 Amazon ECS 時不支援。

`host` 網路模式是 Amazon ECS 支援的最基本網路模式。使用託管模式，容器的聯網功能會直接繫結至執行容器的基礎主機。

![\[顯示網路架構的圖表，其中包含使用託管網路模式的容器。\]](http://docs.aws.amazon.com/zh_tw/AmazonECS/latest/developerguide/images/networkmode-host.png)


假設您正在使用 Express 應用程式執行 Node.js 容器，該應用程式會接聽連接埠 `3000` (類似於上圖中所示的連接埠)。使用 `host` 網路模式時，容器會使用基礎主機 Amazon EC2 執行個體的 IP 地址在連接埠 3000 上接收流量。我們不建議使用此模式。

使用此網路模式存在重大的缺點。您不能在每台主機上執行多個任務的執行個體化。這是因為只有第一個任務可以繫結至 Amazon EC2 執行個體上所需的連接埠。使用 `host` 網路模式時，也無法重新對應容器連接埠。例如，如果應用程式需要接聽特定的連接埠號碼，則無法直接重新對應連接埠號碼。相反地，您必須透過變更應用程式組態來管理任何連接埠衝突。

使用 `host` 網路模式時也存在安全隱患。此模式允許容器模擬主機，並允許容器連線至主機上的私有迴路網路服務。

# 為 Amazon ECS Linux 任務使用 Docker 的虛擬網路
<a name="networking-networkmode-bridge"></a>

僅 Amazon EC2 執行個體上託管的 Amazon ECS 任務支援 `bridge` 網路模式。

在 `bridge` 模式下，您正在使用虛擬網路橋接器，在主機和容器的網路之間建立一個層。如此一來，您就可以建立將主機連接埠重新對應至容器連接埠的連接埠映射。映射可以是靜態或動態模式。

![\[此圖顯示使用橋接網路模式與靜態連接埠映射的網路架構。\]](http://docs.aws.amazon.com/zh_tw/AmazonECS/latest/developerguide/images/networkmode-bridge.png)


透過靜態連接埠映射，您可以明確定義要對應至容器連接埠的主機連接埠。使用上述範例，主機上的 `80` 連接埠會對應至容器上的連接埠 `3000`。若要與容器化應用程式通訊，請將流量傳送至 Amazon EC2 執行個體 IP 地址的連接埠 `80`。從容器化應用程式的角度來看，其可以看到連接埠 `3000` 上的入站流量。

如果您只想變更流量連接埠，則適用於靜態連接埠映射。但是，這仍然與使用 `host` 網路模式具有相同的缺點。您不能在每台主機上執行多個任務的執行個體化。這是因為靜態連接埠映射僅允許單一容器對應至連接埠 80。

為了解決這個問題，可以考慮使用具有動態連接埠映射的 `bridge` 網路模式，如下圖所示。

![\[此圖顯示使用橋接網路模式與動態連接埠映射的網路架構。\]](http://docs.aws.amazon.com/zh_tw/AmazonECS/latest/developerguide/images/networkmode-bridge-dynamic.png)


透過不在連接埠映射中指定主機連接埠，您可以讓 Docker 從暫時性連接埠範圍中選擇一個隨機、未使用的連接埠，並將其指派為容器的公有主機連接埠。例如，在容器上接聽連接埠 `3000` 的 Node.js 應用程式可能會被指派一個隨機的高編號連接埠，例如在 Amazon EC2 主機上的 `47760`。這樣做意味著您可以在主機上執行該容器的多個副本。此外，每個容器都可以在主機上指派自己的連接埠。容器的每個副本都會在連接埠 `3000` 上接收流量。不過，傳送流量至這些容器的用戶端會使用隨機指派的主機連接埠。

Amazon ECS 可協助您追蹤每個任務的隨機指派連接埠。其做法是自動更新負載平衡器目標群組 AWS Cloud Map 和服務探索，以取得任務 IP 地址和連接埠的清單。這樣可以更輕鬆地使用透過動態連接埠的 `bridge` 模式運作的服務。

但是，使用 `bridge` 網路模式的缺點之一是難以鎖定服務對服務通訊。由於服務可能會指派給任何隨機、未使用的連接埠，因此必須在主機之間開放廣泛的連接埠範圍。然而，建立特定規則以使特定服務只能與另一個特定服務通訊並不容易。這些服務沒有可用於安全群組聯網規則的特定連接埠。

## 為純 IPv6 的工作負載設定橋接聯網模式
<a name="networking-networkmode-bridge-ipv6-only"></a>

若要設定透過 IPv6 通訊的 `bridge` 模式，您必須更新 Docker 常駐程式設定。請按照以下設定更新 `/etc/docker/daemon.json`：

```
{
  "ipv6": true,
  "fixed-cidr-v6": "2001:db8:1::/64",
  "ip6tables": true,
  "experimental": true
}
```

更新 Docker 常駐程式設定後，您需要重新啟動常駐程式。

**注意**  
在更新並重新啟動常駐程式時，Docker 會在執行個體上啟用 IPv6 轉送功能，這可能會導致使用 Amazon Linux 2 AMI 的執行個體丟失預設路由。若要避免此問題，請使用下列命令，透過子網路的 IPv6 閘道新增預設路由。  

```
ip route add default via FE80:EC2::1 dev eth0 metric 100
```

# Fargate 的 Amazon ECS 任務聯網選項
<a name="fargate-task-networking"></a>

依預設，Fargate 上的每個 Amazon ECS 任務都會提供彈性網路介面 (ENI)，具有主要私有 IP 地址。使用公有子網路時，您可以選擇性地將公有 IP 位址指派給任務的 ENI。如果 VPC 已設定為雙堆疊模式，且使用的子網路帶有 IPv6 CIDR 區塊，則該任務的 ENI 還會取得 IPv6 位址。任務在指定時間內只能有一個相關聯的 ENI。屬於同一個任務的容器也可透過 `localhost` 介面進行通訊。如需有關 VPC 與子網路的詳細資訊，請參閱 *Amazon VPC User Guide* 中的 [How Amazon VPC works](https://docs.aws.amazon.com/vpc/latest/userguide/how-it-works.html)。

若要讓 Fargate 上的任務提取容器映像，任務必須有通往網際網路的路由。以下說明如何確認您的任務具有通往網際網路的路由。
+ 使用公有子網路時，您可將公有 IP 地址指派給任務 ENI。
+ 使用私人子網路時，子網路可以連結 NAT 閘道。
+ 使用 Amazon ECR 中託管的容器映像時，您可以將 Amazon ECR 設定為使用介面 VPC 端點，並且透過任務的私有 IPv4 位址進行映像提取 。如需詳細資訊，請參閱 *Amazon Elastic Container Registry User Guide* 中的 [Amazon ECR interface VPC endpoints (AWS PrivateLink)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html)。

因為每項任務都會取得自己的 ENI，所以您可以利用聯網功能，例如 VPC 流程日誌，以便您監控任務的進出流量。如需詳細資訊，請參閱「Amazon VPC 使用者指南」**中的 [VPC 流程日誌](https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html)。

您也可以利用 AWS PrivateLink。您可以設定 VPC 介面端點，以便透過私有 IP 地址存取 Amazon ECS APIs。 AWS PrivateLink 會限制 VPC 和 Amazon ECS 之間的所有網路流量到 Amazon 網路。您不需要網際網路閘道、NAT 裝置或虛擬私有閘道。如需詳細資訊，請參閱 [Amazon ECS 介面 VPC 端點 (AWS PrivateLink)](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/vpc-endpoints.html)。

如需如何使用 `NetworkConfiguration` 資源的範例 CloudFormation，請參閱 [CloudFormation Amazon ECS 的範例範本](working-with-templates.md)。

建立的 ENI 由 AWS Fargate全受管。此外，還有用來將許可授予 Fargate 的相關 IAM 政策。對於使用 Fargate 平台版本 `1.4.0` 或更新版本的任務，該任務會收到單一 ENI (也稱為任務 ENI)，所有網路流量會流經 VPC 中的 ENI。此流量記錄在您的 VPC 流程日誌中。對於使用 Fargate 平台版本 `1.3.0` 和舊版的任務，除了任務 ENI 以外，該任務也會收到個別 Fargate 擁有的 ENI，其用於某些網路流量，這些流量不會顯示在 VPC 流程日誌中。以下資料表描述網路流量行為，以及每個平台版本所需的 IAM 政策。


|  Action  |  使用 Linux 平台版本 `1.3.0` 和更早版本時的流量流程  |  使用 Linux 平台版本 `1.4.0` 時的流量流程  |  使用 Windows 平台版本 `1.0.0` 時的流量流程  |  IAM 許可  | 
| --- | --- | --- | --- | --- | 
|  擷取 Amazon ECR 登入憑證  |  Fargate 擁有的 ENI  |  任務 ENI  |  任務 ENI  |  任務執行 IAM 角色  | 
|  映像提取  |  任務 ENI  |  任務 ENI  |  任務 ENI  |  任務執行 IAM 角色  | 
|  透過日誌驅動程式傳送日誌  |  任務 ENI  |  任務 ENI  |  任務 ENI  |  任務執行 IAM 角色  | 
|  透過 FireLens for Amazon ECS 傳送日誌  |  任務 ENI  |  任務 ENI  |  任務 ENI  |  任務 IAM 角色  | 
|  從 Secrets Manager 或 Systems Manager 中擷取秘密  |  Fargate 擁有的 ENI  |  任務 ENI  |  任務 ENI  |  任務執行 IAM 角色  | 
|  Amazon EFS 檔案系統流量  |  不適用  |  任務 ENI  |  任務 ENI  |  任務 IAM 角色  | 
|  應用程式流量  |  任務 ENI  |  任務 ENI  |  任務 ENI  |  任務 IAM 角色  | 

## 考量事項
<a name="fargate-task-networking-considerations"></a>

使用任務聯網時，請考量下列事項。
+ 需要 Amazon ECS 服務連結角色，才能為 Amazon ECS 提供代表您呼叫其他 AWS 服務的許可。這個角色會在您建立叢集，或在 AWS 管理主控台中建立或更新服務時建立。如需詳細資訊，請參閱[使用 Amazon ECS 的服務連結角色](using-service-linked-roles.md)。您也可以使用下列 AWS CLI 命令建立服務連結角色。

  ```
  aws iam [create-service-linked-role](https://docs.aws.amazon.com/cli/latest/reference/iam/create-service-linked-role.html) --aws-service-name ecs.amazonaws.com
  ```
+ 在 VPC 上同時啟用 `enableDnsHostnames` 和 `enableDnsSupport` 選項時，Amazon ECS 會使用 Amazon 提供的 DNS 主機名稱填入任務的主機名稱。如果未啟用這些選項，任務的 DNS 主機名稱會設定為隨機的主機名稱。如需 VPC DNS 設定的詳細資訊，請參閱《Amazon VPC 使用者指南》中的[搭配使用 DNS 與 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html)。
+ 您為 `awsVpcConfiguration` 最多只能指定 16 個子網和 5 個安全群組。如需詳細資訊，請參閱 *Amazon Elastic Container Service API 參考* 中的 [AwsVpcConfiguration](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_AwsVpcConfiguration.html)。
+ 您的帳戶無法手動分離或修改由 Fargate 建立並連接的 ENI。這是為了防止意外刪除與正在執行之任務相關聯的 ENI。若要釋出任務的 ENI，請停止該任務。
+ 如果 VPC 子網路已更新以變更其使用的 DHCP 選項集，您也無法將這些變更套用到使用 VPC 的現有任務。啟動新任務，其將在測試新變更接著停止舊任務的同時，接收新的設定以順利遷移 (如果不需要轉返)。
+ 下列規則適用於在特定 Fargate 平台版本上執行的任務：Linux 系統對應 `1.4.0` 或更新版本，Windows 系統對應 `1.0.0`。在雙堆疊子網路中啟動的任務會取得 IPv4 位址與 IPv6 位址。在純 IPv6 子網路中啟動的任務只會取得 IPv6 位址。
+ 對於使用平台 Linux `1.4.0` 版或更新版或者 Windows `1.0.0` 版的任務，任務 ENI 支援巨型訊框。網路界面皆以最大傳輸單位 (MTU) 來設定，這是適合單一框架的最大酬載大小。MTU 越大，單一框架能容納的應用程式酬載越多，可降低每個框架的額外負荷並提高效率。當任務和目的地之間的網路路徑支援巨型訊框時，支援巨型訊框會降低額外負荷。
+ 使用 Fargate 之任務的服務僅支援 Application Load Balancer 與 Network Load Balancer。不支援 Classic Load Balancer。當您建立任何目標群組時，必須選擇 `ip` 做為目標類型，而不是選擇 `instance`。如需詳細資訊，請參閱[使用負載平衡分佈 Amazon ECS 服務流量](service-load-balancing.md)。

## 在雙堆疊模式下使用 VPC
<a name="fargate-task-networking-vpc-dual-stack"></a>

在雙堆疊模式中使用 VPC 時，您的任務可透過 IPv4 或 IPv6 或兩者進行通訊。IPv4 和 IPv6 地址彼此互相獨立。您必須在您的 VPC 中分別為 IPv4 和 IPv6 設定路由和安全。如需將 VPC 設定為雙堆疊模式的詳細資訊，請參閱 *《Amazon VPC 使用者指南》* 中的[遷移至 IPv6](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-migrate-ipv6.html)。

如果符合下列條件，則會將 IPv6 位址指派給 Fargate 上的 Amazon ECS 任務：
+ 在您啟動任務的區域中，執行任務啟動操作之 IAM 主體的 Amazon ECS `dualStackIPv6` 帳戶設定必須處於開啟 (`enabled`) 狀態。此設定只能使用 API 或 進行修改 AWS CLI。您可選擇為帳戶中特定的 IAM 主體開啟此設定，或透過設定帳戶預設值為整個帳戶開啟此設定。如需詳細資訊，請參閱[透過帳戶設定使用 Amazon ECS 功能](ecs-account-settings.md)。
+ 已對 IPv6 啟用 VPC 和子網路。如需如何將 VPC 設定為雙堆疊模式的詳細資訊，請參閱《Amazon VPC 使用者指南》中的[遷移至 IPv6](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-migrate-ipv6.html)。
+ 您的子網路已啟用自動指派 IPv6 位址。如需詳細資訊，請參閱《Amazon VPC 使用者指南》**中的[修改子網路的 IPv6 地址屬性](https://docs.aws.amazon.com/vpc/latest/userguide/modify-subnets.html)。
+ 任務或服務使用適用於 Linux 的 Fargate 平台版本 `1.4.0` 或更高版本。

對於以雙堆疊模式在 VPC 中執行的 Fargate 上的 Amazon ECS 任務，若要與任務啟動程序中使用的相依性服務通訊，例如 ECR、SSM 和 SecretManager，公有子網路的路由表需要 IPv4 (0.0.0.0/0) 路由至網際網路閘道，而私有子網路的路由表需要 IPv4 (0.0.0.0/0) 路由至 NAT 閘道。如需詳細資訊，請參閱《*Amazon VPC 使用者指南*》中的[網際網路閘道](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html)和 [NAT 閘道](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)。

如需如何設定雙堆疊 VPC 的範例，請參閱[雙堆疊 VPC 組態範例](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-migrate-ipv6-example.html)。

## 在純 IPv6 模式下使用 VPC
<a name="fargate-task-networking-vpc-ipv6-only"></a>

在純 IPv6 組態中，Amazon ECS 任務只會透過 IPv6 進行通訊。若要為純 IPv6 組態設定 VPC 與子網路，您必須將 IPv6 CIDR 區塊新增至 VPC，並建立僅包含 IPv6 CIDR 區塊的子網路。如需詳細資訊，請參閱 *Amazon VPC User Guide* 中的 [Add IPv6 support for your VPC](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-migrate-ipv6-add.html) 與 [Create a subnet](https://docs.aws.amazon.com/vpc/latest/userguide/create-subnets.html)。您還必須更新路由表，加入 IPv6 目標，並在安全群組中設定 IPv6 規則。如需詳細資訊，請參閱 *Amazon VPC User Guide* 中的 [Configure route tables](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html) 與 [Configure security group rules](https://docs.aws.amazon.com/vpc/latest/userguide/working-with-security-group-rules.html)。

適用下列注意事項：
+ 您可透過以下兩種方式，將純 IPv4 或雙堆疊的 Amazon ECS 服務升級為純 IPv6 組態：一是直接將服務更新為使用純 IPv6 子網路；二是建立平行的純 IPv6 服務，再透過 Amazon ECS 藍綠部署將流量遷移至新服務。如需有關 Amazon ECS 藍/綠部署的詳細資訊，請參閱 [Amazon ECS 藍/綠部署](deployment-type-blue-green.md)。
+ 純 IPv6 的 Amazon ECS 服務必須使用具 IPv6 目標群組的雙堆疊負載平衡器。若要遷移的現有 Amazon ECS 服務後端掛載了 Application Load Balancer 或 Network Load Balancer，可建立新的雙堆疊負載平衡器並將流量從舊負載平衡器遷移過去，或直接更新現有負載平衡器的 IP 位址類型。

   如需有關 Network Load Balancer 的詳細資訊，請參閱 *User Guide for Network Load Balancers* 中的 [Create a Network Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/create-network-load-balancer.html) 與 [Update the IP address types for your Network Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-ip-address-type.html)。如需有關 Application Load Balancer 的詳細資訊，請參閱 *User Guide for Application Load Balancers* 中的 [Create an Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/create-application-load-balancer.html) 與 [Update the IP address types for your Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-ip-address-type.html)。
+ Windows 不支援純 IPv6 組態。
+ 若要讓純 IPv6 組態中的 Amazon ECS 任務與純 IPv4 端點通訊，您可以設定 DNS64 與 NAT64，實現從 IPv6 到 IPv4 的網路位址轉換。如需更多詳細資訊，請參閱《*Amazon VPC 使用者指南*》中的「[DNS64 和 NAT64](https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-nat64-dns64.html)」。
+ Fargate 平台版本 `1.4.0` 或更新版本支援純 IPv6 組態。
+ 在純 IPv6 組態中，Amazon ECS 工作負載從 Amazon ECR 拉取映像時，必須使用 Amazon ECR 雙堆疊映像 URI 端點。如需詳細資訊，請參閱 *Amazon Elastic Container Registry User Guide* 中的 [Getting started with making requests over IPv6](https://docs.aws.amazon.com/AmazonECR/latest/userguide/ecr-requests.html#ipv6-access-getting-started)。
**注意**  
Amazon ECR 不支援可供純 IPv6 組態中任務使用的雙堆疊介面 VPC 端點。如需詳細資訊，請參閱 *Amazon Elastic Container Registry User Guide* 中的 [Getting started with making requests over IPv6](https://docs.aws.amazon.com/AmazonECR/latest/userguide/ecr-requests.html#ipv6-access-getting-started)。
+ 純 IPv6 組態不支援 Amazon ECS Exec。
+ Amazon CloudWatch 不支援雙堆疊 FIPS 端點，因此無法監控採用純 IPv6 組態且需符合 FIPS-140 規範的 Amazon ECS 任務。如需有關 FIPS-140 的詳細資訊，請參閱 [AWS Fargate 聯邦資訊處理標準 (FIPS-140)](ecs-fips-compliance.md)。

### AWS 區域 支援 IPv6-only 模式
<a name="fargate-task-networking-ipv6-only-regions"></a>

您可以在下列 Amazon ECS 可用的 中 AWS 區域 ，以IPv6-only 的組態執行任務：
+ 美國東部 (俄亥俄)
+ 美國東部 (維吉尼亞北部)
+ 美國西部 (加利佛尼亞北部)
+ 美國西部 (奧勒岡)
+ 非洲 (開普敦)
+ 亞太地區 (香港)
+ 亞太區域 (海德拉巴)
+ 亞太地區 (雅加達)
+ 亞太地區 (墨爾本)
+ 亞太地區 (孟買)
+ 亞太區域 (大阪)
+ 亞太區域 (首爾)
+ 亞太區域 (新加坡)
+ 亞太地區 (雪梨)
+ 亞太區域 (東京)
+ 加拿大 (中部)
+ 加拿大西部 (卡加利)
+ 中國 (北京)
+ 中國 (寧夏)
+ 歐洲 (法蘭克福)
+ 歐洲 (倫敦)
+ 歐洲 (米蘭)
+ Europe (Paris)
+ 歐洲 (西班牙)
+ 以色列 (特拉維夫)
+ Middle East (Bahrain)
+ 中東 (阿拉伯聯合大公國)
+ 南美洲 (聖保羅)
+ AWS GovCloud （美國東部）
+ AWS GovCloud （美國西部）

# Amazon ECS 任務的儲存選項
<a name="using_data_volumes"></a>

Amazon ECS 會依據您的需求，提供彈性、具成本效益且易於使用的資料儲存選項。Amazon ECS 支援容器的下列資料磁碟區選項：


| 資料量 | 支援的容量 | 支援的作業系統 | 儲存持續性 | 使用案例 | 
| --- | --- | --- | --- | --- | 
| Amazon Elastic Block Store (Amazon EBS) | Fargate、Amazon EC2、Amazon ECS 受管執行個體 | Linux、Windows (僅限於 Amazon EC2) | 連接至獨立任務時，可為持續性儲存。連接至由服務維護的任務時，則為暫時性儲存。 | Amazon EBS 磁碟區為資料密集型容器化工作負載，提供具成本效益、持久且高效能的區塊儲存服務。常見使用案例包括交易型工作負載 (如資料庫、虛擬桌面與根磁碟區)，以及輸送量密集型工作負載 (如日誌處理與 ETL 工作負載)。如需詳細資訊，請參閱[將 Amazon EBS 磁碟區與 Amazon ECS 搭配使用](ebs-volumes.md)。 | 
| Amazon Elastic File System (Amazon EFS) | Fargate、Amazon EC2、Amazon ECS 受管執行個體 | Linux | 持續 | Amazon EFS 磁碟區提供可用於 Amazon ECS 任務的簡單、可擴展且持續性的共用檔案儲存服務，該服務會隨著您新增或刪除檔案自動擴容與縮容。Amazon EFS 磁碟區支援並行操作，適用於需水平擴展且需要低延遲、高輸送量與寫後讀一致性等儲存功能的容器化應用程式。常見使用案例包括資料分析、媒體處理、內容管理與 Web 服務等工作負載。如需詳細資訊，請參閱[將 Amazon EFS 磁碟區與 Amazon ECS 搭配使用](efs-volumes.md)。 | 
| Amazon FSx for Windows File Server | Amazon EC2 | Windows | 持續 | FSx for Windows File Server 磁碟區提供全受管 Windows 檔案伺服器，可用於對需要持續性、分散式、共用且靜態檔案儲存的 Windows 任務進行佈建。常見使用案例包括 .NET 應用程式，這類應用程式可能需要將本機資料夾作為持續性儲存空間來儲存應用程式輸出內容。Amazon FSx for Windows File Server 會在容器中提供一個本機資料夾，支援多個容器在由「SMB 共用」提供支援的同一檔案系統中進行讀寫操作。如需詳細資訊，請參閱[搭配 Amazon ECS 使用 FSx for Windows File Server 磁碟區](wfsx-volumes.md)。 | 
| Amazon FSx for NetApp ONTAP | Amazon EC2 | Linux | 持續 | Amazon FSx for NetApp ONTAP 磁碟區提供全受管 NetApp ONTAP 檔案系統，可用於對需要持久性、高效能且功能豐富的共用檔案儲存的 Linux 任務進行佈建。Amazon FSx for NetApp ONTAP 支援 NFS 與 SMB 通訊協定，並提供快照、複製及重複資料刪除等企業級功能。常見使用案例包括高效能運算工作負載、內容儲存庫，以及需要符合 POSIX 標準之共用儲存的應用程式。如需詳細資訊，請參閱 [Mounting Amazon FSx for NetApp ONTAP file systems from Amazon ECS containers](https://docs.aws.amazon.com/fsx/latest/ONTAPGuide/mount-ontap-ecs-containers.html)。 | 
| Docker 磁碟區 | Amazon EC2 | Windows，Linux | 持續 | Docker 磁碟區是 Docker 容器執行時期的一項功能，允許容器透過掛載主機檔案系統中的目錄來實現資料持久化。Docker 磁碟區驅動程式 (也稱為外掛程式) 用於整合容器磁碟區與外部儲存系統。Docker 磁碟區可由第三方驅動程式管理，也可由內建的 local 驅動程式管理。Docker 磁碟區的常見使用案例包括提供持續性資料磁碟區，或在同一容器執行個體上不同容器的不同位置共用磁碟區。如需詳細資訊，請參閱[搭配 Amazon ECS 使用 Docker 磁碟區](docker-volumes.md)。 | 
| 綁定掛載 | Fargate、Amazon EC2、Amazon ECS 受管執行個體 | Windows，Linux | 暫時 | 綁定掛載由主機上的檔案或目錄組成 AWS Fargate，例如掛載到容器的 Amazon EC2 執行個體或 。綁定掛載的常見使用案例包括：在同一任務中，將來源容器的磁碟區與其他容器公用；或在一個或多個容器中，掛載主機磁碟區或空磁碟區。如需詳細資訊，請參閱[搭配 Amazon ECS 使用綁定掛載](bind-mounts.md)。 | 

# 將 Amazon EBS 磁碟區與 Amazon ECS 搭配使用
<a name="ebs-volumes"></a>

Amazon Elastic Block Store (Amazon EBS) 磁碟區為資料密集型工作負載提供高可用性、具成本效益、持久且高效能的區塊儲存服務。Amazon EBS 磁碟區可與 Amazon ECS 任務搭配使用，適用於高輸送量及交易密集型的應用程式。如需有關 Amazon EBS 磁碟區的詳細資訊，請參閱 *Amazon EBS User Guide* 中的 [Amazon EBS volumes](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volumes.html)。

連接至 Amazon ECS 任務的 Amazon EBS 磁碟區由 Amazon ECS 代表您管理。在獨立任務啟動期間，您可以提供相應組態，用於將一個 EBS 磁碟區連接至任務。在服務建立或更新期間，您可以提供相應組態，用於為 Amazon ECS 服務管理的每項任務分別連接一個 EBS 磁碟區。您可以設定新的空白磁碟區進行連接，也可以使用快照從現有磁碟區載入資料。

**注意**  
在使用快照設定磁碟區時，您可以指定 `volumeInitializationRate` (單位為 MiB/s)，從而以該速率從快照擷取資料，來建立在可預測的時間內完整初始化的磁碟區。如需有關磁碟區初始化的詳細資訊，請參閱 *Amazon EBS User Guide* 中的 [Initialize Amazon EBS volumes](https://docs.aws.amazon.com/ebs/latest/userguide/initalize-volume.html)。如需有關設定 Amazon EBS 磁碟區的詳細資訊，請參閱[在 Amazon ECS 任務定義中將磁碟區組態延至啟動時進行](specify-ebs-config.md)與[在部署 Amazon ECS 時指定 Amazon EBS 磁碟區組態](configure-ebs-volume.md)。

磁碟區組態會透過任務定義中的 `configuredAtLaunch` 參數，延至啟動時進行。透過在啟動時而非在任務定義中提供磁碟區組態，您可以建立不受特定資料磁碟區類型或特定 EBS 磁碟區設定限制的任務定義。然後，您可以在不同的執行時期環境中重複使用任務定義。例如，您可以在部署期間為生產環境工作負載提供比預生產環境更高的輸送量。

 連接至任務的 Amazon EBS 磁碟區可以使用 AWS Key Management Service (AWS KMS) 金鑰加密，以保護您的資料。如需詳細資訊，請參閱 [加密儲存於連接至 Amazon ECS 任務之 Amazon EBS 磁碟區中的資料](ebs-kms-encryption.md)。

若要監控磁碟區效能，您也可以使用 Amazon CloudWatch 指標。如需有關 Amazon EBS 磁碟區 Amazon ECS 指標的詳細資訊，請參閱 [Amazon ECS CloudWatch 指標](available-metrics.md)與 [Amazon ECS Container Insights metrics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Container-Insights-metrics-ECS.html)。

所有支援 Amazon ECS 的商業與中國 [AWS 區域](https://docs.aws.amazon.com/glossary/latest/reference/glos-chap.html?icmpid=docs_homepage_addtlrcs#region)，皆支援將 Amazon EBS 磁碟區連接至任務。

## 支援的作業系統與容量
<a name="ebs-volumes-configuration"></a>

下表提供支援的作業系統與容量組態。


| Capacity | Linux  | Windows | 
| --- | --- | --- | 
| Fargate |  平台版本 1.4.0 或更新版本 (Linux) 支援 Amazon EBS 磁碟區。如需詳細資訊，請參閱[適用於 Amazon ECS 的 Fargate 平台版本](platform-fargate.md)。 | 不支援 | 
| EC2 | Amazon EBS 磁碟區支援用於託管在使用 Amazon ECS 最佳化 Amazon Machine Image (AMI) 的 Nitro 型執行個體上的任務。如需有關執行個體類型的詳細資訊，請參閱 Amazon EC2 User Guide 中的 [Instance types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html)。ECS 最佳化 AMI `20231219` 及更新版本支援 Amazon EBS 磁碟區。如需詳細資訊，請參閱[擷取 Amazon ECS 最佳化 AMI 中繼資料](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/retrieve-ecs-optimized_AMI.html)。 | 使用 Amazon ECS 最佳化 Amazon Machine Image (AMI) 的 Nitro 型執行個體上託管的任務。如需有關執行個體類型的詳細資訊，請參閱 Amazon EC2 User Guide 中的 [Instance types](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html)。ECS 最佳化 AMI `20241017` 及更新版本支援 Amazon EBS 磁碟區。如需詳細資訊，請參閱[擷取 Amazon ECS 最佳化 Windows AMI 中繼資料](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/retrieve-ecs-optimized_windows_AMI.html)。 | 
| Amazon ECS 受管執行個體 | Amazon EBS 磁碟區支援用於託管在 Amazon ECS Linux 受管執行個體上的任務。 | 不支援 | 

## 考量事項
<a name="ebs-volume-considerations"></a>

 使用 Amazon EBS 磁碟區時，請考量下列事項：
+ 在 `use1-az3` 可用區域中，您無法設定要連接至 Fargate Amazon ECS 任務的 Amazon EBS 磁碟區。
+ 磁性 (`standard`) Amazon EBS 磁碟區類型不支援用於 Fargate 上託管的任務。如需有關 Amazon EBS 磁碟區類型的詳細資訊，請參閱 *Amazon EC2 User Guide* 中的 [Amazon EBS volumes](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volume-types.html)。
+ 建立在部署時設定磁碟區的服務或獨立任務時，需用到 Amazon ECS 基礎結構 IAM 角色。您可以將 AWS 託管的 `AmazonECSInfrastructureRolePolicyForVolumes` IAM 政策連接至該角色，也可參照該托管政策建立並連接自己的政策，該政策需具有符合特定需求的許可。如需詳細資訊，請參閱[Amazon ECS 基礎結構 IAM 角色](infrastructure_IAM_role.md)。
+ 每項 Amazon ECS 任務最多僅能連接一個 Amazon EBS 磁碟區，且必須是全新磁碟區。現有 Amazon EBS 磁碟區無法連接至任務。但在部署時，可透過現有磁碟區的快照來設定新的 Amazon EBS 磁碟區。
+ 若要將 Amazon EBS 磁碟區與 Amazon ECS 服務搭配使用，部署控制器必須是 `ECS`。使用此部署控制器時，滾動部署與藍/綠部署策略均受支援。
+ 若要讓任務中的容器寫入掛載的 Amazon EBS 磁碟區，容器必須具有適當的檔案系統許可。當您在容器定義中指定非根使用者時，Amazon ECS 會自動使用群組型許可來設定磁碟區，以允許指定的使用者讀取和寫入磁碟區。如果未指定使用者，容器會以根身分執行，並具有磁碟區的完整存取權。
+ Amazon ECS 會自動將 `AmazonECSCreated` 與 `AmazonECSManaged` 保留標籤新增至連接的磁碟區。如果從磁碟區中移除這些標籤，Amazon ECS 將無法代表您管理磁碟區。如需有關標記 Amazon EBS 磁碟區的詳細資訊，請參閱[標記 Amazon EBS 磁碟區](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specify-ebs-config.html#ebs-volume-tagging)。如需有關標記 Amazon ECS 資源的詳細資訊，請參閱[標記 Amazon ECS 資源](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-using-tags.html)。
+ 不支援從包含分割區的 Amazon EBS 磁碟區快照佈建磁碟區。
+ 連接至由服務管理之任務的磁碟區不會保留下來，一律會在任務終止時被刪除。
+ 您無法設定要連接至在 AWS Outposts上執行之 Amazon ECS 任務的 Amazon EBS 磁碟區。

# 非根使用者行為
<a name="ebs-non-root-behavior"></a>

當您在容器定義中指定非根使用者時，Amazon ECS 會自動使用群組型許可來設定 Amazon EBS 磁碟區，以允許指定的使用者讀取和寫入磁碟區。磁碟區是以下列特性掛載：
+ 磁碟區由根使用者和根群組擁有。
+ 群組許可設定為允許讀取和寫入存取。
+ 非根使用者會新增至適當的群組以存取磁碟區。

搭配非根容器使用 Amazon EBS 磁碟區時，請遵循下列最佳實務：
+ 在容器映像中使用一致的使用者 IDs(UIDs) 和群組 IDs GIDs)，以確保一致的許可。
+ 在容器映像中預先建立掛載點目錄，並設定適當的擁有權和許可。
+ 在開發環境中使用 Amazon EBS 磁碟區測試您的容器，以確認檔案系統許可如預期般運作。
+ 如果相同任務中的多個容器共用磁碟區，請確保它們使用相容的 UIDs/GIDs或掛載具有一致存取期望的磁碟區。

# 在 Amazon ECS 任務定義中將磁碟區組態延至啟動時進行
<a name="specify-ebs-config"></a>

若要設定 Amazon EBS 磁碟區以連接至任務，您必須在任務定義中指定掛載點組態，並為該磁碟區命名。您也必須將 `configuredAtLaunch` 設定為 `true`，因為無法在任務定義中設定 Amazon EBS 磁碟區進行連接。但可在部署期間設定 Amazon EBS 磁碟區進行連接。

若要使用 AWS Command Line Interface (AWS CLI) 註冊任務定義，請將範本儲存為 JSON 檔案，然後將檔案傳遞為 `[register-task-definition](https://docs.aws.amazon.com/cli/latest/reference/ecs/register-task-definition.html)`命令的輸入。

若要使用 建立和註冊任務定義 AWS 管理主控台，請參閱 [使用主控台建立 Amazon ECS 任務定義](create-task-definition.md)。

以下任務定義展示了 `mountPoints` 與 `volumes` 物件在任務定義中的語法。如需有關任務定義參數的詳細資訊，請參閱 [Fargate 的 Amazon ECS 任務定義參數](task_definition_parameters.md)。若要使用此範例，請以您自己的資訊取代 `user input placeholders`。

## Linux
<a name="linux-example"></a>

```
{
    "family": "mytaskdef",
    "containerDefinitions": [
        {
            "name": "nginx",
            "image": "public.ecr.aws/nginx/nginx:latest",
            "networkMode": "awsvpc",
           "portMappings": [
                {
                    "name": "nginx-80-tcp",
                    "containerPort": 80,
                    "hostPort": 80,
                    "protocol": "tcp",
                    "appProtocol": "http"
                }
            ],
            "mountPoints": [
                {
                    "sourceVolume": "myEBSVolume",
                    "containerPath": "/mount/ebs",
                    "readOnly": true
                }
            ]
        }
    ],
    "volumes": [
        {
            "name": "myEBSVolume",
            "configuredAtLaunch": true
        }
    ],
    "requiresCompatibilities": [
        "FARGATE", "EC2"
    ],
    "cpu": "1024",
    "memory": "3072",
    "networkMode": "awsvpc"
}
```

## Windows
<a name="windows-example"></a>

```
{
    "family": "mytaskdef",
     "memory": "4096",
     "cpu": "2048",
    "family": "windows-simple-iis-2019-core",
    "executionRoleArn": "arn:aws:iam::012345678910:role/ecsTaskExecutionRole",
    "runtimePlatform": {"operatingSystemFamily": "WINDOWS_SERVER_2019_CORE"},
    "requiresCompatibilities": ["EC2"]
    "containerDefinitions": [
        {
             "command": ["New-Item -Path C:\\inetpub\\wwwroot\\index.html -Type file -Value '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>Congratulations!</h2> <p>Your application is now running on a container in Amazon ECS.</p>'; C:\\ServiceMonitor.exe w3svc"],
            "entryPoint": [
                "powershell",
                "-Command"
            ],
            "essential": true,
            "cpu": 2048,
            "memory": 4096,
            "image": "mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019",
            "name": "sample_windows_app",
            "portMappings": [
                {
                    "hostPort": 443,
                    "containerPort": 80,
                    "protocol": "tcp"
                }
            ],
            "mountPoints": [
                {
                    "sourceVolume": "myEBSVolume",
                    "containerPath": "drive:\ebs",
                    "readOnly": true
                }
            ]
        }
    ],
    "volumes": [
        {
            "name": "myEBSVolume",
            "configuredAtLaunch": true
        }
    ],
    "requiresCompatibilities": [
        "FARGATE", "EC2"
    ],
    "cpu": "1024",
    "memory": "3072",
    "networkMode": "awsvpc"
}
```

`mountPoints`  
類型：物件陣列  
必要：否  
容器中資料磁碟區的掛載點。此參數會映射至 Docker API 中 create-container 的 `Volumes`，以及 docker run 的 `--volume` 選項。  
Windows 容器可在 `$env:ProgramData` 所在的相同磁碟上掛載整個目錄。Windows 容器無法在不同的磁碟機上掛載目錄，且掛載點不能跨磁碟機使用。您必須指定掛載點，將 Amazon EBS 磁碟區直接連接至 Amazon ECS 任務。    
`sourceVolume`  
類型：字串  
必要：是 (當使用 `mountPoints` 時)  
要掛載的磁碟區名稱。  
`containerPath`  
類型：字串  
必要：是 (當使用 `mountPoints` 時)  
掛載磁碟區之容器中的路徑。  
`readOnly`  
類型：布林值  
必要：否  
如果此數值為 `true`，容器擁有磁碟區的唯讀存取權。如果此值為 `false`，則容器可寫入磁碟區。預設值為 `false`。  
對於在執行 Windows 作業系統之 EC2 執行個體上執行的任務，將該值保留為預設值 `false`。

`name`  
類型：字串  
必要：否  
磁碟區名稱。最多可輸入 255 個字母 (大小寫)、數字、連字號 (`-`) 與底線 (`_`)。在容器定義 `mountPoints` 物件的 `sourceVolume` 參數中參考此名稱。

`configuredAtLaunch`  
類型：布林值  
必要：是，當您想要直接將 EBS 磁碟區連接至任務時。  
指定磁碟區可否在啟動時設定。若設定為 `true`，您可以在執行獨立任務或建立/更新服務時設定磁碟區。若設定為 `false`，您無法在任務定義中提供另一個磁碟區組態。必須提供此參數並將其設定為 `true`，以設定要連接至任務的 Amazon EBS 磁碟區。

# 加密儲存於連接至 Amazon ECS 任務之 Amazon EBS 磁碟區中的資料
<a name="ebs-kms-encryption"></a>

您可以使用 AWS Key Management Service (AWS KMS) 來建立和管理保護資料的密碼編譯金鑰。Amazon EBS 磁碟區是使用 進行靜態加密 AWS KMS keys。以下類型的資料會經過加密：
+ 儲存在磁碟區上的靜態資料
+ 磁碟 I/O 資料
+ 從磁碟區建立的快照
+ 從加密快照建立的新磁碟區

連接至任務的 Amazon EBS 磁碟區可透過以下兩種金鑰加密：一是別名為 `alias/aws/ebs` 的預設 AWS 受管金鑰 ，二是磁碟區組態中指定的對稱客戶自管金鑰。 AWS 帳戶 每個 的預設值 AWS 受管金鑰 都是唯一的 AWS 區域 ，且會自動建立。若要建立對稱客戶自管金鑰，請遵循 *AWS KMS Developer Guide* 中的 [Creating symmetric encryption KMS keys](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk) 章節所述步驟進行。

您可以預設設定 Amazon EBS 加密，以便使用您為帳戶指定的 KMS 金鑰來 AWS 區域 加密在特定 中建立並連接至任務的所有新磁碟區。如需有關 Amazon EBS 加密與預設加密的詳細資訊，請參閱 * Developer Guide* 中的 [Amazon EBS encryption](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-encryption.html)。

## Amazon ECS 受管執行個體行為
<a name="managed-instances"></a>

您可以透過啟用加密功能來為 Amazon EBS 磁碟區加密，一種方式是啟用預設加密功能，另一種方式是在建立要加密的磁碟區時直接啟用加密功能。如需有關如何啟用預設加密功能 (帳戶層級) 的資訊，請參閱 *Amazon EBS User Guide* 中的 [Encryption by default](https://docs.aws.amazon.com/ebs/latest/userguide/encryption-by-default.html)。

您可以設定這些金鑰的任意組合。KMS 金鑰的優先順序如下：

1. 磁碟區組態中指定的 KMS 金鑰。在磁碟區組態中指定 KMS 金鑰時，其會覆寫 Amazon EBS 預設值以及在帳戶層級指定的任何 KMS 金鑰。

1. 在帳戶層級指定的 KMS 金鑰。在為 Amazon ECS 受管儲存體指定叢集層級的加密 KMS 金鑰時，其會覆寫 Amazon EBS 預設加密，但不會覆寫磁碟區組態中指定的任何 KMS 金鑰。

1. Amazon EBS 預設加密。如果您未指定帳戶層級 KMS 金鑰，也未在磁碟區組態中指定金鑰，則會套用預設加密。如果您啟用 Amazon EBS 預設加密，則預設使用的是您為預設加密指定的 KMS 金鑰。否則，預設使用別名為 `alias/aws/ebs` 的 AWS 受管金鑰 。
**注意**  
若在磁碟區組態中將 `encrypted` 設定為 `false`，不指定帳戶層級 KMS 金鑰，但啟用 Amazon EBS 預設加密，則該磁碟區仍會使用為 Amazon EBS 預設加密指定的金鑰進行加密。

## 非 Amazon ECS 受管執行個體行為
<a name="non-managed-instances"></a>

您也可以在建立或更新叢集時，設定 Amazon ECS 受管儲存體的 Amazon ECS 叢集層級加密。叢集層級加密會在任務層級生效，可用於透過指定的 KMS 金鑰，對連接至特定叢集中執行之每項任務的 Amazon EBS 磁碟區進行加密。如需有關為每項任務設定叢集層級加密的詳細資訊，請參閱 *Amazon ECS API reference* 中的 [ManagedStorageConfiguration](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ManagedStorageConfiguration.html)。

您可以設定這些金鑰的任意組合。KMS 金鑰的優先順序如下：

1. 磁碟區組態中指定的 KMS 金鑰。在磁碟區組態中指定 KMS 金鑰時，其會覆寫 Amazon EBS 預設值以及在叢集層級指定的任何 KMS 金鑰。

1. 在叢集層級指定的 KMS 金鑰。在為 Amazon ECS 受管儲存體指定叢集層級的加密 KMS 金鑰時，其會覆寫 Amazon EBS 預設加密，但不會覆寫磁碟區組態中指定的任何 KMS 金鑰。

1. Amazon EBS 預設加密。如果您未指定叢集層級 KMS 金鑰，也未在磁碟區組態中指定金鑰，則會套用預設加密。如果您啟用 Amazon EBS 預設加密，則預設使用的是您為預設加密指定的 KMS 金鑰。否則，預設值為 AWS 受管金鑰 具有別名 的 `alias/aws/ebs`。
**注意**  
若在磁碟區組態中將 `encrypted` 設定為 `false`，不指定叢集層級 KMS 金鑰，但啟用 Amazon EBS 預設加密，則該磁碟區仍會使用為 Amazon EBS 預設加密指定的金鑰進行加密。

## 客戶受管 KMS 金鑰政策
<a name="ebs-kms-encryption-policy"></a>

若要使用客戶自管金鑰加密連接至任務的 EBS 磁碟區，您必須設定 KMS 金鑰政策，確保用於磁碟區組態的 IAM 角色具有使用金鑰的必要許可。金鑰政策必須同時包含 `kms:CreateGrant` 與 `kms:GenerateDataKey*` 許可。加密使用快照建立的磁碟區時，需用到 `kms:ReEncryptTo` 與 `kms:ReEncryptFrom` 許可。如果只想為要連接的新空白磁碟區進行設定與加密，您可以排除 `kms:ReEncryptTo` 與 `kms:ReEncryptFrom` 許可。

下列 JSON 程式碼片段展示了可連接至 KMS 金鑰政策的金鑰政策陳述式。使用這些陳述式將提供 Amazon ECS 使用該金鑰加密 EBS 磁碟區的存取權。若要使用這些範例政策陳述式，請以自己的資訊取代 `user input placeholders`。與往常一樣，只設定需要的許可即可。

```
{
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111122223333:role/ecsInfrastructureRole" },
      "Action": "kms:DescribeKey",
      "Resource":"*"
    },
    {
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111122223333:role/ecsInfrastructureRole" },
      "Action": [
      "kms:GenerateDataKey*",
      "kms:ReEncryptTo",
      "kms:ReEncryptFrom"
      ],
      "Resource":"*",
      "Condition": {
        "StringEquals": {
          "kms:CallerAccount": "aws_account_id",
          "kms:ViaService": "ec2.region.amazonaws.com"
        },
        "ForAnyValue:StringEquals": {
          "kms:EncryptionContextKeys": "aws:ebs:id"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": { "AWS": "arn:aws:iam::111122223333:role/ecsInfrastructureRole" },
      "Action": "kms:CreateGrant",
      "Resource":"*",
      "Condition": {
        "StringEquals": {
          "kms:CallerAccount": "aws_account_id",
          "kms:ViaService": "ec2.region.amazonaws.com"
        },
        "ForAnyValue:StringEquals": {
          "kms:EncryptionContextKeys": "aws:ebs:id"
        },
        "Bool": {
          "kms:GrantIsForAWSResource": true
        }
      }
    }
```

如需有關金鑰政策與許可的詳細資訊，請參閱 *AWS KMS Developer Guide* 中的 [Key policies in AWS KMS](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html) 與 [AWS KMS permissions](https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html)。如需對與金鑰許可相關的 EBS 磁碟區連接問題進行疑難排解，請參閱[對 Amazon ECS 任務的 Amazon EBS 磁碟區連接問題進行疑難排解](troubleshoot-ebs-volumes.md)。

# 在部署 Amazon ECS 時指定 Amazon EBS 磁碟區組態
<a name="configure-ebs-volume"></a>

在註冊任務定義 (`configuredAtLaunch` 參數設定為 `true`) 之後，即可在部署時 (執行獨立任務或建立/更新服務時) 設定 Amazon EBS 磁碟區。如需有關使用 `configuredAtLaunch` 參數將磁碟區組態延至啟動時進行的詳細資訊，請參閱[在 Amazon ECS 任務定義中將磁碟區組態延至啟動時進行](specify-ebs-config.md)。

若要設定磁碟區，您可以使用 Amazon ECS APIs，也可以傳遞 JSON 檔案做為下列 AWS CLI 命令的輸入：
+ `[run-task](https://docs.aws.amazon.com/cli/latest/reference/ecs/run-task.html)`：用於執行獨立的 ECS 任務。
+ `[start-task](https://docs.aws.amazon.com/cli/latest/reference/ecs/start-task.html)`：用在特定容器執行個體中執行獨立的 ECS 任務。此命令不適用於 Fargate 任務。
+ `[create-service](https://docs.aws.amazon.com/cli/latest/reference/ecs/create-service.html)`：用於建立新的 ECS 服務。
+ `[update-service](https://docs.aws.amazon.com/cli/latest/reference/ecs/update-service.html)`：用於更新現有服務。

**注意**  
若要讓任務中的容器寫入掛載的 Amazon EBS 磁碟區，容器必須具有適當的檔案系統許可。當您在容器定義中指定非根使用者時，Amazon ECS 會自動使用群組型許可來設定磁碟區，以允許指定的使用者讀取和寫入磁碟區。如果未指定使用者，容器會以根身分執行，並具有磁碟區的完整存取權。

 您也可以使用 AWS 管理主控台來設定 Amazon EBS 磁碟區。如需詳細資訊，請參閱[將應用程式作為 Amazon ECS 任務執行](standalone-task-create.md)、[建立 Amazon ECS 滾動更新部署](create-service-console-v2.md)及[更新 Amazon ECS 服務](update-service-console-v2.md)。

下列 JSON 程式碼片段展示了可在部署時設定的 Amazon EBS 磁碟區的所有參數。若要將這些參數用於磁碟區組態，請以自己的資訊取代 `user input placeholders`。如需有關這些參數的詳細資訊，請參閱[磁碟區組態](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service_definition_parameters.html#sd-volumeConfigurations)。

```
"volumeConfigurations": [
        {
            "name": "ebs-volume", 
            "managedEBSVolume": {
                "encrypted": true, 
                "kmsKeyId": "arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab", 
                "volumeType": "gp3", 
                "sizeInGiB": 10, 
                "snapshotId": "snap-12345", 
                "volumeInitializationRate":100,
                "iops": 3000, 
                "throughput": 125, 
                "tagSpecifications": [
                    {
                        "resourceType": "volume", 
                        "tags": [
                            {
                                "key": "key1", 
                                "value": "value1"
                            }
                        ], 
                        "propagateTags": "NONE"
                    }
                ], 
                "roleArn": "arn:aws:iam::1111222333:role/ecsInfrastructureRole", 
                 "terminationPolicy": {
                    "deleteOnTermination": true//can't be configured for service-managed tasks, always true 
                },
                "filesystemType": "ext4"
            }
        }
    ]
```

**重要**  
請確保您在組態中指定的 `volumeName` 與在任務定義中指定的 `volumeName` 相同。

如需有關檢查磁碟區連接狀態的詳細資訊，請參閱[對 Amazon ECS 任務的 Amazon EBS 磁碟區連接問題進行疑難排解](troubleshoot-ebs-volumes.md)。如需 EBS 磁碟區連接所需的 Amazon ECS 基礎設施 AWS Identity and Access Management (IAM) 角色資訊，請參閱 [Amazon ECS 基礎結構 IAM 角色](infrastructure_IAM_role.md)。

以下 JSON 程式碼片段範例展示了 Amazon EBS 磁碟區組態。這些範例可以透過將程式碼片段儲存在 JSON 檔案中，並將檔案做為 AWS CLI 命令的參數 （使用 `--cli-input-json file://filename` 參數） 傳遞來使用。以您自己的資訊取代 `user input placeholders`。

## 為獨立任務設定磁碟區
<a name="ebs-run-task"></a>

下列程式碼片段展示了用於設定 Amazon EBS 磁碟區以連接至獨立任務的語法。下列 JSON 程式碼片段展示了用於設定 `volumeType`、`sizeInGiB`、`encrypted` 與 `kmsKeyId` 的語法。JSON 檔案中指定的組態將用於建立 EBS 磁碟區並將其連接至獨立任務。

```
{
   "cluster": "mycluster",
   "taskDefinition": "mytaskdef",
   "volumeConfigurations": [
        {
            "name": "datadir",
            "managedEBSVolume": {
                "volumeType": "gp3",
                "sizeInGiB": 100,
                "roleArn":"arn:aws:iam::1111222333:role/ecsInfrastructureRole",
                "encrypted": true,
                "kmsKeyId": "arn:aws:kms:region:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
            }
        }
   ]
}
```

## 在建立服務時設定磁碟區
<a name="ebs-create-service"></a>

下列程式碼片段展示了用於設定 Amazon EBS 磁碟區以連接至由服務管理之任務的語法。這些磁碟區來源於透過 `snapshotId` 參數指定的快照，傳輸速率為 200 MiB/s。JSON 檔案中指定的組態將用於建立 EBS 磁碟區並將其連接至由服務管理的每項任務。

```
{
   "cluster": "mycluster",
   "taskDefinition": "mytaskdef",
   "serviceName": "mysvc",
   "desiredCount": 2,
   "volumeConfigurations": [
        {
            "name": "myEbsVolume",
            "managedEBSVolume": {
              "roleArn":"arn:aws:iam::1111222333:role/ecsInfrastructureRole",
              "snapshotId": "snap-12345",
              "volumeInitializationRate": 200
            }
        }
   ]
}
```

## 在更新服務時設定磁碟區
<a name="ebs-update-service"></a>

下列 JSON 程式碼片段展示了用於更新先前未設定 Amazon EBS 磁碟區以連接至任務之服務的語法。您必須提供任務定義修訂版的 ARN，並將 `configuredAtLaunch` 設定為 `true`。下列 JSON 程式碼片段展示了用於設定 `volumeType`、`sizeInGiB`、`throughput` 與 `iops` 以及 `filesystemType` 的語法。此組態用於建立 EBS 磁碟區，並將其連接至由服務管理的每項任務。

```
{
   "cluster": "mycluster",
   "taskDefinition": "mytaskdef",
   "service": "mysvc",
   "desiredCount": 2,
   "volumeConfigurations": [
        {
            "name": "myEbsVolume",
            "managedEBSVolume": {
              "roleArn":"arn:aws:iam::1111222333:role/ecsInfrastructureRole",
               "volumeType": "gp3",
                "sizeInGiB": 100,
                 "iops": 3000, 
                "throughput": 125, 
                "filesystemType": "ext4"
            }
        }
   ]
}
```

### 將服務設定為不再使用 Amazon EBS 磁碟區
<a name="ebs-service-disable-ebs"></a>

下列 JSON 程式碼片段展示了用於更新服務以不再使用 Amazon EBS 磁碟區的語法。您必須提供一個將 `configuredAtLaunch` 設定為 `false` 的任務定義 ARN，或提供一個不包含 `configuredAtLaunch` 參數的任務定義。您還必須提供空 `volumeConfigurations` 物件。

```
{
   "cluster": "mycluster",
   "taskDefinition": "mytaskdef",
   "service": "mysvc",
   "desiredCount": 2,
   "volumeConfigurations": []
}
```

## Amazon EBS 磁碟區的終止政策
<a name="ebs-volume-termination-policy"></a>

當 Amazon ECS 任務終止時，Amazon ECS 會依據 `deleteOnTermination` 值，判斷是否應刪除與已終止任務相關聯的 Amazon EBS 磁碟區。依預設，在任務終止後，會刪除連接至任務的 EBS 磁碟區。對於獨立任務，您可以變更此設定，在任務終止時保留磁碟區。

**注意**  
連接至由服務管理之任務的磁碟區不會保留下來，一律會在任務終止時被刪除。

## 標記 Amazon EBS 磁碟區
<a name="ebs-volume-tagging"></a>

您可以使用 `tagSpecifications` 物件來標記 Amazon EBS 磁碟區。透過該物件，您可以提供自訂標籤，也可以根據磁碟區是連接至獨立任務還是服務中的任務，設定標籤是從任務定義還是從服務進行傳播。一個磁碟區最多可連接 50 個標籤。

**重要**  
Amazon ECS 會自動將 `AmazonECSCreated` 和 `AmazonECSManaged` 保留標籤附加至 Amazon EBS 磁碟區。這表示您最多可以控制為一個磁碟區連接 48 個額外標籤。這些額外標籤可為使用者自訂標籤、ECS 受管標籤或傳播標籤。

若想為磁碟區新增 Amazon ECS 受管標籤，必須在呼叫 `UpdateService`、`CreateService`、`RunTask` 或 `StartTask` 時，將 `enableECSManagedTags` 設定為 `true`。開啟 Amazon ECS 受管標籤功能後，Amazon ECS 會自動為磁碟區新增包含叢集與服務資訊的標籤 (即 `aws:ecs:clusterName` 與 `aws:ecs:serviceName`)。如需有關標記 Amazon ECS 資源的詳細資訊，請參閱[標記 Amazon ECS 資源](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-using-tags.html)。

下列 JSON 程式碼片段展示了用於為連接至服務中每項任務的每個 Amazon EBS 磁碟區新增使用者自訂標籤的語法。若要使用此範例建立服務，請以自己的資訊取代 `user input placeholders`。

```
{
   "cluster": "mycluster",
   "taskDefinition": "mytaskdef",
   "serviceName": "mysvc",
   "desiredCount": 2,
   "enableECSManagedTags": true,
   "volumeConfigurations": [
        {
            "name": "datadir",
            "managedEBSVolume": {
                "volumeType": "gp3",
                "sizeInGiB": 100,
                 "tagSpecifications": [
                    {
                        "resourceType": "volume", 
                        "tags": [
                            {
                                "key": "key1", 
                                "value": "value1"
                            }
                        ], 
                        "propagateTags": "NONE"
                    }
                ],
                "roleArn":"arn:aws:iam:1111222333:role/ecsInfrastructureRole",
                "encrypted": true,
                "kmsKeyId": "arn:aws:kms:region:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab"
            }
        }
   ]
}
```

**重要**  
您必須指定 `volume` 資源類型來標記 Amazon EBS 磁碟區。

# Fargate 隨需任務的 Amazon EBS 磁碟區效能
<a name="ebs-fargate-performance-limits"></a>

Fargate 隨需任務可用的基準 Amazon EBS 磁碟區 IOPS 與輸送量，取決於您為任務請求的 CPU 總單位數。如果您為 Fargate 任務請求 0.25、0.5 或 1 個虛擬 CPU 單位 (vCPU)，建議您設定一般用途 SSD 磁碟區 (`gp2` 或 `gp3`) 或硬碟磁碟機 (HDD) 磁碟區 (`st1` 或 `sc1`)。如果為 Fargate 任務請求超過 1 個 vCPU，則下列基準效能限制適用於連接至任務的 Amazon EBS 磁碟區。您取得的 EBS 效能可能會暫時高於下列限制，但建議您根據這些限制來規劃工作負載。


| 請求的 CPU 單位數 (vCPU) | 基準 Amazon EBS IOPS (16 KiB I/O) | 基準 Amazon EBS 輸送量 (MiBps、128 KiB I/O) | 基準頻寬 (Mbps) | 
| --- | --- | --- | --- | 
| 2 | 3,000 | 75 | 360 | 
| 4 | 5,000 | 120 | 1,150 | 
| 8 | 10,000 | 250 | 2,300 | 
| 16 | 15,000 | 500 | 4，500 | 

**注意**  
 在設定要連接至 Fargate 任務的 Amazon EBS 磁碟區時，Fargate 任務的 Amazon EBS 效能限制會在任務的暫時性儲存體與連接的磁碟區之間共用。

# EC2 任務的 Amazon EBS 磁碟區效能
<a name="ebs-fargate-performance-limits-ec2"></a>

Amazon EBS 提供有不同效能特性及價格的磁碟區類型，可讓您量身打造符合應用程式需求的儲存效能與成本。如需有關效能的資訊，包括每個磁碟區的 IOPS 與每個磁碟區的輸送量，請參閱 *Amazon Elastic Block Store User Guide* 中的 [Amazon EBS volume types](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volume-types.html)。

# Amazon ECS 受管執行個體任務的 Amazon EBS 磁碟區效能
<a name="ebs-managed-instances-performance"></a>

Amazon EBS 提供有不同效能特性及價格的磁碟區類型，可讓您量身打造符合應用程式需求的儲存效能與成本。如需有關效能的資訊，包括每個磁碟區的 IOPS 與每個磁碟區的輸送量，請參閱 *Amazon Elastic Block Store User Guide* 中的 [Amazon EBS volume types](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volume-types.html)。

# 對 Amazon ECS 任務的 Amazon EBS 磁碟區連接問題進行疑難排解
<a name="troubleshoot-ebs-volumes"></a>

您可能需要對 Amazon EBS 磁碟區連接至 Amazon ECS 任務的相關情況進行疑難排解或驗證。

## 檢查磁碟區連接狀態
<a name="troubleshoot-ebs-volumes-location"></a>

您可以使用 AWS 管理主控台 檢視 Amazon EBS 磁碟區連接至 Amazon ECS 任務的狀態。若任務啟動但連接失敗，您也會看到用於疑難排解的狀態原因。此時，建立的磁碟區將被刪除，任務也會停止。如需有關狀態原因的詳細資訊，請參閱[Amazon EBS 磁碟區連接至 Amazon ECS 任務的狀態原因](troubleshoot-ebs-volumes-scenarios.md)。

**使用主控台檢視磁碟區的連接狀態與狀態原因**

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 在**叢集**頁面上，選擇任務執行所在的叢集。叢集詳細資訊頁面隨即出現。

1. 在叢集詳細資訊頁面中，選擇**任務**索引標籤。

1. 選擇要檢視磁碟區連接狀態的任務。若要檢查的任務已停止，可能需要使用**篩選預期狀態**並選擇**已停止**。

1. 在任務詳細資訊頁面上，選擇**磁碟區**索引標籤。您將能夠在**連接狀態**下方檢視 Amazon EBS 磁碟區的連接狀態。若磁碟區連接至任務失敗，可選擇**連接狀態**下方的狀態資訊，顯示失敗原因。

您也可透過 [DescribeTasks](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTasks.html) API 檢視任務的磁碟區連接狀態及對應的狀態原因。

## 服務與任務失敗
<a name="service-task-failures"></a>

您可能會遇到非 Amazon EBS 磁碟區特有的服務或任務失敗問題，這類問題仍可能影響磁碟區的連接。如需詳細資訊，請參閱
+ [服務事件訊息](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-event-messages.html)
+ [已停止任務的錯誤代碼](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/stopped-task-error-codes.html)
+ [API 失敗原因](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/api_failures_messages.html)

# 容器無法寫入 Amazon EBS 磁碟區
<a name="troubleshoot-non-root-container"></a>

沒有適當許可的非根使用者  
當您在容器定義中指定非根使用者時，Amazon ECS 會自動設定具有群組型許可的磁碟區，以允許寫入存取。不過，如果您仍然遇到許可問題：  
+ 使用 格式 `uid:gid`（例如 )，確認您的容器定義中已正確指定 `user` 參數`1001:1001`。
+ 確保掛載磁碟區後，您的容器映像不會覆寫使用者許可。
+ 透過檢查容器日誌或使用 Amazon ECS Exec 檢查執行中的容器，檢查您的應用程式是否使用預期的使用者 ID 執行。

具有許可問題的根使用者  
如果您的容器定義中未指定使用者，則容器會以根身分執行，且應具有磁碟區的完整存取權。如果您遇到問題：  
+ 檢查容器內的掛載點，確認磁碟區已正確掛載。
+ 請確定掛載點組態中的磁碟區未設定為唯讀。

具有不同使用者的多容器任務  
在具有多個容器以不同使用者身分執行的任務中，Amazon ECS 會自動管理群組許可，以允許所有指定的使用者寫入磁碟區。如果容器無法寫入：  
+ 確認所有需要寫入存取權的容器都已正確設定 `user` 參數。
+ 檢查磁碟區是否掛載在需要存取磁碟區的所有容器中。

如需在容器定義中設定使用者的詳細資訊，請參閱 [ Fargate 的 Amazon ECS 任務定義參數](https://docs.aws.amazon.com/./task_definition_parameters.html)。

# Amazon EBS 磁碟區連接至 Amazon ECS 任務的狀態原因
<a name="troubleshoot-ebs-volumes-scenarios"></a>

使用下列參考來修正您在設定 Amazon EBS 磁碟區以連接至 Amazon ECS 任務 AWS 管理主控台 時，在 中以狀態原因形式可能遇到的問題。如需有關在主控台中尋找這些狀態原因的詳細資訊，請參閱[檢查磁碟區連接狀態](troubleshoot-ebs-volumes.md#troubleshoot-ebs-volumes-location)。

ECS was unable to assume the configured ECS Infrastructure Role 'arn:aws:iam::*111122223333*:role/*ecsInfrastructureRole*'. Please verify that the role being passed has the proper trust relationship with Amazon ECS  
此狀態原因會出現在下列案例中。  
+  您提供的 IAM 角色未連接必要的信任政策。若角色缺少必要的信任政策，Amazon ECS 將無法存取您提供的 Amazon ECS 基礎結構 IAM 角色。任務可能會卡在 `DEPROVISIONING` 狀態。如需有關必要信任政策的詳細資訊，請參閱 [Amazon ECS 基礎結構 IAM 角色](infrastructure_IAM_role.md)。
+ 您的 IAM 使用者沒有將 Amazon ECS 基礎結構角色傳遞給 Amazon ECS 的許可。任務可能會卡在 `DEPROVISIONING` 狀態。若要避免此問題，您可以將 `PassRole` 許可連接至使用者。如需詳細資訊，請參閱[Amazon ECS 基礎結構 IAM 角色](infrastructure_IAM_role.md)。
+ 您的 IAM 角色沒有 Amazon EBS 磁碟區連接所需的必要許可。任務可能會卡在 `DEPROVISIONING` 狀態。如需有關將 Amazon EBS 磁碟區連接至任務所需特定許可的詳細資訊，請參閱 [Amazon ECS 基礎結構 IAM 角色](infrastructure_IAM_role.md)。
您也可能因角色傳播延遲而看到此錯誤訊息。若等待幾分鐘後重新嘗試使用該角色仍無法修復問題，有可能是您對該角色的信任政策設定錯誤。

ECS failed to set up the EBS volume. Encountered IdempotentParameterMismatch"; "The client token you have provided is associated with a resource that is already deleted. Please use a different client token."  
下列 AWS KMS 關鍵案例可能會導致`IdempotentParameterMismatch`訊息出現：  
+ 您指定的 KMS 金鑰 ARN、ID 或別名無效。在此案例中，任務可能看起來已成功啟動，但任務最終會失敗，因為 會以非同步方式 AWS 驗證 KMS 金鑰。如需詳細資訊，請參閱 *Amazon EC2 User Guide* 中的 [Amazon EBS encryption](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-encryption.html)。
+ 您提供的客戶自管金鑰缺少必要許可，導致 Amazon ECS 基礎結構 IAM 角色無法使用該金鑰進行加密。若要避免金鑰政策許可問題，請參閱 [Amazon EBS 磁碟區資料加密](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ebs-volumes.html#ebs-kms-encryption)中的範例 AWS KMS 金鑰政策。
您可以設定 Amazon EventBridge，將 Amazon EBS 磁碟區事件與 Amazon ECS 任務狀態變更事件傳送至目標，例如 Amazon CloudWatch 群組。然後，您可透過這些事件識別影響磁碟區連接的特定客戶自管金鑰相關問題。如需詳細資訊，請參閱  
+  [如何建立 CloudWatch 日誌群組，做為 re：Post 上 EventBridge 規則的目標？](https://repost.aws/knowledge-center/cloudwatch-log-group-eventbridge)。 AWS 
+ [任務狀態變更事件](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_cwe_events.html#ecs_task_events)。
+ *Amazon EBS User Guide* 中的 [Amazon EventBridge events for Amazon EBS](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-cloud-watch-events.html)。

ECS timed out while configuring the EBS volume attachment to your Task.  
下列檔案系統格式案例會導致出現此訊息。  
+ 您在設定期間指定的檔案系統格式與[任務的作業系統](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RuntimePlatform.html)不相容。
+ 您設定要從快照建立的 Amazon EBS 磁碟區，但快照的檔案系統格式與任務的作業系統不相容。對於從快照建立的磁碟區，您必須指定與建立快照時磁碟區所使用的相同檔案系統類型。
您可利用 Amazon ECS 容器代理程式日誌，就此訊息對 EC2 任務進行疑難排解。如需詳細資訊，請參閱 [Amazon ECS 日誌檔案位置](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/logs.html)與 [Amazon ECS 日誌收集器](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-logs-collector.html)。

# 將 Amazon EFS 磁碟區與 Amazon ECS 搭配使用
<a name="efs-volumes"></a>

Amazon Elastic File System (Amazon EFS) 提供簡單且可擴展的檔案儲存體，可與 Amazon ECS 任務搭配使用。利用 Amazon EFS，儲存容量即可有彈性。儲存容量會隨著您新增和移除檔案時自動擴展和縮減。您的應用程式可在需要時具備所需的儲存容量。

您可以搭配使用 Amazon EFS 檔案系統與 Amazon ECS，來匯出整個容器執行個體之機群的檔案系統資料。如此一來，無論您的任務位於哪個執行個體，都可存取相同的持久性儲存體。您的任務定義也必須參考容器執行個體上所掛載的磁碟區，才可使用檔案系統。

如需教學，請參閱[使用主控台為 Amazon ECS 設定 Amazon EFS 檔案系統](tutorial-efs-volumes.md)。

## 考量事項
<a name="efs-volume-considerations"></a>

 使用 Amazon EFS 磁碟區時，請考量下列事項：
+ 對於在 EC2 上執行的任務，Amazon EFS 檔案系統支援作為公開預覽版，隨帶有容器代理程式版本 1.35.0 的 Amazon ECS 最佳化 AMI 版本 `20191212` 一同推出。不過，Amazon EFS 檔案系統支援廣泛使用 Amazon ECS 最佳化 AMI `20200319` 版與容器代理程式 1.38.0 版，這包含 Amazon EFS 存取點和 IAM 授權功能。建議您使用 Amazon ECS 最佳化 AMI 版本 `20200319` 或更新版本以使用這些功能。如需詳細資訊，請參閱[Amazon ECS 最佳化 Linux AMI](ecs-optimized_AMI.md)。
**注意**  
如果您建立自己的 AMI，則必須使用容器代理程式 1.38.0 或更新版本、`ecs-init` 1.38.0-1 版或更新版本，並在 Amazon EC2 執行個體上執行下列命令以啟用 Amazon ECS 磁碟區外掛程式。這些命令取決於您是否使用 Amazon Linux 2 或 Amazon Linux 作為基礎映像。  
Amazon Linux 2  

  ```
  yum install amazon-efs-utils
  systemctl enable --now amazon-ecs-volume-plugin
  ```
Amazon Linux  

  ```
  yum install amazon-efs-utils
  sudo shutdown -r now
  ```
+ 對於託管於 Fargate 的任務，平台版本 1.4.0 或更新版本 (Linux) 上支援 Amazon EFS 檔案系統。如需詳細資訊，請參閱[適用於 Amazon ECS 的 Fargate 平台版本](platform-fargate.md)。
+ 在 Fargate 上託管的任務使用 Amazon EFS 磁碟區時，Fargate 會建立負責管理 Amazon EFS 磁碟區的監督容器。監督容器使用少量的任務記憶體與 CPU。查詢任務中繼資料第 4 版端點時，可看見監督容器。此外，其在 CloudWatch Container Insights 中顯示為容器名稱 `aws-fargate-supervisor`。如需有關使用 EC2 的詳細資訊，請參閱 [Amazon ECS 任務中繼資料端點第 4 版](task-metadata-endpoint-v4.md)。如需有關使用 Fargate 的詳細資訊，請參閱 [Fargate 上任務的 Amazon ECS 任務中繼資料端點第 4 版](task-metadata-endpoint-v4-fargate.md)。
+ 外部執行個體不支援使用 Amazon EFS 磁碟區或指定 `EFSVolumeConfiguration`。
+ 執行於 Amazon ECS 受管執行個體上的任務，支援使用 Amazon EFS 磁碟區。
+ 建議您將代理程式組態檔案中的 `ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION` 參數，設定為小於預設值 (約 1 小時) 的值。此變更有助於防止 EFS 掛載憑證過期，並允許清除未在使用中的掛載。如需詳細資訊，請參閱 [Amazon ECS 容器代理程式組態](ecs-agent-config.md)。

## 使用 Amazon EFS 存取點
<a name="efs-volume-accesspoints"></a>

Amazon EFS 存取點是應用程式特定的 EFS 檔案系統進入點，以管理應用程式存取共用資料集。如需有關 Amazon EFS 存取點及如何控制對它們的存取的詳細資訊，請參閱《Amazon Elastic File System 使用者指南》中的[使用 Amazon EFS 存取點](https://docs.aws.amazon.com/efs/latest/ug/efs-access-points.html)。

存取點可以針對透過存取點發出的所有檔案系統請求，強制執行使用者身分 (包括使用者的 POSIX 群組)。存取點也可以針對檔案系統強制使用不同的根目錄。如此一來，用戶端只能存取指定目錄或其子目錄中的資料。

**注意**  
建立 EFS 存取點時，您可以在檔案系統上指定要做為根目錄的路徑。在 Amazon ECS 任務定義中使用存取點 ID 參考 EFS 檔案系統時，必須忽略根目錄或將其設定為 `/`，這會強制執行 EFS 存取點上設定的路徑。

您可以使用 Amazon ECS 任務 IAM 角色，以強制執行特定應用程式使用特定存取點。透過結合 IAM 政策與存取點，您可以為應用程式提供特定資料集的安全存取。如需如何使用任務 IAM 角色的詳細資訊，請參閱[Amazon ECS 任務 IAM 角色](task-iam-roles.md)。

# 搭配 Amazon ECS 使用 Amazon EFS 磁碟區的最佳實務
<a name="efs-best-practices"></a>

在搭配 Amazon ECS 使用 Amazon EFS 時，請注意下列最佳實務建議。

## Amazon EFS 磁碟區的安全與存取控制
<a name="storage-efs-security"></a>

Amazon EFS 提供存取控制功能，您可透過這些功能確保儲存在 Amazon EFS 檔案系統中的資料安全，且僅供有需求的應用程式存取。您可透過啟用靜態加密與傳輸中加密來保障資料安全。如需詳細資訊，請參閱 *Amazon Elastic File System 使用者指南*中的 [Amazon EFS 的資料加密](https://docs.aws.amazon.com/efs/latest/ug/encryption.html)。

除資料加密外，您也可透過 Amazon EFS 限制對檔案系統的存取。EFS 提供三種實作存取控制的方式。
+ **安全群組**：透過 Amazon EFS 掛載目標，您可以設定用於允許與拒絕網路流量的安全群組。您可對連接至 Amazon EFS 的安全群組進行設定，使其允許來自連接至 Amazon ECS 執行個體之安全群組的 NFS 流量 (連接埠 2049)；若使用 `awsvpc` 網路模式，則允許來自連接至 Amazon ECS 任務之安全群組的流量。
+ **IAM**：您可透過 IAM 限制對 Amazon EFS 檔案系統的存取。設定後，Amazon ECS 任務若需掛載 EFS 檔案系統，必須具備用於檔案系統存取的 IAM 角色。如需詳細資訊，請參閱 *Amazon Elastic File System User Guide* 中的 [Using IAM to control file system data access](https://docs.aws.amazon.com/efs/latest/ug/iam-access-control-nfs-efs.html)。

  IAM 政策也能強制執行預先定義的條件，例如要求用戶端在連線至 Amazon EFS 檔案系統時使用 TLS。如需詳細資訊，請參閱 *Amazon Elastic File System User Guide* 中的 [Amazon EFS condition keys for clients](https://docs.aws.amazon.com/efs/latest/ug/iam-access-control-nfs-efs.html#efs-condition-keys-for-nfs)。
+ **Amazon EFS 存取點**：Amazon EFS 存取點是應用程式專用於存取 Amazon EFS 檔案系統的進入點。您可以使用存取點為所有透過該存取點發出的檔案系統請求，強制執行使用者身分 (包括使用者的 POSIX 群組)。存取點也可以針對檔案系統強制使用不同的根目錄。如此一來，用戶端只能存取指定目錄或其子目錄中的資料。

### IAM 政策
<a name="storage-efs-security-iam"></a>

您可透過 IAM 政策控制對 Amazon EFS 檔案系統的存取。

您可以使用檔案系統政策，為存取檔案系統的用戶端指定下列動作。


| Action | Description | 
| --- | --- | 
|  `elasticfilesystem:ClientMount`  |  提供檔案系統的唯讀存取權。  | 
|  `elasticfilesystem:ClientWrite`  |  在檔案系統上提供具有寫入權限。  | 
|  `elasticfilesystem:ClientRootAccess`  |  存取檔案系統時，提供使用根使用者的功能。  | 

您需要在政策中指定每個動作。這些政策可透過下列方式定義：
+ 基於用戶端 – 將政策連接至任務角色

  在建立任務定義時設定 **IAM 授權**選項。
+ 基於資源 – 將政策連接至 Amazon EFS 檔案系統

  若不存在基於資源的政策，預設會在檔案系統建立時將存取權授予所有主體 (\$1)。

在您設定 **IAM 授權**選項時，我們會合併與任務角色相關聯的政策，以及基於 Amazon EFS 資源的政策。**IAM 授權**選項會將任務身分 (任務角色) 與政策一同傳遞給 Amazon EFS。這讓基於 Amazon EFS 資源的政策能夠識別政策中指定的 IAM 使用者或角色背景資訊。如果您未設定該選項，Amazon EFS 資源層級政策會將 IAM 使用者識別為「匿名」。

為實現最高級別的安全性，建議在 Amazon EFS 檔案系統上同時實作三種存取控制方式。例如，您可以設定連接至 Amazon EFS 掛載點的安全群組，僅允許來自與容器執行個體或 Amazon ECS 任務相關聯的安全群組的 NFS 輸入流量。此外，即使連線來自已允許的安全群組，您仍可以設定 Amazon EFS，要求必須透過 IAM 角色才能存取檔案系統。最後，您可使用 Amazon EFS 存取點強制執行 POSIX 使用者許可，並為應用程式指定根目錄。

下列任務定義程式碼片段展示了如何透過存取點掛載 Amazon EFS 檔案系統。

```
"volumes": [
    {
      "efsVolumeConfiguration": {
        "fileSystemId": "fs-1234",
        "authorizationConfig": {
          "accessPointId": "fsap-1234",
          "iam": "ENABLED"
        },
        "transitEncryption": "ENABLED",
        "rootDirectory": ""
      },
      "name": "my-filesystem"
    }
]
```

## Amazon EFS 磁碟區效能
<a name="storage-efs-performance"></a>

Amazon EFS 提供兩種效能模式：一般用途與最大 I/O。一般用途模式適用於對延遲敏感的應用程式，例如內容管理系統與 CI/CD 工具。相對地，最大 I/O 檔案系統則適用於資料分析、媒體處理與機器學習等工作負載。這類工作負載需要透過數百甚至數千個容器執行平行操作，並且需要盡可能高的彙總輸送量與 IOPS。如需詳細資訊，請參閱 *Amazon Elastic File System User Guide* 中的 [Amazon EFS performance modes](https://docs.aws.amazon.com/efs/latest/ug/performance.html#performancemodes)。

部分對延遲敏感的工作負載，既需要最大 I/O 效能模式提供的較高 I/O 等級，也需要一般用途效能模式提供的較低延遲。對於這類工作負載，我們建議建立多個一般用途效能模式的檔案系統。只要工作負載與應用程式本身支援，您就能透過這種方式，將應用程式工作負載分散至所有這些檔案系統中。

## Amazon EFS 磁碟區輸送量
<a name="storage-efs-performance-throughput"></a>

所有 Amazon EFS 檔案系統皆有對應的計量輸送量，其數值取決於採用的輸送量模式：若是使用*佈建輸送量*的檔案系統，則取決於佈建輸送量的數量；若是使用*爆量輸送量*的檔案系統，則取決於儲存在 EFS Standard 或 One Zone 儲存類別中的資料量。如需詳細資訊，請參閱 *Amazon Elastic File System User Guide* 中的 [Understanding metered throughput](https://docs.aws.amazon.com/efs/latest/ug/performance.html#read-write-throughput)。

Amazon EFS 檔案系統預設的輸送量模式為爆量模式。使用爆量模式時，隨著檔案系統的成長，檔案系統可用的輸送量會隨之橫向擴充或縮減。由於檔案型工作負載通常會遽增，即在特定時間段需要高輸送量，其餘時間則只需低輸送量，因此 Amazon EFS 設計了爆量機制，可在特定時間段提供高輸送量。此外，因許多工作負載以讀取為主，故讀取操作的計量比例不同於其他 NFS 操作 (如寫入操作)，兩者計量比例為 1:3。

所有 Amazon EFS 檔案系統，針對每 TB 的 Amazon EFS Standard 或 Amazon EFS One Zone 儲存空間，皆能提供 50 MB/s 的穩定基准效能。無論容量大小，所有檔案系統皆可爆量至 100 MB/s 的輸送量。而超過 1 TB EFS Standard 或 EFS One Zone 儲存空間的檔案系統，每 TB 儲存空間可爆量至 100 MB/s 輸送量。由於讀取操作採用 1:3 的計量比例，每 TiB 儲存空間可支援高達 300 MiB/s 的讀取輸送量。在將資料新增至檔案系統時，檔案系統可使用的最大輸送量會隨著 Amazon EFS Standard 儲存類別中的儲存容量，自動呈線性擴展。若需要的輸送量超過以所儲存資料量能提供的輸送量，您可將佈建輸送量設定為工作負載所需的特定量。

檔案系統輸送量會由連線至同一檔案系統的所有 Amazon EC2 執行個體共用。例如，一個可爆量至 100 MB/s 輸送量的 1 TB 檔案系統，既可以由單個 Amazon EC2 執行個體獨占 100 MB/s 輸送量，也可以由 10 個 Amazon EC2 執行個體分用 (即每個執行個體各占用 10 MB/s)。如需詳細資訊，請參閱 *Amazon Elastic File System User Guide* 中的 [Amazon EFS performance](https://docs.aws.amazon.com/efs/latest/ug/performance.html)。

## 最佳化 Amazon EFS 磁碟區的成本
<a name="storage-efs-costopt"></a>

Amazon EFS 可為您簡化儲存空間的擴展程序。在新增更多資料時，Amazon EFS 檔案系統會自動擴增。特別是在 Amazon EFS *爆量輸送量*模式下，Amazon EFS 的輸送量會隨著標準儲存類別中檔案系統的容量增長而擴展。若想在不額外支付 EFS 檔案系統佈建輸送量費用的前提下提升輸送量，可將一個 Amazon EFS 檔案系統與多個應用程式共用。透過 Amazon EFS 存取點，您能在共用的 Amazon EFS 檔案系統中實作儲存隔離。如此一來，即使多個應用程式仍然共用同一檔案系統，未經授權的應用程式也無法存取相關資料。

隨著資料量增加，Amazon EFS 會協助您自動將不常存取的檔案移至成本更低的儲存類別。Amazon EFS Standard-Infrequent Access (IA) 儲存類別能降低非每日存取檔案的儲存成本。此過程不會犧牲 Amazon EFS 提供的高可用性、高持久性、彈性，以及 POSIX 檔案系統存取權。如需詳細資訊，請參閱 *Amazon Elastic File System User Guide* 中的 [EFS storage classes](https://docs.aws.amazon.com/efs/latest/ug/features.html)。

建議使用 Amazon EFS 生命週期政策，透過自動將不常存取的檔案移至 Amazon EFS IA 儲存類別來節省成本。如需詳細資訊，請參閱《Amazon Elastic File System 使用者指南》中的 [Amazon EFS 生命週期管理](https://docs.aws.amazon.com/efs/latest/ug/lifecycle-management-efs.html)。

建立 Amazon EFS 檔案系統時，您可選擇讓 Amazon EFS 將資料跨多個可用區域複寫 (對應 Standard 儲存類別)，或在單一可用區域內以備援方式儲存資料。相較於 Amazon EFS Standard 儲存類別，Amazon EFS One Zone 儲存類別能大幅降低儲存成本。若工作負載不需要多可用區域的復原能力，建議使用 Amazon EFS One Zone 儲存類別。您可以將不常存取的檔案移至 Amazon EFS One Zone-Infrequent Access，進一步降低 Amazon EFS One Zone 儲存的成本。如需詳細資訊，請參閱 [Amazon EFS 不頻繁存取](https://aws.amazon.com/efs/features/infrequent-access/)。

## Amazon EFS 磁碟區資料保護
<a name="storage-efs-dataprotection"></a>

使用 Standard 儲存類別的 Amazon EFS 檔案系統，會以備援方式跨多個可用區域儲存資料。如果選取 Amazon EFS One Zone 儲存類別，則會以備援方式將資料儲存於單一可用區域內。此外，Amazon EFS 在設計上可提供每年 99.999999999% (11 個 9) 的資料持久性。

如同任何環境，建立備份並建置防誤刪防護措施是最佳實務。對於 Amazon EFS 資料，該最佳實務包含正常運作、定期測試的備份 AWS Backup。依預設，建立使用 Amazon EFS One Zone 儲存類別的檔案系統時，系統會將其設定為自動備份檔案，除非您選擇停用此功能。如需詳細資訊，請參閱 *Amazon Elastic File System User Guide* 中的 [Backing up EFS file systems](https://docs.aws.amazon.com/efs/latest/ug/awsbackup.html)。

# 在 Amazon ECS 任務定義中指定 Amazon EFS 檔案系統
<a name="specify-efs-config"></a>

若要為您的容器使用 Amazon EFS 檔案系統磁碟區，您必須在任務定義中指定磁碟區並掛載點組態。以下任務定義 JSON 片段說明容器 `volumes` 和 `mountPoints` 物件的語法。

```
{
    "containerDefinitions": [
        {
            "name": "container-using-efs",
            "image": "public.ecr.aws/amazonlinux/amazonlinux:latest",
            "entryPoint": [
                "sh",
                "-c"
            ],
            "command": [
                "ls -la /mount/efs"
            ],
            "mountPoints": [
                {
                    "sourceVolume": "myEfsVolume",
                    "containerPath": "/mount/efs",
                    "readOnly": true
                }
            ]
        }
    ],
    "volumes": [
        {
            "name": "myEfsVolume",
            "efsVolumeConfiguration": {
                "fileSystemId": "fs-1234",
                "rootDirectory": "/path/to/my/data",
                "transitEncryption": "ENABLED",
                "transitEncryptionPort": integer,
                "authorizationConfig": {
                    "accessPointId": "fsap-1234",
                    "iam": "ENABLED"
                }
            }
        }
    ]
}
```

`efsVolumeConfiguration`  
類型：物件  
必要：否  
只有使用 Amazon EFS 磁碟區時才會指定此參數。    
`fileSystemId`  
類型：字串  
必要：是  
要使用的 Amazon EFS 檔案系統識別碼。  
`rootDirectory`  
類型：字串  
必要：否  
在 Amazon EFS 檔案系統中的目錄，其將掛載作為主機內的根目錄。如果省略此參數，使用 Amazon EFS 磁碟區的根目錄。指定 `/` 的效果與忽略此參數的效果相同。  
如果在 `authorizationConfig` 中指定 EFS 存取點，則必須忽略根目錄參數或設定為 `/`，這將強制執行 EFS 存取點上設定的路徑。  
`transitEncryption`  
類型：字串  
有效值：`ENABLED` \$1 `DISABLED`  
必要：否  
指定是否要對在 Amazon ECS 主機和 Amazon EFS 伺服器之間傳輸中的 Amazon EFS 資料啟用加密功能。如果使用 Amazon EFS IAM 授權，則必須啟用傳輸加密。如果省略此參數，系統會使用 `DISABLED` 的預設值。如需詳細資訊，請參閱《Amazon Elastic File System 使用者指南》**中的[加密傳輸中的資料](https://docs.aws.amazon.com/efs/latest/ug/encryption-in-transit.html)。  
`transitEncryptionPort`  
類型：整數  
必要：否  
在 Amazon ECS 主機和 Amazon EFS 伺服器之間傳送加密資料時所使用的連接埠。如果您未指定傳輸加密連接埠，它會使用 Amazon EFS 掛載協助程式使用的連接埠選擇策略。如需詳細資訊，請參閱《Amazon Elastic File System 使用者指南》**中的 [EFS 掛載協助程式](https://docs.aws.amazon.com/efs/latest/ug/efs-mount-helper.html)。  
`authorizationConfig`  
類型：物件  
必要：否  
Amazon EFS 檔案系統的授權組態詳細資訊。    
`accessPointId`  
類型：字串  
必要：否  
要使用的存取點 ID。如果指定了存取點，則必須省略 `efsVolumeConfiguration` 中的根目錄值，或設定為 `/`，這將強制執行在 EFS 存取點上設定的路徑。如果使用存取點，則必須在 `EFSVolumeConfiguration` 中啟用傳輸加密。如需詳細資訊，請參閱《Amazon Elastic File System 使用者指南》**中的[使用 Amazon EFS 存取點](https://docs.aws.amazon.com/efs/latest/ug/efs-access-points.html)。  
`iam`  
類型：字串  
有效值：`ENABLED` \$1 `DISABLED`  
必要：否  
 掛載 Amazon ECS 檔案系統時，指定是否使用任務定義中定義的 Amazon EFS 任務 IAM 角色。如果已啟用，必須在 `EFSVolumeConfiguration` 中啟用傳輸加密。如果省略此參數，系統會使用 `DISABLED` 的預設值。如需詳細資訊，請參閱[任務的 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)。

# 使用主控台為 Amazon ECS 設定 Amazon EFS 檔案系統
<a name="tutorial-efs-volumes"></a>

了解如何搭配 Amazon ECS 使用 Amazon Elastic File System (Amazon EFS) 檔案系統。

## 步驟 1：建立 Amazon ECS 叢集
<a name="efs-create-cluster"></a>

使用下列步驟來建立 Amazon ECS 叢集。

**建立新叢集 (Amazon ECS 主控台)**

在開始之前，請指派適當的 IAM 許可。如需詳細資訊，請參閱[Amazon ECS 叢集範例](security_iam_id-based-policy-examples.md#IAM_cluster_policies)。

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 從導覽列中選取要使用的「區域」。

1. 在導覽窗格中，選擇**叢集**。

1. 在 **Clusters** (叢集) 頁面上，選擇 **Create cluster** (建立叢集)。

1. 在**叢集組態**下的**叢集名稱**中，輸入叢集名稱的 `EFS-tutorial`。

1. (選用) 若要變更任務和服務啟動所在的 VPC 和子網路，請在 **Networking** (聯網) 下，執行下列任一操作：
   + 若要移除子網路，請在 **Subnets** (子網路) 下，對您要移除之每一個子網路選擇 **X**。
   + 若要變更為非 **default** (預設) VPC，請在 **VPC** 下，選擇現有的 **VPC**，然後在 **Subnets** (子網路) 下選擇各個子網路。

1.  若要將 Amazon EC2 執行個體新增至叢集，展開 **Infrastructure** (基礎設施)，然後選取 **Amazon EC2 執行個體**。接下來，設定作為容量提供者的 Auto Scaling 群組：

   1. 若要建立 Auto Scaling 群組，請從 **Auto Scaling group (ASG)** (Auto Scaling 群組 (ASG)) 中選取 **Create new group** (建立新群組)，然後提供有關該群組的下列詳細資訊：
     + 在**作業系統/架構**中，選擇 Amazon Linux 2。
     + 對於 **EC2 instance type (EC2 執行個體類型)**，選擇 `t2.micro`。

        對於 **SSH key pair** (SSH 金鑰對)，選擇在連線到執行個體時證明您身分的金鑰對。
     + 在**容量**中，輸入 `1`。

1. 選擇**建立**。

## 步驟 2：為 Amazon EC2 執行個體和 Amazon EFS 檔案系統建立安全群組
<a name="efs-security-group"></a>

在此步驟中，您將為 Amazon EC2 執行個體建立安全群組，以允許連接埠 80 上的入站網路流量，並為 Amazon EFS 檔案系統建立一個允許從容器執行個體進行入站存取的安全群組。

使用下列選項為 Amazon EC2 執行個體建立安全群組：
+ **安全群組名稱** - 為您的安全群組輸入唯一的名稱。
+ **VPC** - 選擇您先前為叢集所確認的 VPC。
+ **傳入規則**
  + **類型** - **HTTP**
  + **資源來源** - **0.0.0.0/0**。

使用下列選項為 Amazon EFS 檔案系統建立安全群組：
+ **安全群組名稱** - 為您的安全群組輸入唯一的名稱。例如 `EFS-access-for-sg-dc025fa2`。
+ **VPC** - 選擇您先前為叢集所確認的 VPC。
+ **傳入規則**
  + **類型** - **NFS**
  + **來源** - 使用您為執行個體建立的安全群組 ID 進行**自訂**。

如需有關如何建立安全群組的資訊，請參閱 *Amazon EC2 User Guide* 中的 [Create a security group for your Amazon EC2 instance](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-security-group.html)。

## 步驟 3：建立 Amazon EFS 檔案系統
<a name="efs-create-filesystem"></a>

在此步驟中，您將建立一個 Amazon EFS 檔案系統。

**建立 Amazon ECS 任務的 Amazon EFS 檔案系統。**

1. 開啟 Amazon Elastic File System 主控台，網址為 [https://console.aws.amazon.com/efs/](https://console.aws.amazon.com/efs/)。

1. 選擇 **Create file system (建立檔案系統)**。

1. 輸入檔案系統的名稱，然後選擇容器執行個體所託管的 VPC。根據預設，指定之 VPC 中的每個子網路，都會收到一個使用該 VPC 之預設安全群組的掛載目標。然後，選擇**自訂**。
**注意**  
本教學課程假設您的 Amazon EFS 檔案系統、Amazon ECS 叢集、容器執行個體與任務皆位於同一 VPC 中。如需有關從不同 VPC 掛載檔案系統的詳細資訊，請參閱 *Amazon EFS User Guide* 中的 [Walkthrough: Mount a file system from a different VPC](https://docs.aws.amazon.com/efs/latest/ug/efs-different-vpc.html)。

1. 在**檔案系統設定**頁面上，設定選用設定，然後在**效能設定**下，為您的檔案系統選擇**高載**輸送量模式。設定完設定之後，請選取**下一步**。

   1. (選用) 為您的檔案系統新增標籤。例如，您可以在 **Name** (名稱) 鍵旁的 **Value** (值) 欄中輸入名稱，藉此為檔案系統指定不會重複的一名稱。

   1. (選用) 啟用生命週期管理，以避免在不常存取的儲存體上浪費成本。如需詳細資訊，請參閱《Amazon Elastic File System 使用者指南》**中的 [EFS 生命週期管理](https://docs.aws.amazon.com/efs/latest/ug/lifecycle-management-efs.html)。

   1. (選用) 啟用加密。選取此核取方塊以啟用靜態 Amazon EFS 檔案系統的加密。

1. 在**網路存取**頁面的**掛載目標**下，將每個可用區域的現有安全群組組態替換為您為 [步驟 2：為 Amazon EC2 執行個體和 Amazon EFS 檔案系統建立安全群組](#efs-security-group) 中的檔案系統建立的安全群組，然後選擇**下一步**。

1.  您不需要為本教學課程設定**檔案系統政策**，因此您可以選擇**下一步**略過此區段。

1. 檢閱您的檔案系統選項，然後選擇**建立**以完成程序。

1. 從**檔案系統**畫面中，記錄**檔案系統 ID**。在下一個步驟中，您將會在 Amazon ECS 任務定義中參考這個值。

## 步驟 4：將內容新增至 Amazon EFS 檔案系統
<a name="efs-add-content"></a>

在此步驟中，您會將 Amazon EFS 檔案系統掛載到 Amazon EC2 執行個體，並將內容新增到其中。這是為了在本教學課程中進行測試，以說明資料的持久性。使用此功能時，通常會將應用程式或其他方法的資料寫入 Amazon EFS 檔案系統。

**建立 Amazon EC2 執行個體並掛載 Amazon EFS 檔案系統**

1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 選擇**啟動執行個體**。

1. 在**應用程式和作業系統映像 (Amazon Machine Image)** 下，選取 **Amazon Linux 2 AMI (HVM)**。

1. 在**執行個體類型**中，保留預設執行個體類型 `t2.micro`。

1.  在**金鑰對 (登入)** 下，選取用於 SSH 存取執行個體的金鑰對。

1. 在**網路設定**下，選取為 Amazon EFS 檔案系統和 Amazon ECS 叢集指定的 VPC。選取子網路和在 [步驟 2：為 Amazon EC2 執行個體和 Amazon EFS 檔案系統建立安全群組](#efs-security-group) 中建立的執行個體安全群組。設定執行個體的安全群組。確認已啟用**自動指派公有 IP**。

1. 在**設定儲存**下，選擇檔案系統的**編輯**按鈕，然後選擇 **EFS**。選取您在 [步驟 3：建立 Amazon EFS 檔案系統](#efs-create-filesystem) 中建立的檔案系統。您可以選擇性地變更掛載點，或保留預設值。
**重要**  
您必須先選擇子網路，然後才能將檔案系統新增至執行個體。

1. 清除**自動建立並連接安全群組**。保持選取另一個核取方塊。選擇 **Add shared file system (新增共用檔案系統)**。

1. 在 **Advanced Details** (進階詳細資訊) 下，確保透過 Amazon EFS 檔案系統掛載步驟自動填入使用者資料指令碼。

1.  在**摘要**下，確定**執行個體數量**為 **1**。選擇**啟動執行個體**。

1. 在**啟動執行個體**頁面上，選擇**檢視所有執行個體**以查看執行個體的狀態。初始時，您的**執行個體狀態**為 `PENDING`。當狀態變更為 `RUNNING` 且執行個體通過所有狀態檢查之後，執行個體即可供使用。

現在，您可以連線到 Amazon EC2 執行個體，並將內容新增至 Amazon EFS 檔案系統。

**連線到 Amazon EC2 執行個體，並將內容新增至 Amazon EFS 檔案系統。**

1. 您建立之 Amazon EC2 執行個體的 SSH。如需詳細資訊，請參閱 *Amazon EC2 User Guide* 中的 [Connect to your Linux instance using SSH](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connect-to-linux-instance.html)。

1. 從終端機視窗，執行 **df -T** 命令，確認 Amazon EFS 檔案系統已掛載。在下列輸出中，我們已反白顯示 Amazon EFS 檔案系統掛載。

   ```
   $ df -T
   Filesystem     Type            1K-blocks    Used        Available Use% Mounted on
   devtmpfs       devtmpfs           485468       0           485468   0% /dev
   tmpfs          tmpfs              503480       0           503480   0% /dev/shm
   tmpfs          tmpfs              503480     424           503056   1% /run
   tmpfs          tmpfs              503480       0           503480   0% /sys/fs/cgroup
   /dev/xvda1     xfs               8376300 1310952          7065348  16% /
   127.0.0.1:/    nfs4     9007199254739968       0 9007199254739968   0% /mnt/efs/fs1
   tmpfs          tmpfs              100700       0           100700   0% /run/user/1000
   ```

1. 導覽至掛載 Amazon EFS 檔案系統所在的目錄。在上述範例中，即為 `/mnt/efs/fs1`。

1. 建立名為 `index.html` 且具有下列內容的檔案：

   ```
   <html>
       <body>
           <h1>It Works!</h1>
           <p>You are using an Amazon EFS file system for persistent container storage.</p>
       </body>
   </html>
   ```

## 步驟 5：建立任務定義
<a name="efs-task-def"></a>

以下任務定義會建立名稱為 `efs-html` 的資料磁碟區。`nginx` 容器會將主機資料磁碟區掛載於 NGINX 根目錄 `/usr/share/nginx/html`。

**使用 Amazon ECS 主控台建立新的任務定義**

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 在導覽窗格中，選擇 **Task Definitions** (任務定義)。

1. 選擇 **Create new task definitio** (建立新任務定義)、**Create new task definition with JSON** (使用 JSON 建立新的任務定義)。

1. 在 JSON 編輯器方塊中，複製並貼上以下 JSON 文字，以 Amazon EFS 檔案系統的 ID 取代 `fileSystemId`。

   ```
   {
       "containerDefinitions": [
           {
               "memory": 128,
               "portMappings": [
                   {
                       "hostPort": 80,
                       "containerPort": 80,
                       "protocol": "tcp"
                   }
               ],
               "essential": true,
               "mountPoints": [
                   {
                       "containerPath": "/usr/share/nginx/html",
                       "sourceVolume": "efs-html"
                   }
               ],
               "name": "nginx",
               "image": "public.ecr.aws/docker/library/nginx:latest"
           }
       ],
       "volumes": [
           {
               "name": "efs-html",
               "efsVolumeConfiguration": {
                   "fileSystemId": "fs-1324abcd",
                   "transitEncryption": "ENABLED"
               }
           }
       ],
       "family": "efs-tutorial",
       "executionRoleArn":"arn:aws:iam::111122223333:role/ecsTaskExecutionRole"
   }
   ```
**注意**  
Amazon ECS 任務執行 IAM 角色不需要任何特定的 Amazon EFS 相關許可，即可掛載 Amazon EFS 檔案系統。依預設，如果不存在基於 Amazon EFS 資源的政策，則會在建立檔案系統時授予所有主體 (\$1) 存取權。  
僅當在 Amazon ECS 任務定義中啟用「EFS IAM 授權」時，才需要 Amazon ECS 任務角色。啟用該功能後，必須在基於 Amazon EFS 資源的政策中允許該任務角色的身分存取 Amazon EFS 檔案系統，並應停用匿名存取。

1. 選擇**建立**。

## 步驟 6：執行任務並檢視結果
<a name="efs-run-task"></a>

現在，已建立您的 Amazon EFS 檔案系統，並且提供 NGINX 容器的 Web 內容，您可以使用建立的任務定義來執行任務。NGINX Web 伺服器會隨即提供您簡單的 HTML 頁面。如果您在 Amazon EFS 檔案系統中更新了內容，這些變更也會傳播至所有也掛載該檔案系統的容器。

任務會在您為叢集定義的子網路中執行。

**使用主控台執行任務並檢視結果**

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 在 **Clusters** (叢集) 頁面上，選取要在哪個叢集中執行獨立任務。

   決定您要從中啟動服務的資源。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonECS/latest/developerguide/tutorial-efs-volumes.html)

1. (選用) 選擇已排程的任務在叢集基礎設施中的分佈方式。展開 **Compute configuration** (運算組態)，然後執行下列操作：    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_tw/AmazonECS/latest/developerguide/tutorial-efs-volumes.html)

1. 針對 **Application type** (應用程式類型)，選擇 **Task** (任務)。

1. 在**任務定義**中，選擇您先前建立的 `efs-tutorial` 任務定義。

1. 在**所需任務**中，輸入 `1`。

1. 選擇**建立**。

1. 在**叢集**頁面上，選擇**基礎設施**。

1. 在**容器執行個體**下，選擇要連線的容器執行個體。

1. 在**容器執行個體**頁面的**聯網**下，記錄執行個體的公有 IP 或**公有 DNS**。

1. 開啟瀏覽器並輸入公有 IP 地址。您應該看到下列訊息：

   ```
   It works!
   You are using an Amazon EFS file system for persistent container storage.
   ```
**注意**  
如果您未看到該訊息，請確認您容器執行個體的安全群組，允許連接埠 80 上的入站網路流量，且檔案系統的安全群組允許來自容器執行個體的入站存取。

# 搭配 Amazon ECS 使用 FSx for Windows File Server 磁碟區
<a name="wfsx-volumes"></a>

FSx for Windows File Server 提供全受管 Windows 檔案伺服器，這些伺服器由 Windows 檔案系統提供支援。搭配使用 FSx for Windows File Server 與 ECS 時，您可以使用持續、分散、共用、靜態的檔案儲存來佈建 Windows 任務。如需詳細資訊，請參閱[什麼是 FSx for Windows File Server？](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/what-is.html)。

**注意**  
使用 Amazon ECS 最佳化 Windows Server 2016 Full AMI 的 EC2 執行個體不支援 FSx for Windows File Server ECS 任務磁碟區。  
您無法在 Fargate 組態上的 Windows 容器中使用 FSx for Windows File Server 磁碟區。但您可以[修改容器，使其在啟動時完成掛載](https://aws.amazon.com/blogs/containers/use-smb-storage-with-windows-containers-on-aws-fargate/)。

您可以使用 FSx for Windows File Server 來部署需要存取共用外部儲存體、高可用性區域儲存體或高輸送量儲存體的 Windows 工作負載。您可以將一個或多個 FSx for Windows File Server 檔案系統磁碟區掛載至 Amazon ECS Windows 執行個體上執行的 Amazon ECS 容器。您可於單一 Amazon ECS 任務內，在多個 Amazon ECS 容器之間共用 FSx for Windows File Server 檔案系統磁碟區。

若要讓 FSx for Windows File Server 與 ECS 搭配使用，在任務定義中包含 FSx for Windows File Server 檔案系統 ID 和相關資訊。如下列任務定義 JSON 片段範例。在建立並執行任務定義之前，您必須準備好以下事項。
+ 加入有效的網域的 ECS Windows EC2 執行個體。該網域可以透過 [AWS Directory Service for Microsoft Active Directory](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/directory_microsoft_ad.html)、內部部署 Active Directory 或 Amazon EC2 上自我託管的 Active Directory 進行託管。
+  AWS Secrets Manager 秘密或 Systems Manager 參數，其中包含用於加入 Active Directory 網域和連接 FSx for Windows File Server 檔案系統的登入資料。憑證值是您在建立 Active Directory 時輸入的名稱和密碼憑證。

如需相關教學，請參閱[了解如何為 Amazon ECS 設定 FSx for Windows File Server 檔案系統](tutorial-wfsx-volumes.md)。

## 考量事項
<a name="wfsx-volume-considerations"></a>

在使用 FSx for Windows File Server 磁碟區時，請考量下列事項：
+ Windows Amazon EC2 執行個體上的 Amazon ECS 原生支援 FSx for Windows File Server 磁碟區 — Amazon ECS 透過任務定義組態自動管理掛載。

  在 Linux Amazon EC2 執行個體上，Amazon ECS 無法透過任務定義自動掛載 FSx for Windows File Server 磁碟區。不過，您可以在主機層級的 Linux EC2 執行個體上手動掛載 FSx for Windows File Server 檔案共享，然後將該路徑繫結掛載到 Amazon ECS 容器中。如需詳細資訊，請參閱[從 Linux 掛載 Amazon FSx 檔案共用](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/map-shares-linux.html)。
**重要**  
這是自我管理的組態。如需在 Linux 上掛載和維護 FSx for Windows File Server 檔案共享的指引，請參閱 [FSx for Windows File Server 文件](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/)。
**重要**  
在 Linux EC2 執行個體上使用手動掛載的 FSx for Windows File Server 共用時，Amazon ECS 和 FSx for Windows File Server 會獨立運作 — Amazon ECS 不會監控 Amazon FSx 掛載，而 FSx for Windows File Server 不會追蹤 Amazon ECS 任務置放或生命週期事件。您有責任確保 Amazon ECS 容器執行個體與 Amazon FSx 檔案系統之間的網路連線能力、實作掛載運作狀態檢查，以及處理重新連線邏輯，以容忍容錯移轉事件。
+ FSx for Windows File Server 與 Amazon ECS 不支援 AWS Fargate。
+ 在 Amazon ECS 受管執行個體上，不支援將 FSx for Windows File Server 與 Amazon ECS 搭配使用。
+ 具有 `awsvpc` 網路模式的 FSx for Windows File Server 與 Amazon ECS 需要容器代理程式的版本 `1.54.0` 或更新版本。
+ Amazon ECS 任務使用的磁碟機代號的上限為 23。具有 FSx for Windows File Server 磁碟區的每個任務都會取得指派給它的磁碟機代號。
+ 根據預設，任務資源清除時間為任務結束後的 3 小時。即使沒有任務正在使用它，任務建立的檔案映射會持續 3 小時。使用 Amazon ECS 環境變數 `ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION` 可設定預設清理時間。如需詳細資訊，請參閱[Amazon ECS 容器代理程式組態](ecs-agent-config.md)。
+ 任務通常只會在與 FSx for Windows File Server 檔案系統相同的 VPC 中執行。但是，如果 Amazon ECS 叢集 VPC 與 FSx for Windows File Server 檔案系統之間透過 VPC 對等互連建立了網路連線，則可以跨 VPC 支援。
+ 透過設定 VPC 安全群組，可在網路層級控制對 FSx for Windows File Server 檔案系統的存取。只有在加入 Active Directory 網域且已正確設定 Active Directory 安全群組的 EC2 執行個體上託管的任務，才能存取 FSx for Windows File Server 檔案共用。如果安全群組設定錯誤，Amazon ECS 會使任務啟動失敗，並顯示下列錯誤訊息：`unable to mount file system fs-id`。
+ FSx for Windows File Server 已與 AWS Identity and Access Management (IAM) 整合，以控制 IAM 使用者和群組可對特定 FSx for Windows File Server 資源採取的動作。透過用戶端授權，客戶可以定義允許或拒絕存取特定 FSx for Windows File Server 檔案系統的 IAM 角色，選擇性地要求唯讀存取，以及選擇性地允許或禁止從用戶端對檔案系統進行根存取。如需詳細資訊，請參閱《Amazon FSx Windows 使用者指南》中的[安全性](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/security.html)。

# 搭配 Amazon ECS 使用 FSx for Windows File Server 的最佳實務
<a name="wfsx-best-practices"></a>

在搭配 Amazon ECS 使用 FSx for Windows File Server 時，請注意下列最佳實務建議。

## FSx for Windows File Server 的安全與存取控制
<a name="wfsx-security-access-controls"></a>

FSx for Windows File Server 提供下列存取控制功能，您可透過這些功能確保儲存在 FSx for Windows File Server 檔案系統中的資料安全，且僅供有需求的應用程式存取。

### FSx for Windows File Server 磁碟區的資料加密
<a name="storage-fsx-security-encryption"></a>

FSx for Windows File Server 支援兩種形式的檔案系統加密：「傳輸中資料加密」與「靜態資料加密」。當檔案共用映射至支援 SMB 通訊協定 3.0 或更新版本的容器執行個體時，即會啟用傳輸中資料加密。靜態資料加密則會在建立 Amazon FSx 檔案系統時自動啟用。當您存取檔案系統時，Amazon FSx 會透過 SMB 加密技術自動對傳輸中的資料進行加密，無需修改應用程式即可實現。如需詳細資訊，請參閱 *Amazon FSx for Windows File Server User Guide* 中的 [Data encryption in Amazon FSx](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/encryption.html)。

### 使用 Windows ACL 進行資料夾層級存取控制
<a name="storage-fsx-security-access"></a>

Windows Amazon EC2 執行個體會透過 Active Directory 憑證存取 Amazon FSx 檔案共用。此類執行個體也會使用標準 Windows 存取控制清單 (ACL)，實現精細的檔案層級與資料夾層級存取控制。您可以建立多個憑證，每個憑證分別對應共用區內的特定資料夾，並映射至特定任務。

在下列範例中，任務可以使用儲存在 Secrets Manager 中的憑證存取 `App01` 資料夾。Amazon Resource Name (ARN) 為 `1234`。

```
"rootDirectory": "\\path\\to\\my\\data\App01",
"credentialsParameter": "arn-1234",
"domain": "corp.fullyqualified.com",
```

在另一個範例中，任務可以使用儲存在 Secrets Manager 中的憑證存取 `App02` 資料夾。其 ARN 是 `6789`。

```
"rootDirectory": "\\path\\to\\my\\data\App02",
"credentialsParameter": "arn-6789",
"domain": "corp.fullyqualified.com",
```

# 在 Amazon ECS 任務定義中指定 FSx for Windows File Server 檔案系統
<a name="specify-wfsx-config"></a>

若要將 FSx for Windows File Server 檔案系統磁碟區用於您的容器，請在任務定義中指定磁碟區並掛載點組態。以下任務定義 JSON 片段說明容器 `volumes` 和 `mountPoints` 物件的語法。

```
{
    "containerDefinitions": [
        {
            "entryPoint": [
                "powershell",
                "-Command"
            ],
            "portMappings": [],
            "command": ["New-Item -Path C:\\fsx-windows-dir\\index.html -ItemType file -Value '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>It Works!</h2> <p>You are using Amazon FSx for Windows File Server file system for persistent container storage.</p>' -Force"],
            "cpu": 512,
            "memory": 256,
            "image": "mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019",
            "essential": false,
            "name": "container1",
            "mountPoints": [
                {
                    "sourceVolume": "fsx-windows-dir",
                    "containerPath": "C:\\fsx-windows-dir",
                    "readOnly": false
                }
            ]
        },
        {
            "entryPoint": [
                "powershell",
                "-Command"
            ],
            "portMappings": [
                {
                    "hostPort": 443,
                    "protocol": "tcp",
                    "containerPort": 80
                }
            ],
            "command": ["Remove-Item -Recurse C:\\inetpub\\wwwroot\\* -Force; Start-Sleep -Seconds 120; Move-Item -Path C:\\fsx-windows-dir\\index.html -Destination C:\\inetpub\\wwwroot\\index.html -Force; C:\\ServiceMonitor.exe w3svc"],
            "mountPoints": [
                {
                    "sourceVolume": "fsx-windows-dir",
                    "containerPath": "C:\\fsx-windows-dir",
                    "readOnly": false
                }
            ],
            "cpu": 512,
            "memory": 256,
            "image": "mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019",
            "essential": true,
            "name": "container2"
        }
    ],
    "family": "fsx-windows",
    "executionRoleArn": "arn:aws:iam::111122223333:role/ecsTaskExecutionRole",
    "volumes": [
        {
            "name": "fsx-windows-dir",
            "fsxWindowsFileServerVolumeConfiguration": {
                "fileSystemId": "fs-0eeb5730b2EXAMPLE",
                "authorizationConfig": {
                    "domain": "example.com",
                    "credentialsParameter": "arn:arn-1234"
                },
                "rootDirectory": "share"
            }
        }
    ]
}
```

`FSxWindowsFileServerVolumeConfiguration`  
類型：物件  
必要：否  
當您為任務儲存使用 [FSx for Windows File Server](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/what-is.html) 檔案系統時，指定此參數。    
`fileSystemId`  
類型：字串  
必要：是  
要使用的 FSx for Windows File Server 檔案系統 ID。  
`rootDirectory`  
類型：字串  
必要：是  
FSx for Windows File Server 檔案系統中的目錄，其將掛載做為主機內的根目錄。  
`authorizationConfig`    
`credentialsParameter`  
類型：字串  
必要：是  
授權憑證選項：  
+ [Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 秘密的 Amazon Resource Name (ARN)。
+ [Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/integration-ps-secretsmanager.html) 參數的 Amazon Resource Name (ARN)。  
`domain`  
類型：字串  
必要：是  
由 [AWS Directory Service for Microsoft Active Directory](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/directory_microsoft_ad.html) (AWS Managed Microsoft AD) 目錄或自我託管 EC2 Active Directory 託管的完整網域名稱。

## 儲存 FSx for Windows File Server 磁碟區憑證的方法
<a name="creds"></a>

有兩種不同的方法可存放憑證，以便與憑證參數搭配使用。
+ **AWS Secrets Manager 秘密**

  您可以使用*其他類型的秘密*類別，在 AWS Secrets Manager 主控台中建立此登入資料。您可以為每個鍵/值對、使用者名稱/管理員以及密碼/*密碼*新增一列。
+ **Systems Manager 參數**

  您可以在 Systems Manager 參數主控台中建立此憑證，方法是在下列範例程式碼片段的表單中輸入文字。

  ```
  {
    "username": "admin",
    "password": "password"
  }
  ```

任務定義 `FSxWindowsFileServerVolumeConfiguration` 參數中的 `credentialsParameter` 保留秘密 ARN 或 Systems Manager 參數 ARN。如需詳細資訊，請參閱 *《Secrets Manager 使用者指南》*中的[什麼是 AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 和 *Systems Manager 使用者指南*中的[Systems Manager 參數存放區](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html)。

# 了解如何為 Amazon ECS 設定 FSx for Windows File Server 檔案系統
<a name="tutorial-wfsx-volumes"></a>

了解如何啟動 Amazon ECS 最佳化 Windows 執行個體，該執行個體同時託管 FSx for Windows File Server 檔案系統，以及可存取該檔案系統的容器。若要這樣做，請先建立 Directory Service AWS Managed Microsoft Active Directory。接著，您可以建立 Amazon FSx for Windows File Server 檔案系統，以及具有 Amazon EC2 執行個體與任務定義的 Amazon ECS 叢集。您可以設定容器的任務定義，以使用 FSx for Windows File Server 檔案系統。最後，您將測試檔案系統。

每次啟動或刪除 Active Directory 或 FSx for Windows File Server 檔案系統時，需要 20 至 45 分鐘。請準備保留至少 90 分鐘以完成教學課程，或在幾個工作階段中完成教學課程。

## 教學課程的先決條件
<a name="wfsx-prerequisites"></a>
+ 管理使用者。請參閱 [設定以使用 Amazon ECS。](get-set-up-for-amazon-ecs.md)。
+ (選用) 用於透過 RDP 存取連線至 EC2 Windows 執行個體的 `PEM` 金鑰對。如需有關如何建立金鑰對的資訊，請參閱 *Amazon EC2 User Guide* 中的 [Amazon EC2 key pairs and Amazon EC2 instances](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html)。
+ 具有至少一個公有、一個私有子網路和一個安全群組的 VPC。您可以使用預設 VPC。您不需要 NAT 閘道或裝置。 Directory Service 不支援與 Active Directory 搭配的網路位址轉譯 (NAT)。為了可以運作，Active Directory、FSx for Windows File Server 檔案系統、ECS 叢集和 EC2 執行個體必須位於 VPC 內。如需 VPCs和作用中目錄的詳細資訊，請參閱[建立 VPC](https://docs.aws.amazon.com/vpc/latest/userguide/create-vpc.html) 和[建立 AWS Managed Microsoft AD 的先決條件](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_getting_started.html#ms_ad_getting_started_prereqs)。
+ IAM ecsInstanceRole 和 ecsTaskExecutionRole 許可與您的帳戶建立關聯。這些服務連結的角色可讓服務代表您進行 API 呼叫，並存取容器、機密、目錄和檔案伺服器。

## 步驟 1：建立 IAM 存取角色
<a name="iam-roles"></a>

**使用 AWS 管理主控台建立叢集。**

1. 請參閱 [Amazon ECS 容器執行個體 IAM 角色](instance_IAM_role.md) 來檢查您是否擁有 ecsInstanceRole，並查看如何在沒有的情況下建立一個。

1. 建議您針對實際生產環境中的最低許可自訂角色政策。為了完成本教學課程，請確認下列 AWS 受管政策已連接至您的 ecsInstanceRole。連接政策 (如果尚未連接)。
   + AmazonEC2ContainerServiceforEC2Role
   + AmazonSSMManagedInstanceCore
   + AmazonSSMDirectoryServiceAccess

   連接 AWS 受管政策。

   1. 開啟 [ IAM 主控台](https://console.aws.amazon.com//iam/)。

   1. 在導覽窗格中，選擇 **Roles** (角色)。

   1. 選擇 **AWS 受管角色**。

   1. 選擇 **Permissions, Attach policies.** (許可、連接政策。)。

   1. 若要縮小可連接的政策，請使用 **Filter** (篩選)。

   1. 選取適用的政策，然後選擇 **Attach Policy** (連接政策)。

1. 請參閱 [Amazon ECS 任務執行 IAM 角色](task_execution_IAM_role.md) 來檢查您是否擁有 ecsTaskExecutionRole，並查看如何在沒有的情況下建立一個。

   建議您針對實際生產環境中的最低許可自訂角色政策。為了完成本教學課程，請確認下列 AWS 受管政策已連接至您的 ecsTaskExecutionRole。連接政策 (如果尚未連接)。使用上一節中提供的程序來連接 AWS 受管政策。
   + SecretsManagerReadWrite
   + AmazonFSxReadOnlyAccess
   + AmazonSSMReadOnlyAccess
   + AmazonECSTaskExecutionRolePolicy

## 步驟 2：建立 Windows Active Directory (AD)
<a name="wfsx-create-ads"></a>

1. 請遵循 *Directory Service 管理指南*中[建立 AWS Managed Microsoft AD](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_getting_started.html#ms_ad_getting_started_create_directory) AWS 中所述的步驟。使用您在本教學課程中指定的 VPC。在*建立 AWS Managed Microsoft AD* 的步驟 3 中，儲存使用者名稱和管理員密碼以用於下列步驟。另外，請記下完整目錄 DNS 名稱，以供後續步驟中使用。您可以在建立 Active Directory 期間完成以下步驟。

1. 建立要在下列步驟中使用的 AWS Secrets Manager 秘密。如需詳細資訊，請參閱[《Secrets Manager 使用者指南》中的 Secrets Manager 入門](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html#get-started)。 AWS **

   1. 開啟 [Secrets Manager 主控台](https://console.aws.amazon.com//secretsmanager/)。

   1. 按一下 **Store a new secret** (存放新機密)。

   1. 選取 **Other type of secrets** (其他機密類型)。

   1. 對於 **Secret key/value** (機密鍵/值)，在第一個資料列中建立具有值 **admin** 的索引鍵 **username**。按一下 **\$1 Add row** (\$1 新增列)。

   1. 在新資料列中，建立索引鍵 **password**。對於值，輸入您在*建立 AWS 受管 AD 目錄*的步驟 3 中輸入的密碼。

   1. 按一下 **Next** (下一步) 按鈕。

   1. 提供機密名稱和描述。按一下 **Next (下一步)**。

   1. 按一下 **Next (下一步)**。按一下 **Store** (存放)。

   1. 從 **Secrets** (機密) 頁面清單上，按一下您剛才建立的機密。

   1. 儲存新機密的 ARN，以便在後續步驟中使用。

   1. 您可以繼續進行下一個步驟，同時建立 Active Directory。

## 步驟 3：驗證並更新安全群組
<a name="wfsx-sg"></a>

在此步驟中，您會驗證並更新您正在使用的安全群組的規則。為此，您可以使用為 VPC 建立的預設安全群組。

**驗證並更新安全群組。**

您需要建立或編輯安全群組，以便連接埠可以接收和傳送資料，請參閱 *FSx for Windows File Server 使用者指南*中的 [Amazon VPC 安全群組](https://docs.aws.amazon.com/fsx/latest/WindowsGuide/limit-access-security-groups.html#fsx-vpc-security-groups)。您可以藉由建立安全群組傳入規則完成此操作，規則顯示在以下傳入規則資料表的第一列。此規則允許來自網路界面 (及其關聯執行個體) 的傳入流量，而這些網路界面會指派給安全群組。您建立的所有雲端資源都位於同一 VPC 內，並連接至相同的安全群組。因此，此規則允許所需的流量往來於 FSx for Windows File Server 檔案系統、Active Directory 和 ECS 執行個體。其他傳入規則允許流量提供網站和 RDP 存取服務，以便連線至您的 ECS 執行個體。

下表顯示本教學課程所需的安全群組傳入規則。


| Type | 通訊協定 | 連接埠範圍 | 來源 | 
| --- | --- | --- | --- | 
|  所有流量  |  全部  |  全部  |  *sg-securitygroup*  | 
|  HTTPS  |  TCP  |  443  |  0.0.0.0/0  | 
|  RDP  |  TCP  |  3389  |  您的筆記型電腦 IP 地址  | 

下表顯示本教學課程所需的安全群組傳出規則。


| Type | 通訊協定 | 連接埠範圍 | 目標 | 
| --- | --- | --- | --- | 
|  所有流量  |  全部  |  全部  |  0.0.0.0/0  | 

1. 開啟 [EC2 主控台](https://console.aws.amazon.com//ec2/)並從左側選單選取 **Security Groups** (安全群組)。

1. 從現在顯示的安全群組清單中，選取您要用於本教學課程的安全群組左側的核取方塊。

   隨即顯示您的安全群組詳細資訊。

1. 編輯傳入和傳出規則，方法是選取 **Inbound rules** (傳入規則) 或 **Outbound rules** (傳出規則) 索引標籤，然後選擇 **Edit inbound rules** (編輯傳入規則) 或 **Edit outbound rules** (編輯傳出規則) 按鈕。編輯規則以與上表中顯示的規則相符。稍後在本教學課程中建立 EC2 執行個體後，請使用 EC2 執行個體的公有 IP 位址編輯傳入規則 RDP 來源，詳情請參閱 *Amazon EC2 User Guide* 中的 [Connect to your Windows instance using RDP](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connecting_to_windows_instance.html)。

## 步驟 4：建立 FSx for Windows File Server 檔案系統
<a name="wfsx-create-fsx"></a>

在您的安全群組經過驗證和更新，且您的 Active Directory 已建立並處於作用中狀態之後，請在與您的 Active Directory 相同的 VPC 中建立 FSx for Windows File Server 檔案系統。請依照下列步驟，建立 FSx for Windows File Server 檔案系統，以供您的 Windows 任務使用。

**建立第一個檔案系統。**

1. 開啟 [Amazon FSx 主控台](https://console.aws.amazon.com//fsx/)。

1. 在儀表板上，選擇 **Create file system** (建立檔案系統) 以啟動檔案系統建立精靈。

1. 在 **Select file system type** (選取檔案系統類型) 頁面中，選擇 **FSx for Windows File Server**，然後選擇 **Next** (下一步)。**Create file system** (建立檔案系統) 頁面隨即顯示。

1. 在 **File system details** (檔案系統詳細資訊) 區段中，輸入檔案系統的名稱。命名檔案系統可讓您更輕鬆地尋找和管理檔案系統。您最多可使用 256 個 Unicode 字元。允許的字元如下：英文字母、數字、空格和特殊字元加號 (\$1)、減號 (-)、等號 (=)、句點 (.)、下劃線 (\$1)、冒號 (:) 和斜線 (/)。

1. 對於 **Deployment type** (部署類型)，請選擇 **Single-AZ** (單一可用區)，部署在單一可用區域中部署的檔案系統。*單一可用區 2* 是最新一代的單一可用區域檔案系統，支援 SSD 和 HDD 儲存。

1. 對於 **Storage type** (儲存類型)，請選擇 **EBS**。

1. 對於 **Storage capacity** (儲存容量)，請輸入最小儲存容量。

1. 保留 **Throughput capacity** (輸送容量) 的預設設定。

1. 在**網路與安全**區段中，選擇您為 Directory Service 目錄選擇的相同 Amazon VPC。

1. 對於 **VPC Security Groups** (VPC 安全群組) 下，選擇您在*步驟 3：驗證並更新您的安全群組*中驗證的安全群組。

1. 對於 **Windows authentication** (Windows 身分驗證)，選擇 **AWS 受管 Microsoft Active Directory**，然後從清單中選擇您的 Directory Service 目錄。

1. 對於 **Encryption** (加密)，請保留 **aws/fsx (default)** (aws/fsx (預設)) 的預設 **Encryption key** (加密金鑰) 設定。

1. 請保留 **Maintenance preferences** (維護偏好設定) 的預設設定。

1. 按一下 **Next** (下一步) 按鈕。

1. 檢閱顯示在 **Create file system** (建立檔案系統) 頁面上的檔案系統組態。請注意建立檔案系統後，您可以修改哪些檔案系統設定，以供參考。選擇 **Create file system (建立檔案系統)**。

1. 請注意檔案系統 ID。您會在稍後的步驟中需要使用。

   您可以在建立 FSx for Windows File Server 檔案系統時，繼續建立叢集和 EC2 執行個體的後續步驟。

## 步驟 5：建立 Amazon ECS 叢集
<a name="wfsx-create-cluster"></a>

**使用 Amazon ECS 主控台建立叢集**

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 從導覽列中選取要使用的「區域」。

1. 在導覽窗格中，選擇**叢集**。

1. 在 **Clusters** (叢集) 頁面上，選擇 **Create cluster** (建立叢集)。

1. 在**叢集組態**下的**叢集名稱**中，輸入 **windows-fsx-cluster**。

1. 展開**基礎設施**，清除 AWS Fargate （無伺服器），然後選取 **Amazon EC2 執行個體**。

   1. 若要建立 Auto Scaling 群組，請從 **Auto Scaling group (ASG)** (Auto Scaling 群組 (ASG)) 中選取 **Create new group** (建立新群組)，然後提供有關該群組的下列詳細資訊：
     + 在**作業系統/架構**中，選擇 **Windows Server 2019 Core**。
     + 對於 **EC2 執行個體類型**，選擇 t2.medium 或 t2.micro。

1. 選擇**建立**。

## 步驟 6：建立 Amazon ECS 最佳化的 Amazon EC2 執行個體
<a name="wfsx-create-instance"></a>

建立 Amazon ECS Windows 容器執行個體。

**建立 Amazon ECS 執行個體**

1. 使用 `aws ssm get-parameters` 命令擷取託管 VPC 的區域 AMI 名稱。如需詳細資訊，請參閱[擷取 Amazon ECS 最佳化 AMI 中繼資料](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/retrieve-ecs-optimized_windows_AMI.html)。

1. 使用 Amazon EC2 主控台來啟動執行個體。

   1. 前往 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

   1. 從導覽列中選取要使用的「區域」。

   1. 在 **EC2 儀表板**中，選擇 **Launch instance** (啟動執行個體)。

   1. 在 **Name (名稱)** 輸入唯一的名稱。

   1. 針對**應用程式和作業系統映像 (Amazon Machine Image)**，在**搜尋**欄位中，輸入您擷取到的 AMI 名稱。

   1. 對於**執行個體類型**，選擇 t2.medium 或 t2.micro。

   1. 在 **Key pair (login)** (金鑰對 (登入)) 欄位中，選擇一個金鑰對。如果您未指定金鑰對，則 

   1. 在**網路設定**下，針對 **VPC** 和**子網路**，選擇您的 VPC 和公有子網路。

   1. 在 **Network settings** (網路設定) 下的 **Security group** (安全群組) 欄位中，選擇一個現有的安全群組，或建立一個新的安全群組。確定您選擇的安全群組具有在 [教學課程的先決條件](#wfsx-prerequisites) 中定義的輸入和輸出規則

   1. 在 **Network settings** (網路設定) 下的 **Auto-assign Public IP** (自動指派公有 IP) 欄位中，選取 **Enable** (啟用)。

   1. 展開**進階詳細資訊**，然後針對**網域加入目錄**，選取您建立的 Active Directory 的 ID。啟動 EC2 執行個體時，此選項網域會加入您的 AD。

   1. 在 **Advanced details** (進階詳細資料) 下的 **IAM instance profile** (IAM 執行個體設定檔) 欄位中，選擇 **ecsInstanceRole**。

   1. 利用下列使用者資料設定您的 Amazon ECS 容器執行個體。在 **Advanced details** (進階詳細資料) 下的 **User data** (使用者資料) 欄位中，貼入下列指令碼，以您的叢集名稱取代 *cluster\$1name*。

      ```
      <powershell>
      Initialize-ECSAgent -Cluster windows-fsx-cluster -EnableTaskIAMRole
      </powershell>
      ```

   1. 準備就緒後，請選取 acknowledgment (確認) 欄位，再選擇 **Launch Instances** (啟動執行個體)。

   1. 會有確認頁面讓您知道您的執行個體正在啟動。選擇 **View Instances** (檢視執行個體) 關閉確認頁面並返回主控台。

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 在導覽窗格中選擇**叢集**，然後選擇 **windows-fsx-cluster**。

1. 選擇**基礎設施**索引標籤，並確認您的執行個體已在 **windows-fsx-cluster** 叢集註冊。

## 步驟 7：註冊 Windows 任務定義
<a name="register_windows_task_def"></a>

您必須先註冊任務定義，才能在您的 Amazon ECS 叢集中執行 Windows 容器。以下任務定義範例會顯示簡單的網頁。任務會啟動兩個可存取 FSx 檔案系統的容器。第一個容器會將 HTML 檔案寫入檔案系統。第二個容器從檔案系統下載 HTML 檔案並為網頁提供服務。

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 在導覽窗格中，選擇 **Task Definitions** (任務定義)。

1. 選擇 **Create new task definitio** (建立新任務定義)、**Create new task definition with JSON** (使用 JSON 建立新的任務定義)。

1. 在 JSON 編輯器方塊中，取代任務執行角色的值和有關 FSx 檔案系統的詳細資訊，然後選擇**儲存**。

   ```
   {
       "containerDefinitions": [
           {
               "entryPoint": [
                   "powershell",
                   "-Command"
               ],
               "portMappings": [],
               "command": ["New-Item -Path C:\\fsx-windows-dir\\index.html -ItemType file -Value '<html> <head> <title>Amazon ECS Sample App</title> <style>body {margin-top: 40px; background-color: #333;} </style> </head><body> <div style=color:white;text-align:center> <h1>Amazon ECS Sample App</h1> <h2>It Works!</h2> <p>You are using Amazon FSx for Windows File Server file system for persistent container storage.</p>' -Force"],
               "cpu": 512,
               "memory": 256,
               "image": "mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019",
               "essential": false,
               "name": "container1",
               "mountPoints": [
                   {
                       "sourceVolume": "fsx-windows-dir",
                       "containerPath": "C:\\fsx-windows-dir",
                       "readOnly": false
                   }
               ]
           },
           {
               "entryPoint": [
                   "powershell",
                   "-Command"
               ],
               "portMappings": [
                   {
                       "hostPort": 443,
                       "protocol": "tcp",
                       "containerPort": 80
                   }
               ],
               "command": ["Remove-Item -Recurse C:\\inetpub\\wwwroot\\* -Force; Start-Sleep -Seconds 120; Move-Item -Path C:\\fsx-windows-dir\\index.html -Destination C:\\inetpub\\wwwroot\\index.html -Force; C:\\ServiceMonitor.exe w3svc"],
               "mountPoints": [
                   {
                       "sourceVolume": "fsx-windows-dir",
                       "containerPath": "C:\\fsx-windows-dir",
                       "readOnly": false
                   }
               ],
               "cpu": 512,
               "memory": 256,
               "image": "mcr.microsoft.com/windows/servercore/iis:windowsservercore-ltsc2019",
               "essential": true,
               "name": "container2"
           }
       ],
       "family": "fsx-windows",
       "executionRoleArn": "arn:aws:iam::111122223333:role/ecsTaskExecutionRole",
       "volumes": [
           {
               "name": "fsx-windows-dir",
               "fsxWindowsFileServerVolumeConfiguration": {
                   "fileSystemId": "fs-0eeb5730b2EXAMPLE",
                   "authorizationConfig": {
                       "domain": "example.com",
                       "credentialsParameter": "arn:arn-1234"
                   },
                   "rootDirectory": "share"
               }
           }
       ]
   }
   ```

## 步驟 8：執行任務並檢視結果
<a name="wfsx-run-task"></a>

在執行任務之前，請確認 FSx for Windows File Server 檔案系統的狀態為 **Available** (可用)。可用之後，您可以使用您建立的任務定義來執行任務。透過使用檔案系統建立相互之間隨機顯示 HTML 檔案的容器，以啟動任務。隨機顯示後，Web 伺服器提供簡單的 HTML 頁面。

**注意**  
您可能無法從 VPN 內連線至網站。

**使用 Amazon ECS 主控台執行任務並檢視結果。**

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 在導覽窗格中選擇**叢集**，然後選擇 **windows-fsx-cluster**。

1. 選擇**任務**索引標籤，然後選擇**執行新任務**。

1. 針對 **Launch Type** (啟動類型)，選擇 **EC2**。

1. 在部署組態下，針對**任務定義**選擇 **fsx-windows**，然後選擇**建立**。

1. 當您的任務狀態為**執行中**時，請選擇任務 ID。

1. 在**容器**下，當容器 1 狀態為**已停止**時，選取容器 2 以檢視容器的詳細資訊。

1.  在 **container2 的容器詳細資訊**下，選取**網路繫結**，然後按一下與容器關聯的外部 IP 地址。您的瀏覽器將會開啟並顯示以下訊息。

   ```
   Amazon ECS Sample App
   It Works! 
   You are using Amazon FSx for Windows File Server file system for persistent container storage.
   ```
**注意**  
可能需要幾分鐘的時間才會顯示訊息。如果幾分鐘後您未看到此訊息，請檢查您是否未在 VPN 中執行，並確認容器執行個體的安全群組，允許連接埠 443 上的傳入網路 HTTP 流量。

## 步驟 9：清除
<a name="wfsx-cleanup"></a>

**注意**  
刪除 FSx for Windows File Server 檔案系統或 AD 需要 20 到 45 分鐘的時間。您必須等到 FSx for Windows File Server 檔案系統刪除操作完成後，才能開始 AD 刪除操作。

**刪除 FSx for Windows File Server 檔案系統。**

1. 開啟 [Amazon FSx 主控台](https://console.aws.amazon.com//fsx/)

1. 選取您剛建立之 FSx for Windows File Server 檔案系統左側的選項按鈕。

1. 選擇**動作**。

1. 選取 **Delete file system** (刪除檔案系統)。

**刪除 AD。**

1. 開啟 [Directory Service 主控台](https://console.aws.amazon.com//directoryservicev2/)。

1. 選擇您剛建立之 AD 左側的選項按鈕。

1. 選擇**動作**。

1. 選擇 **Delete directory** (刪除目錄)。

**刪除叢集。**

1. 開啟主控台，網址為 [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)。

1. 在導覽窗格中選擇**叢集**，然後選擇 **windows-fsx-cluster**。

1. 選擇 **Delete cluster (刪除叢集)**。

1. 輸入短語，然後選擇**刪除**。

**終止 EC2 執行個體。**

1. 開啟 [Amazon EC2 主控台](https://console.aws.amazon.com//ec2/)。

1. 從左側選單中，選取 **Instances** (執行個體)。

1. 勾選您建立之 EC2 執行個體左側的核取方塊。

1. 按一下**執行個體狀態**和**終止執行個體**。

**刪除密碼。**

1. 開啟 [Secrets Manager 主控台](https://console.aws.amazon.com//secretsmanager/)。

1. 選取您為此逐步解說所建立的機密。

1. 按一下 **Actions** (動作)。

1. 選擇 **Delete secret** (刪除機密)。

# 搭配 Amazon ECS 使用 Docker 磁碟區
<a name="docker-volumes"></a>

使用 Docker 磁碟區時，可以使用內建的 `local` 驅動程式或第三方磁碟區驅動程式。Docker 磁碟區是由 Docker 管理，並且會在容器執行個體上的 `/var/lib/docker/volumes` 中建立一個目錄，其中包含磁碟區資料。

若要使用 Docker 磁碟區，請在您的任務定義中指定 `dockerVolumeConfiguration`。如需詳細資訊，請參閱 Docker 文件中的 [Volumes](https://docs.docker.com/engine/storage/volumes/)。

Docker 磁碟區的一些常用案例如下：
+ 提供搭配容器使用的持久性資料磁碟區
+ 在相同的容器執行個體上不同容器的不同位置共用定義的資料磁碟區
+ 定義空的非持久性資料磁碟區，並將其掛載到相同任務內的多個容器上
+ 將資料磁碟區提供給由第三方驅動程式管理的任務

## 使用 Docker 磁碟區時的考量
<a name="docker-volume-considerations"></a>

使用 Docker 磁碟區時，請考量下列事項：
+ 只有在使用 EC2 啟動類型或外部執行個體時才支援 Docker 磁碟區。
+ Windows 容器只支援使用 `local` 驅動程式。
+ 如果使用第三方驅動程式，確保先在容器執行個體上安裝及使用它，容器代理程式才會啟動。如果在啟動代理程式之前沒有啟動第三方驅動程式，您可以使用下列命令之一重新啟動容器代理程式：
  + 對於 Amazon ECS 最佳化 Amazon Linux 2 AMI：

    ```
    sudo systemctl restart ecs
    ```
  + 對於 Amazon ECS 最佳化 Amazon Linux AMI：

    ```
    sudo stop ecs && sudo start ecs
    ```

如需有關如何在任務定義中指定 Docker 磁碟區的資訊，請參閱[在 Amazon ECS 任務定義中指定 Docker 磁碟區](specify-volume-config.md)。

# 在 Amazon ECS 任務定義中指定 Docker 磁碟區
<a name="specify-volume-config"></a>

您必須先在任務定義中指定磁碟區和掛載點組態，您的容器才可以使用資料磁碟區。本節說明容器的磁碟區組態。對於使用 Docker 磁碟區的任務，指定 `dockerVolumeConfiguration`。對於使用綁定掛載主機磁碟區的任務，指定 `host` 和選用的 `sourcePath`。

以下任務定義 JSON 說明容器 `volumes` 和 `mountPoints` 物件的語法。

```
{
    "containerDefinitions": [
        {
            "mountPoints": [
                {
                    "sourceVolume": "string",
                    "containerPath": "/path/to/mount_volume",
                    "readOnly": boolean
                }
            ]
        }
    ],
    "volumes": [
        {
            "name": "string",
            "dockerVolumeConfiguration": {
                "scope": "string",
                "autoprovision": boolean,
                "driver": "string",
                "driverOpts": {
                    "key": "value"
                },
                "labels": {
                    "key": "value"
                }
            }
        }
    ]
}
```

`name`  
類型：字串  
必要：否  
磁碟區名稱。最多可輸入 255 個字母 (大小寫)、數字、連字號 (`-`) 與底線 (`_`)。在容器定義 `mountPoints` 物件的 `sourceVolume` 參數中參考此名稱。

`dockerVolumeConfiguration`  
類型：[DockerVolumeConfiguration](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DockerVolumeConfiguration.html) 物件  
必要：否  
此參數只有使用 Docker 磁碟區時才會指定。只有在 EC2 執行個體上執行任務時，才支援 Docker 磁碟區。Windows 容器只支援使用 `local` 驅動程式。若要使用綁定掛載，請指定 `host`。    
`scope`  
類型：字串  
有效值: `task` \$1 `shared`  
必要：否  
決定生命週期的 Docker 磁碟區範圍。範圍受限於 `task` 的 Docker 磁碟區，會在任務啟動時自動佈建，以及在任務停止時銷毀。範圍為 `shared` 的 Docker 磁碟區會在任務停止之後保留。  
`autoprovision`  
類型：布林值  
預設值：`false`  
必要：否  
若此數值為 `true`，Docker 磁碟區便得以建立 (若它尚不存在)。此欄位只有在 `scope` 的值為 `shared` 才會使用。如果 `scope` 的值為 `task`，則此參數必須省略。  
`driver`  
類型：字串  
必要：否  
要使用的 Docker 磁碟區驅動程式。驅動程式值必須符合 Docker 提供的驅動程式名稱，因為此名稱會用於任務置放。如果使用 Docker 外掛程式 CLI 安裝驅動程式，則使用 `docker plugin ls` 從容器執行個體擷取驅動程式名稱。如果使用其他方法安裝驅動程式，則使用 Docker 外掛程式探索來擷取驅動程式名稱。  
`driverOpts`  
類型：字串  
必要：否  
一組需傳遞的、專用於 Docker 驅動程式的選項映射。此參數會映射至 Docker 中「Create a volume」區段的 `DriverOpts`。  
`labels`  
類型：字串  
必要：否  
自訂中繼資料，新增到您的 Docker 磁碟區。

`mountPoints`  
類型：物件陣列  
必要：否  
容器中資料磁碟區的掛載點。此參數會映射至 Docker API 中 create-container 的 `Volumes`，以及 docker run 的 `--volume` 選項。  
Windows 容器可在 `$env:ProgramData` 所在的相同磁碟上掛載整個目錄。Windows 容器無法在不同的磁碟機上掛載目錄，且掛載點不能跨磁碟機使用。您必須指定掛載點，將 Amazon EBS 磁碟區直接連接至 Amazon ECS 任務。    
`sourceVolume`  
類型：字串  
必要：是 (當使用 `mountPoints` 時)  
要掛載的磁碟區名稱。  
`containerPath`  
類型：字串  
必要：是 (當使用 `mountPoints` 時)  
掛載磁碟區之容器中的路徑。  
`readOnly`  
類型：布林值  
必要：否  
如果此數值為 `true`，容器擁有磁碟區的唯讀存取權。如果此值為 `false`，則容器可寫入磁碟區。預設值為 `false`。  
對於在執行 Windows 作業系統之 EC2 執行個體上執行的任務，將該值保留為預設值 `false`。

# Amazon ECS 的 Docker 磁碟區範例
<a name="docker-volume-examples"></a>

下列範例示範如何為容器提供暫時性儲存，以及如何為多個容器提供共用磁碟區，以及如何為容器提供 NFS 持久性儲存。

**使用 Docker 磁碟區為單個容器提供暫時性儲存**

在此範例中，容器使用任務完成後清除的空白資料磁碟區。舉一個使用案例範例，您的容器在任務期間需要存取一些暫存檔案儲存位置。使用 Docker 磁碟區可達成此任務。

1. 在任務定義 `volumes` 區段，以 `name` 和 `DockerVolumeConfiguration` 值定義資料磁碟區。在本範例中，我們指定範圍為 `task`，所以會在任務停止後刪除磁碟區，並使用內建的 `local` 驅動程式。

   ```
   "volumes": [
       {
           "name": "scratch",
           "dockerVolumeConfiguration" : {
               "scope": "task",
               "driver": "local",
               "labels": {
                   "scratch": "space"
               }
           }
       }
   ]
   ```

1. 在 `containerDefinitions` 區段中定義容器，並使用 `mountPoints` 值來參考已定義的磁碟區名稱，使用 `containerPath` 值將磁碟區掛載於容器。

   ```
   "containerDefinitions": [
       {
           "name": "container-1",
           "mountPoints": [
               {
                 "sourceVolume": "scratch",
                 "containerPath": "/var/scratch"
               }
           ]
       }
   ]
   ```

**使用 Docker 磁碟區為多個容器提供持續性儲存**

在此範例中，您要多個容器使用一個共用磁碟區，並且要在使用它的任何單一任務停止之後加以保留。正在使用內建的 `local` 驅動程式。如此一來，磁碟區仍受限於容器執行個體的生命週期。

1. 在任務定義 `volumes` 區段，以 `name` 和 `DockerVolumeConfiguration` 值定義資料磁碟區。在此範例中，指定 `shared` 範圍，以便持續保留磁碟區，請將 autoprovision 設定為 `true`。如此一來，已建立該磁碟區以供使用。然後，還可以使用內建 `local` 驅動程式。

   ```
   "volumes": [
       {
           "name": "database",
           "dockerVolumeConfiguration" : {
               "scope": "shared",
               "autoprovision": true,
               "driver": "local",
               "labels": {
                   "database": "database_name"
               }
           }
       }
   ]
   ```

1. 在 `containerDefinitions` 區段中定義容器，並使用 `mountPoints` 值來參考已定義的磁碟區名稱，使用 `containerPath` 值將磁碟區掛載於容器。

   ```
   "containerDefinitions": [
       {
           "name": "container-1",
           "mountPoints": [
           {
             "sourceVolume": "database",
             "containerPath": "/var/database"
           }
         ]
       },
       {
         "name": "container-2",
         "mountPoints": [
           {
             "sourceVolume": "database",
             "containerPath": "/var/database"
           }
         ]
       }
     ]
   ```

**使用 Docker 磁碟區提供容器的 NFS 持久性儲存**

 在此範例中，容器使用 NFS 資料磁碟區，該資料磁碟區在任務啟動時自動掛載並在任務停止時自動卸載。這可使用 Docker 內建 `local` 驅動程式加以實現。一個範例使用案例是，您可能有本機 NFS 儲存體，並且需要從 ECS Anywhere 任務進行存取。這可以使用具有 NFS 驅動程式選項的 Docker 磁碟區來達成。

1. 在任務定義 `volumes` 區段，以 `name` 和 `DockerVolumeConfiguration` 值定義資料磁碟區。在此範例中，指定 `task` 範圍，以便在任務停止後卸載磁碟區。使用 `local` 驅動程式並相應地使用 `type`、`device` 和 `o` 選項設定 `driverOpts`。使用 NFS 伺服器端點取代 `NFS_SERVER`。

   ```
   "volumes": [
          {
              "name": "NFS",
              "dockerVolumeConfiguration" : {
                  "scope": "task",
                  "driver": "local",
                  "driverOpts": {
                      "type": "nfs",
                      "device": "$NFS_SERVER:/mnt/nfs",
                      "o": "addr=$NFS_SERVER"
                  }
              }
          }
      ]
   ```

1. 在 `containerDefinitions` 區段中定義容器，並使用 `mountPoints` 值來參考已定義的磁碟區名稱，使用 `containerPath` 值將磁碟區掛載在容器上。

   ```
   "containerDefinitions": [
          {
              "name": "container-1",
              "mountPoints": [
                  {
                    "sourceVolume": "NFS",
                    "containerPath": "/var/nfsmount"
                  }
              ]
          }
      ]
   ```

# 搭配 Amazon ECS 使用綁定掛載
<a name="bind-mounts"></a>

透過綁定掛載，主機上的檔案或目錄 (例如 Amazon EC2 執行個體) 會掛載至容器中。在 Fargate 和 Amazon EC2 執行個體上託管的任務支援綁定掛載。綁定掛載與使用它們的容器的生命週期相關聯。使用綁定掛載的所有容器停止之後，例如當任務停止時，資料就會被移除。對於 Amazon EC2 執行個體上託管的任務，可以將資料連接至主機 Amazon EC2 執行個體的生命週期，方法是在任務定義中指定 `host` 與選用的 `sourcePath` 值。如需詳細資訊，請參閱 Docker 文件中的 [Bind mounts](https://docs.docker.com/engine/storage/bind-mounts/)。

以下是綁定掛載的常用案例。
+ 若要提供空白的資料磁碟區以便在一個或多個容器中掛載。
+ 若要在一個或多個容器中掛載主機資料磁碟區。
+ 若要與相同任務中的其他容器共用來源容器的資料磁碟區。
+ 若要將 Dockerfile 中的路徑及其內容公開給一個或多個容器。

## 使用綁定掛載時的考量
<a name="bind-mount-considerations"></a>

使用綁定掛載時，請考量下列事項。
+ 在預設情況下， AWS Fargate 使用平台版本 `1.4.0`或更新版本 (Linux) `1.0.0`或更新版本 (Windows) 在 上託管的任務，會接收至少 20 GiB 的暫時性儲存，以進行綁定掛載。您可以透過在任務定義中指定 `ephemeralStorage` 參數來增加暫時性儲存的總量，最多可達 200 GiB。
+ 若要在執行任務時將 Dockerfile 中的檔案公開至資料磁碟區，Amazon ECS 資料平面會尋找 `VOLUME` 指令。如果在 `VOLUME` 指令中指定的絕對路徑與在任務定義中指定的 `containerPath` 相同，則 `VOLUME` 指令路徑中的資料會複製到資料磁碟區。在下列 Dockerfile 範例中，`/var/log/exported` 目錄中名為 `examplefile` 的檔案會寫入主機，然後掛載在容器內。

  ```
  FROM public.ecr.aws/amazonlinux/amazonlinux:latest
  RUN mkdir -p /var/log/exported
  RUN touch /var/log/exported/examplefile
  VOLUME ["/var/log/exported"]
  ```

  根據預設，磁碟區許可設定為 `0755` 和擁有者設定為 `root`。您可以在 Dockerfile 中自訂這些許可。在下列範例中，將目錄的擁有者設定為 `node`。

  ```
  FROM public.ecr.aws/amazonlinux/amazonlinux:latest
  RUN yum install -y shadow-utils && yum clean all
  RUN useradd node
  RUN mkdir -p /var/log/exported && chown node:node /var/log/exported
  RUN touch /var/log/exported/examplefile
  USER node
  VOLUME ["/var/log/exported"]
  ```
+ 對於在 Amazon EC2 執行個體上託管的任務，當 `host` 和 `sourcePath` 值未指定時，Docker 常駐程式會為您管理綁定掛載。當沒有任何容器參考此綁定掛載時，Amazon ECS 容器代理程式任務清除服務最終會予以刪除。根據預設，這會在容器退出的 3 小時後發生。不過，您可以使用 `ECS_ENGINE_TASK_CLEANUP_WAIT_DURATION` 代理程式變數設定此持續時間。如需詳細資訊，請參閱[Amazon ECS 容器代理程式組態](ecs-agent-config.md)。如果您需要此資料的保留時間超過容器的生命週期，請為綁定掛載指定 `sourcePath` 值。
+ 對於託管在 Amazon ECS 受管執行個體上的任務，根檔案系統的部分是唯讀的。讀取/寫入繫結掛載必須使用可寫入目錄，例如`/var`持久性資料或`/tmp`暫存資料。嘗試建立其他目錄的讀取/寫入繫結掛載會導致任務無法啟動，並出現類似以下的錯誤：

  ```
  error creating empty volume: error while creating volume path '/path': mkdir /path: read-only file system
  ```

  唯讀繫結掛載 （在 `mountPoints` 參數`"readOnly": true`中以 設定） 可以指向主機上任何可存取的目錄。

  若要檢視可寫入路徑的完整清單，您可以在 Amazon ECS 受管執行個體上執行任務，並使用 檢查執行個體的掛載資料表。使用下列設定建立任務定義，以存取主機檔案系統：

  ```
  {
      "pidMode": "host",
      "containerDefinitions": [{
          "privileged": true,
          ...
      }]
  }
  ```

  然後從容器內執行下列命令：

  ```
  # List writable mounts
  cat /proc/1/root/proc/1/mounts | awk '$4 ~ /^rw,/ || $4 == "rw" {print $2}' | sort
  
  # List read-only mounts
  cat /proc/1/root/proc/1/mounts | awk '$4 ~ /^ro,/ || $4 == "ro" {print $2}' | sort
  ```
**重要**  
`privileged` 設定會授予主機上的容器延伸功能，相當於根存取。在此範例中，它用於檢查主機的掛載資料表以進行診斷。如需詳細資訊，請參閱[避免以特權方式執行容器 (Amazon EC2)](security-tasks-containers.md#security-tasks-containers-recommendations-avoid-privileged-containers)。

  如需在容器中以互動方式執行命令的詳細資訊，請參閱 [使用 ECS Exec 監控 Amazon ECS 容器](ecs-exec.md)。

# 在 Amazon ECS 任務定義中指定綁定掛載
<a name="specify-bind-mount-config"></a>

對於託管在 Fargate 或 Amazon EC2 執行個體上的 Amazon ECS 任務，下列任務定義 JSON 程式碼片段展示了任務定義的 `volumes`、`mountPoints` 以及 `ephemeralStorage` 物件的語法。

```
{
   "family": "",
   ...
   "containerDefinitions" : [
      {
         "mountPoints" : [
            {
               "containerPath" : "/path/to/mount_volume",
               "sourceVolume" : "string"
            }
          ],
          "name" : "string"
       }
    ],
    ...
    "volumes" : [
       {
          "name" : "string"
       }
    ],
    "ephemeralStorage": {
	   "sizeInGiB": integer
    }
}
```

對於託管於 Amazon EC2 執行個體上的 Amazon ECS 任務，您可以在指定任務磁碟區詳細資訊時使用選用的 `host` 參數和 `sourcePath`。指定時，它會將綁定掛載任務的生命週期，而不是容器。

```
"volumes" : [
    {
        "host" : {
            "sourcePath" : "string"
        },
        "name" : "string"
    }
]
```

下面會更詳細地描述每個任務定義參數。

`name`  
類型：字串  
必要：否  
磁碟區名稱。最多可輸入 255 個字母 (大小寫)、數字、連字號 (`-`) 與底線 (`_`)。在容器定義 `mountPoints` 物件的 `sourceVolume` 參數中參考此名稱。

`host`  
必要：否  
`host` 參數用於將綁定掛載的生命週期綁定到主機 Amazon EC2 執行個體，而非任務，以及它的儲存位置。如果 `host` 參數是空的，則 Docker 常駐程式會為您的資料磁碟區指派主機路徑，但其相關聯的容器停止執行後，不保證會保留資料。  
Windows 容器可在 `$env:ProgramData` 所在的相同磁碟上掛載整個目錄。  
只有在使用託管在 Amazon EC2 執行個體或 Amazon ECS 受管執行個體上的任務時，才支援 `sourcePath` 參數。  
`sourcePath`  
類型：字串  
必要：否  
使用 `host` 參數時，指定 `sourcePath` 以宣告在主機 Amazon EC2 執行個體上提供給容器的路徑。如果此參數是空的，則 Docker 常駐程式會為您指派主機路徑。如果 `host` 參數包含 `sourcePath` 檔案位置，資料磁碟區將保留在主機 Amazon EC2 執行個體上的指定位置，直到您手動將其刪除為止。如果 `sourcePath` 值不存在於主機 Amazon EC2 執行個體，Docker 常駐程式將建立該值。如果位置存在，將匯出來源路徑資料夾的內容。

`mountPoints`  
類型：物件陣列  
必要：否  
容器中資料磁碟區的掛載點。此參數會映射至 Docker API 中 create-container 的 `Volumes`，以及 docker run 的 `--volume` 選項。  
Windows 容器可在 `$env:ProgramData` 所在的相同磁碟上掛載整個目錄。Windows 容器無法在不同的磁碟機上掛載目錄，且掛載點不能跨磁碟機使用。您必須指定掛載點，將 Amazon EBS 磁碟區直接連接至 Amazon ECS 任務。    
`sourceVolume`  
類型：字串  
必要：是 (當使用 `mountPoints` 時)  
要掛載的磁碟區名稱。  
`containerPath`  
類型：字串  
必要：是 (當使用 `mountPoints` 時)  
掛載磁碟區之容器中的路徑。  
`readOnly`  
類型：布林值  
必要：否  
如果此數值為 `true`，容器擁有磁碟區的唯讀存取權。如果此值為 `false`，則容器可寫入磁碟區。預設值為 `false`。  
對於在執行 Windows 作業系統之 EC2 執行個體上執行的任務，將該值保留為預設值 `false`。

`ephemeralStorage`  
類型：物件  
必要：否  
為任務配置的暫時性儲存量。對於 AWS Fargate 使用平台版本 `1.4.0`或更新版本 (Linux) 或更新版本 (`1.0.0`Windows) 在 上託管的任務，此參數用於擴展可用的暫時性儲存總量，超過預設數量。  
您可以使用 Copilot CLI、CloudFormation、 AWS SDK 或 CLI 來指定繫結掛載的暫時性儲存。

# Amazon ECS 的綁定掛載範例
<a name="bind-mount-examples"></a>

下列範例涵蓋對容器使用綁定掛載的常見使用案例。

**若要為 Fargate 任務分配更多的暫時性儲存量**

對於託管於使用平台版本 `1.4.0` 或更新版本 (Linux) 或者 `1.0.0` (Windows) 的 Fargate 上的 Amazon ECS 任務，您可以為任務中的容器分配比預設暫時性儲存量更多的空間以供使用。此範例可以整合到其他範例中，為您的 Fargate 任務分配更多的暫時性儲存。
+ 在任務定義中，定義 `ephemeralStorage` 物件。`sizeInGiB` 必須是 `21` 和 `200` 之間的整數並以 GiB 為單位來表示。

  ```
  "ephemeralStorage": {
      "sizeInGiB": integer
  }
  ```

**若要為一個或多個容器提供空白的資料磁碟區**

在某些情況下，您希望在任務中為容器提供一些暫存空間。例如，您可能有兩個資料庫容器，在任務期間需要存取相同的暫存檔案儲存位置。這可以使用綁定掛載來達成。

1. 在任務定義 `volumes` 區段中，以名稱 `database_scratch` 定義綁定掛載。

   ```
     "volumes": [
       {
         "name": "database_scratch"
       }
     ]
   ```

1. 在 `containerDefinitions` 區段中，建立資料庫容器定義。如此一來，它們就可以掛載磁碟區。

   ```
   "containerDefinitions": [
       {
         "name": "database1",
         "image": "my-repo/database",
         "cpu": 100,
         "memory": 100,
         "essential": true,
         "mountPoints": [
           {
             "sourceVolume": "database_scratch",
             "containerPath": "/var/scratch"
           }
         ]
       },
       {
         "name": "database2",
         "image": "my-repo/database",
         "cpu": 100,
         "memory": 100,
         "essential": true,
         "mountPoints": [
           {
             "sourceVolume": "database_scratch",
             "containerPath": "/var/scratch"
           }
         ]
       }
     ]
   ```

**若要將 Docker 文件中的路徑及其內容公開給容器**

在此範例中，您有一個 Dockerfile，它會寫入您想要掛載在容器內的資料。此範例適用於 Fargate 或 Amazon EC2 執行個體上託管的任務。

1. 建立 Dockerfile。下列範例使用公有 Amazon Linux 2 容器映像，並在我們想要在容器內部掛載的 `/var/log/exported` 目錄中建立名為 `examplefile` 的檔案。`VOLUME` 指令應該指定一個絕對路徑。

   ```
   FROM public.ecr.aws/amazonlinux/amazonlinux:latest
   RUN mkdir -p /var/log/exported
   RUN touch /var/log/exported/examplefile
   VOLUME ["/var/log/exported"]
   ```

   根據預設，磁碟區許可設定為 `0755` 和擁有者設定為 `root`。可以在 Docker 檔案中變更這些許可。在下列範例中，`/var/log/exported` 目錄的擁有者設定為 `node`。

   ```
   FROM public.ecr.aws/amazonlinux/amazonlinux:latest
   RUN yum install -y shadow-utils && yum clean all
   RUN useradd node
   RUN mkdir -p /var/log/exported && chown node:node /var/log/exported					    
   USER node
   RUN touch /var/log/exported/examplefile
   VOLUME ["/var/log/exported"]
   ```

1. 在任務定義 `volumes` 區段中，以名稱 `application_logs` 定義一個磁碟區。

   ```
     "volumes": [
       {
         "name": "application_logs"
       }
     ]
   ```

1. 在 `containerDefinitions` 區段中，建立應用程式容器定義。如此一來，它們就可以掛載儲存。`containerPath` 值必須符合 Dockerfile `VOLUME` 指令中指定的絕對路徑。

   ```
     "containerDefinitions": [
       {
         "name": "application1",
         "image": "my-repo/application",
         "cpu": 100,
         "memory": 100,
         "essential": true,
         "mountPoints": [
           {
             "sourceVolume": "application_logs",
             "containerPath": "/var/log/exported"
           }
         ]
       },
       {
         "name": "application2",
         "image": "my-repo/application",
         "cpu": 100,
         "memory": 100,
         "essential": true,
         "mountPoints": [
           {
             "sourceVolume": "application_logs",
             "containerPath": "/var/log/exported"
           }
         ]
       }
     ]
   ```

**若要為與主機 Amazon EC2 執行個體生命週期相關聯的容器提供空資料磁碟區**

對於在 Amazon EC2 執行個體上託管的任務，您可以使用綁定掛載，並將資料與主機 Amazon EC2 執行個體的生命週期相關聯。您可以使用 `host` 參數並指定 `sourcePath` 值來達成此操作。位在 `sourcePath` 的任何檔案都會出現在值為 `containerPath` 的容器中。寫入 `containerPath` 值的任何檔案都會寫入主機 Amazon EC2 執行個體上的 `sourcePath` 值。
**重要**  
Amazon ECS 不會在 Amazon EC2 執行個體之間同步您的儲存。使用持久性儲存的任務可以放置在您有可用容量之叢集中的任何 Amazon EC2 執行個體。如果您的任務在停止和重新啟動後需要持久性儲存，請務必在任務啟動時間使用 AWS CLI [start-task](https://docs.aws.amazon.com/cli/latest/reference/ecs/start-task.html) 命令指定相同的 Amazon EC2 執行個體。也可使用 Amazon EFS 磁碟區以供持久性儲存。如需詳細資訊，請參閱[將 Amazon EFS 磁碟區與 Amazon ECS 搭配使用](efs-volumes.md)。

1. 在任務定義 `volumes` 區段，以 `name` 和 `sourcePath` 值定義綁定掛載。在下列範例中，主機 Amazon EC2 執行個體包含要掛載在容器內的 `/ecs/webdata` 的資料。

   ```
     "volumes": [
       {
         "name": "webdata",
         "host": {
           "sourcePath": "/ecs/webdata"
         }
       }
     ]
   ```

1. 在 `containerDefinitions` 區段中定義容器，並使用 `mountPoints` 值來參考綁定掛載名稱，使用 `containerPath` 值在容器上掛載綁定掛載。

   ```
     "containerDefinitions": [
       {
         "name": "web",
         "image": "public.ecr.aws/docker/library/nginx:latest",
         "cpu": 99,
         "memory": 100,
         "portMappings": [
           {
             "containerPort": 80,
             "hostPort": 80
           }
         ],
         "essential": true,
         "mountPoints": [
           {
             "sourceVolume": "webdata",
             "containerPath": "/usr/share/nginx/html"
           }
         ]
       }
     ]
   ```

**在不同位置的多個容器中掛載已定義的磁碟區**

您可以在任務定義中定義資料磁碟區，並將該磁碟區掛載到不同容器的不同位置。例如，您的主機容器有一個位於 `/data/webroot` 的網站資料夾。建議您以唯讀方式將該資料磁碟區掛載到有不同文件根目錄的兩個不同 Web 伺服器上。

1. 在任務定義 `volumes` 區段中，以名稱 `webroot` 和來源路徑 `/data/webroot` 定義資料磁碟區。

   ```
     "volumes": [
       {
         "name": "webroot",
         "host": {
           "sourcePath": "/data/webroot"
         }
       }
     ]
   ```

1. 在 `containerDefinitions` 區段中，使用 `mountPoints` 值為每個 Web 伺服器定義容器，這些值會建立 `webroot` 磁碟區與指向該容器文件根目錄之 `containerPath` 值的關聯性。

   ```
     "containerDefinitions": [
       {
         "name": "web-server-1",
         "image": "my-repo/ubuntu-apache",
         "cpu": 100,
         "memory": 100,
         "portMappings": [
           {
             "containerPort": 80,
             "hostPort": 80
           }
         ],
         "essential": true,
         "mountPoints": [
           {
             "sourceVolume": "webroot",
             "containerPath": "/var/www/html",
             "readOnly": true
           }
         ]
       },
       {
         "name": "web-server-2",
         "image": "my-repo/sles11-apache",
         "cpu": 100,
         "memory": 100,
         "portMappings": [
           {
             "containerPort": 8080,
             "hostPort": 8080
           }
         ],
         "essential": true,
         "mountPoints": [
           {
             "sourceVolume": "webroot",
             "containerPath": "/srv/www/htdocs",
             "readOnly": true
           }
         ]
       }
     ]
   ```

**使用 `volumesFrom` 掛載來自其他容器的磁碟區**

針對在 Amazon EC2 執行個體上託管的任務，您可以在容器上定義一或多個磁碟區，然後在相同的任務中的不同的容器定義中使用 `volumesFrom` 參數，將所有來自 `sourceContainer` 的磁碟區掛載在其原始定義的掛載點。`volumesFrom` 參數適用於在任務定義中定義的磁碟區，以及使用 Dockerfile 內建在映像中的磁碟區。

1. (選用) 若要共用內建在映像的磁碟區，請使用 Dockerfile 中的 `VOLUME` 指令。以下範例 Dockerfile 使用 `httpd` 映像，然後新增磁碟區，再將之掛載到 Apache 文件根中的 `dockerfile_volume`。該資料夾由 `httpd` Web 伺服器使用。

   ```
   FROM httpd
   VOLUME ["/usr/local/apache2/htdocs/dockerfile_volume"]
   ```

   您可以使用此 Dockerfile 建立映像，並將之推送到儲存庫，例如 Docker Hub，然後在您的任務定義中使用。在以下步驟中使用的範例 `my-repo/httpd_dockerfile_volume` 映像是使用前述的 Dockerfile 所建立。

1. 建立任務定義，定義您容器的其他磁碟區及掛載點。在這個範例 `volumes` 區段中，您要建立一個名為 `empty` 的空磁碟區，它是由 Docker 常駐程式管理。您還要定義一個稱為 `host_etc` 的主機磁碟區。它會匯出主機容器執行個體的 `/etc` 資料夾。

   ```
   {
     "family": "test-volumes-from",
     "volumes": [
       {
         "name": "empty",
         "host": {}
       },
       {
         "name": "host_etc",
         "host": {
           "sourcePath": "/etc"
         }
       }
     ],
   ```

   在容器定義區段中，建立一個容器，掛載之前定義的磁碟區。在此範例中，`web` 容器掛載 `empty` 和 `host_etc` 磁碟區。這是使用由 Dockerfile 中的磁碟區建立的映像的容器。

   ```
   "containerDefinitions": [
       {
         "name": "web",
         "image": "my-repo/httpd_dockerfile_volume",
         "cpu": 100,
         "memory": 500,
         "portMappings": [
           {
             "containerPort": 80,
             "hostPort": 80
           }
         ],
         "mountPoints": [
           {
             "sourceVolume": "empty",
             "containerPath": "/usr/local/apache2/htdocs/empty_volume"
           },
           {
             "sourceVolume": "host_etc",
             "containerPath": "/usr/local/apache2/htdocs/host_etc"
           }
         ],
         "essential": true
       },
   ```

   建立另一個容器，使用 `volumesFrom` 掛載與 `web` 容器相關聯的所有磁碟區。`web` 容器上的所有磁碟區同樣掛載在 `busybox` 容器上。這包括在 Dockerfile 中指定的磁碟區，該磁碟區用於建置 `my-repo/httpd_dockerfile_volume` 映像。

   ```
       {
         "name": "busybox",
         "image": "busybox",
         "volumesFrom": [
           {
             "sourceContainer": "web"
           }
         ],
         "cpu": 100,
         "memory": 500,
         "entryPoint": [
           "sh",
           "-c"
         ],
         "command": [
           "echo $(date) > /usr/local/apache2/htdocs/empty_volume/date && echo $(date) > /usr/local/apache2/htdocs/host_etc/date && echo $(date) > /usr/local/apache2/htdocs/dockerfile_volume/date"
         ],
         "essential": false
       }
     ]
   }
   ```

   執行此任務時，兩個容器會掛載磁碟區，而 `busybox` 容器中的 `command` 會將日期和時間寫入檔案。這個檔案在每個磁碟區資料夾中稱為 `date`。然後，在 `web` 容器所顯示的網站上，就能看到這些資料夾。
**注意**  
由於 `busybox` 容器執行快速命令，然後結束，所以在容器定義中必須設為 `"essential": false`。否則，它結束時會停止整個任務。

# 在 Amazon ECS 上管理容器交換記憶體空間
<a name="container-swap"></a>

透過 Amazon ECS，您可在容器層級控制 Linux Amazon EC2 執行個體上的交換記憶體空間用量。使用每個容器交換組態，任務定義內的每個容器都可以啟用或停用交換。對於已啟用交換的容器，可以限制所使用的最大交換空間量。例如，對延遲要求嚴格的容器可以停用交換。相對的，具有高暫時性記憶體需求的容器可以開啟交換，以降低容器在處於低負載時發生記憶體不足錯誤的機會。

容器的交換組態由下列容器定義參數管理：

`maxSwap`  
容器可以使用的交換記憶體總量 (以 MiB 為單位)。此參數將會轉換為 docker run 的 `--memory-swap` 選項，其中值是容器記憶體與 `maxSwap` 值的總和。  
如果將 `maxSwap` 值指定為 `0`，容器不會使用交換。接受的值為 `0` 或任何正整數。如果省略 `maxSwap` 參數，容器使用其執行所在的容器執行個體的交換組態。必須設定 `maxSwap` 值，才能使用 `swappiness` 參數。

`swappiness`  
您可藉此調整容器的記憶體交換行為。`swappiness` 的值若為 `0` 將導致交換不會發生 (除非有需要)。為 `100` 的 `swappiness` 值導致積極地交換頁面。接受的值為介於 `0` 與 `100` 之間的整數。如果未指定 `swappiness` 參數，則會使用預設值 `60`。如果未對 `maxSwap` 指定值，則會忽略此參數。此參數會對應 docker run 的 `--memory-swappiness` 選項。

在以下範例中，提供了 JSON 語法。

```
"containerDefinitions": [{
        ...
        "linuxParameters": {
            "maxSwap": integer,
            "swappiness": integer
        },
        ...
}]
```

## 考量事項
<a name="container-swap-considerations"></a>

當您使用每個容器交換組態時，請考量下列事項。
+ 必須在託管任務的 Amazon EC2 執行個體上啟用和配置交換空間，容器才能使用這些空間。根據預設，Amazon ECS 最佳化 AMI 沒有啟用交換功能。您必須在執行個體上啟用交換，才能使用此功能。如需詳細資訊，請參閱 *Amazon EC2 User Guide* 中的 [Instance Store Swap Volumes](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-store-swap-volumes.html)，或[如何透過使用交換檔案配置記憶體，以用作 Amazon EC2 執行個體中的交換空間？](https://repost.aws/knowledge-center/ec2-memory-swap-file)
+ 只有指定 EC2 的任務定義才支援交換空間容器定義參數。僅供 Fargate 上的 Amazon ECS 使用的任務定義不支援這些參數。
+ 只有 Linux 容器才支援此功能。目前不支援 Windows 容器。
+ 如果從任務定義中省略 `maxSwap` 和 `swappiness` 容器定義參數，每個容器都有一個為 `60` 的預設 `swappiness` 值。此外，交換總用量限制為容器記憶體的兩倍。
+ 如果您在 Amazon Linux 2023 上使用任務，則不支援 `swappiness` 參數。

# Amazon ECS 受管執行個體的 Amazon ECS 任務定義差異
<a name="managed-instances-tasks-services"></a>

若要使用 Amazon ECS 受管執行個體，必須將任務定義設定為使用 Amazon ECS 受管執行個體啟動類型。使用 Amazon ECS 受管執行個體時需注意額外考量。

## 任務定義參數
<a name="managed-instances-task-parameters"></a>

使用 Amazon ECS 受管執行個體的任務，支援大多數可用的 Amazon ECS 任務定義參數。不過，部分參數在與 Amazon ECS 受管執行個體任務搭配使用時有特定的行為或限制。

下列任務定義參數在 Amazon ECS 受管執行個體任務中無效：
+ `disableNetworking`
+ `dnsSearchDomains`
+ `dnsServers`
+ `dockerLabels`
+ `dockerSecurityOptions`
+ `dockerVolumeConfiguration`
+ `ephemeralStorage`
+ `extraHosts`
+ `fsxWindowsFileServerVolumeConfiguration`
+ `hostname`
+ `inferenceAccelerator`
+ `ipcMode`
+ `links`
+ `maxSwap`
+ `proxyConfiguration`
+ `sharedMemorySize`
+ `sourcepath` 磁碟區
+ `swappiness`
+ `tmpfs`

下列任務定義參數在 Amazon ECS 受管執行個體任務中有效，但應注意其限制：
+ `networkConfiguration` – Amazon ECS 受管執行個體任務使用 `awsvpc` 或 `host` 網路模式。
+ `placementConstraints` – 支援下列條件約束屬性。
  + `ecs.subnet-id`
  + `ecs.availability-zone`
  + `ecs.instance-type`
  + `ecs.cpu-architecture`
+ `requiresCompatibilities` – 必須包含 `MANAGED_INSTANCES`，才能確保任務定義與 Amazon ECS 受管執行個體相容。
+ `resourceRequirement` – `InferenceAccelerator` 不受支援。
+ `operatingSystemFamily` – Amazon ECS 受管執行個體使用 `LINUX`。
+ `volumes` - 搭配 使用繫結掛載時`sourcePath`，路徑必須指向主機上的可寫入目錄。Amazon ECS 受管執行個體檔案系統的部分為唯讀。可寫入目錄包括 `/var`和 `/tmp`。如需詳細資訊，請參閱[搭配 Amazon ECS 使用綁定掛載](bind-mounts.md)。

為確保任務定義通過驗證，可與 Amazon ECS 受管執行個體搭配使用，您可以在註冊任務定義時指定下列項目：
+ 在 中 AWS 管理主控台，對於**需要相容性**欄位中，指定 `MANAGED_INSTANCES`。
+ 在 中 AWS CLI，指定 `--requires-compatibilities`選項。
+ 在 Amazon ECS API 中，指定 `requiresCompatibilities` 標記。

# Fargate 的 Amazon ECS 任務定義差異
<a name="fargate-tasks-services"></a>

若要使用 Fargate，必須將任務定義設定為使用 Fargate 啟動類型。使用 Fargate 時需注意額外考量。

## 任務定義參數
<a name="fargate-task-parameters"></a>

使用 Fargate 的任務不支援所有可用的 Amazon ECS 任務定義參數。有些參數完全不予以支援，而其他參數對 Fargate 任務會有不同的行為。

下列任務定義參數在 Fargate 任務中無效：
+ `disableNetworking`
+ `dnsSearchDomains`
+ `dnsServers`
+ `dockerSecurityOptions`
+ `extraHosts`
+ `gpu`
+ `ipcMode`
+ `links`
+ `placementConstraints`
+ `privileged`
+ `maxSwap`
+ `swappiness`

下列任務定義參數在 Fargate 任務中有效，但應注意其限制：
+ `linuxParameters` - 當指定套用於容器的特定於 Linux 的選項時，對於 `capabilities`，您可以新增的唯一功能是 `CAP_SYS_PTRACE`。不支援 `devices`、`sharedMemorySize` 和 `tmpfs` 參數。如需詳細資訊，請參閱[Linux 參數](task_definition_parameters.md#container_definition_linuxparameters)。
+ `volumes` - Fargate 任務僅支援繫結掛載主機磁碟區，所以不支援 `dockerVolumeConfiguration` 參數。如需詳細資訊，請參閱[磁碟區](task_definition_parameters.md#volumes)。
+ `cpu` - 對於 AWS Fargate 上的 Windows 容器，值不可少於 1 個 vCPU。
+ `networkConfiguration` – Fargate 任務一律使用 `awsvpc` 網路模式。

為了確保您的任務定義通過驗證可與 Fargate 搭配使用，您可以在登錄任務定義時指定下列項目：
+ 在 中 AWS 管理主控台，對於**需要相容性**欄位中，指定 `FARGATE`。
+ 在 中 AWS CLI，指定 `--requires-compatibilities`選項。
+ 在 Amazon ECS API 中，指定 `requiresCompatibilities` 標記。

## 作業系統與架構
<a name="fargate-task-os"></a>

當您為 AWS Fargate 設定任務和容器定義，則必須指定容器執行的作業系統。AWS Fargate 支援以下作業系統：
+ Amazon Linux 2
**注意**  
Linux 容器僅使用主機作業系統中的核心與核心組態。例如，核心組態包括 `sysctl` 系統控制項。Linux 容器映像可以從包含任何 Linux 發行版本的檔案和程式的基礎映像製作。如果 CPU 架構相符，您可以從任何作業系統上的任何 Linux 容器映像執行容器。
+ Windows Server 2019 Full
+ Windows Server 2019 Core
+ Windows Server 2022 Full
+ Windows Server 2022 Core

當您在 AWS Fargate 上執行 Windows 容器時，必須具有 X86\$164 CPU 架構。

當您在 AWS Fargate 上執行 Linux 容器時，對於基於 ARM 的應用程式，可以使用 X86\$164 CPU 架構或 ARM64 架構。如需詳細資訊，請參閱[64 位元 ARM 工作負載的 Amazon ECS 任務定義](ecs-arm64.md)。

## 任務 CPU 和記憶體
<a name="fargate-tasks-size"></a>

AWS Fargate 的 Amazon ECS 任務定義需要您指定任務層級的 CPU 和記憶體。只要在任務層級指定這些資源，就可以滿足大多數使用案例。下表顯示有效的任務層級 CPU 和記憶體組合。您可以在任務定義中將記憶體值指定為以 MiB 或 GB 為單位的字串。例如，可指定 `3072` MiB 作為記憶體值，也可指定 `3 GB` GB 作為記憶體值。您可以在 JSON 檔案中將 CPU 值指定為以 CPU 為單位或虛擬 CPU (vCPU) 為單位的字串。例如，可指定 `1024` 個 CPU 單位作為 CPU 值，也可指定 `1 vCPU` 個 vCPU 作為 CPU 值。


|  CPU 數值  |  記憶體數值  |  AWS Fargate 支援的作業系統  | 
| --- | --- | --- | 
|  256 (.25 vCPU)  |  512 MiB、1 GB、2 GB  |  Linux  | 
|  512 (.5 vCPU)  |  1 GB、2 GB、3 GB、4 GB  |  Linux  | 
|  1024 (1 vCPU)  |  2 GB、3 GB、4 GB、5 GB、6 GB、7 GB、8 GB  |  Linux、Windows  | 
|  2048 (2 vCPU)  |  介於 4 GB 與 16 GB 之間，以 1 GB 為單位遞增  |  Linux、Windows  | 
|  4096 (4 vCPU)  |  介於 8 GB 與 30 GB 之間，以 1 GB 為單位遞增  |  Linux、Windows  | 
|  8192 (8 vCPU)  此選項需要 Linux 平台 `1.4.0` 或更新版本。   |  介於 16 GB 與 60 GB 之間，以 4 GB 為單位遞增  |  Linux  | 
|  16384 (16vCPU)  此選項需要 Linux 平台 `1.4.0` 或更新版本。   |  介於 32 GB 與 120 GB 之間，以 8 GB 為單位遞增  |  Linux  | 

## 任務聯網
<a name="fargate-tasks-services-networking"></a>

AWS Fargate 的 Amazon ECS 任務需要 `awsvpc` 網路模式，該網路模式會為每個任務提供彈性網絡介面。當您使用此網路模式執行任務或建立服務時，必須指定一或多個子網路來連接網路界面，以及指定一或多個安全群組來套用至網路界面。

如果使用公有子網路，請決定是否提供網路界面的公有 IP 地址。若要讓公有子網路中的 Fargate 任務提取容器映像，需要透過路由至網際網路，或可將請求路由至網際網路的 NAT 閘道，將公有 IP 地址指派給任務的彈性網路界面。若要讓私有子網路中的 Fargate 任務提取容器映像，您需要子網路中的 NAT 閘道以將請求路由到網際網路。在 Amazon ECR 中託管容器映像時，可以將 Amazon ECR 設定為使用介面 VPC 端點。在這種情況下，任務的私有 IPv4 地址會用於映像提取。如需有關 Amazon ECR 介面端點的詳細資訊，請參閱 *Amazon Elastic Container Registry User Guide* 中的 [Amazon ECR interface VPC endpoints (AWS PrivateLink)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html)。

以下是適用於 Fargate 服務之 `networkConfiguration` 區段的範例：

```
"networkConfiguration": { 
   "awsvpcConfiguration": { 
      "assignPublicIp": "ENABLED",
      "securityGroups": [ "sg-12345678" ],
      "subnets": [ "subnet-12345678" ]
   }
}
```

## 任務資源限制
<a name="fargate-resource-limits"></a>

AWS Fargate 上適用於 Linux 容器的 Amazon ECS 任務定義支援 `ulimits` 參數定義要為容器設定的資源限制。

AWS Fargate 上適用於 Windows 的 Amazon ECS 任務定義不支援 `ulimits` 參數定義要為容器設定的資源限制。

在 Fargate 上託管的 Amazon ECS 任務會使用作業系統設定的預設資源限制值，但是 `nofile` 資源限制參數除外。`nofile` 資源限制會對容器可使用的開放檔案數量設限。在 Fargate 上，預設的 `nofile` 軟限制為 ` 65535`，硬限制為 `65535`。您可以將兩個限制的值設定為 `1048576`。

以下是範例任務定義程式碼片段，示範如何定義已加倍的自訂 `nofile` 限制：

```
"ulimits": [
    {
       "name": "nofile",
       "softLimit": 2048,
       "hardLimit": 8192
    }
]
```

如需可調整之其他資源限制的詳細資訊，請參閱 [資源限制](task_definition_parameters.md#container_definition_limits)。

## 記錄
<a name="fargate-tasks-logging"></a>

### 事件記錄
<a name="fargate-event-logging"></a>

Amazon ECS 記錄 EventBridge 採取的動作。您可以使用適用於 EventBridge 的 Amazon ECS 事件，接收有關您的 Amazon ECS 叢集、服務和任務目前狀態的近乎即時通知。此外，您可以自動執行動作來回應這些事件。如需詳細資訊，請參閱[使用 EventBridge 自動化因應 Amazon ECS 錯誤](cloudwatch_event_stream.md)。

### 任務生命週期日誌記錄
<a name="fargate-task-status"></a>

在 Fargate 上執行的任務會發佈時間戳記，以透過任務生命週期的狀態追蹤任務。您可以在 和 中的任務詳細資訊中查看時間戳記， AWS 管理主控台 方法是在 AWS CLI 和 SDKs 中描述任務。例如，您可以使用時間戳記來評估任務下載容器映像所花費的時間，並決定是否應最佳化容器映像大小，或使用 Seekable OCI 索引。如需有關容器映像實務的詳細資訊，請參閱 [Amazon ECS 容器映像的最佳實務](container-considerations.md)。

### 應用程式日誌記錄
<a name="fargate-app-logging"></a>

AWS Fargate 的 Amazon ECS 任務定義支援日誌組態的 `awslogs`、`splunk` 和 `awsfirelens` 日誌驅動程式。

`awslogs` 日誌驅動程式會設定您的 Fargate 任務，將日誌資訊傳送給 Amazon CloudWatch Logs。以下顯示任務定義片段，其中設定了 `awslogs` 日誌驅動程式：

```
"logConfiguration": { 
   "logDriver": "awslogs",
   "options": { 
      "awslogs-group" : "/ecs/fargate-task-definition",
      "awslogs-region": "us-east-1",
      "awslogs-stream-prefix": "ecs"
   }
}
```

如需在任務定義中使用 `awslogs` 日誌驅動程式將您的容器日誌傳送到 CloudWatch Logs 的詳細資訊，請參閱[將 Amazon ECS 日誌傳送至 CloudWatch](using_awslogs.md)。

如需任務定義中 `awsfirelens` 日誌驅動程式的詳細資訊，請參閱 [將 Amazon ECS 日誌傳送至 AWS 服務或 AWS Partner](using_firelens.md)。

如需在任務定義中使用 `splunk` 日誌驅動程式的詳細資訊，請參閱 [`splunk` 日誌驅動程式](example_task_definitions.md#example_task_definition-splunk)。

## 任務儲存體
<a name="fargate-tasks-storage"></a>

對於 Fargate 上託管的 Amazon ECS 任務，支援下列儲存類型：
+ Amazon EBS 磁碟區為資料密集型容器化工作負載，提供具成本效益、持久且高效能的區塊儲存服務。如需詳細資訊，請參閱[將 Amazon EBS 磁碟區與 Amazon ECS 搭配使用](ebs-volumes.md)。
+ 適用於持久性儲存的 Amazon EFS 磁碟區。如需詳細資訊，請參閱[將 Amazon EFS 磁碟區與 Amazon ECS 搭配使用](efs-volumes.md)。
+ 用於暫時性儲存的繫結掛載。如需詳細資訊，請參閱[搭配 Amazon ECS 使用綁定掛載](bind-mounts.md)。

## 使用 Seekable OCI (SOCI) 延遲載入容器映像
<a name="fargate-tasks-soci-images"></a>

在使用 Linux 平台版本 `1.4.0` 的 Fargate 上，Amazon ECS 任務可以使用 Seekable OCI (SOCI) 來協助更快地啟動任務。使用 SOCI 時，容器只需耗費幾秒鐘就可以開始提取映像，因此在背景下載影像時，可為環境設定和應用程式執行個體化提供時間。這稱為*延遲載入*。當 Fargate 啟動 Amazon ECS 任務時，Fargate 會自動偵測任務中映像是否存在 SOCI 索引，並啟動容器，而無需等待整個映像下載完成。

對於在沒有 SOCI 索引的情況下執行的容器，容器映像會在容器啟動之前完全下載。此行為在 Fargate 的所有其他平台版本以及 Amazon EC2 執行個體上的 Amazon ECS 最佳化 AMI 上均相同。

Seekable OCI (SOCI) 是一種由 開發的開放原始碼技術 AWS ，可透過延遲載入容器映像來更快速地啟動容器。SOCI 的運作原理是在現有容器映像中建立檔案索引 (SOCI 索引)。此索引有助於更快地啟動容器，提供在下載整個映像之前從容器映像中擷取個別檔案的功能。SOCI 索引必須以成品的形式儲存在與容器登錄中的映像相同的儲存庫中。您應該只使用來自信任來源的 SOCI 索引，因為索引是映像內容的權威來源。如需詳細資訊，請參[引入 Seekable OCI 用於延遲載入容器映像](https://aws.amazon.com/about-aws/whats-new/2022/09/introducing-seekable-oci-lazy-loading-container-images/)。

希望使用 SOCI 的客戶，只能使用 SOCI 索引資訊清單 v2。先前在 Fargate 上使用 SOCI 的現有客戶可以繼續使用 SOCI 索引資訊清單 v1，但強烈建議這些客戶遷移至 SOCI 索引資訊清單 v2。SOCI 索引資訊清單 v2 會在容器映像與其 SOCI 索引之間建立明確關係，確保部署的一致性。
<a name="fargate-soci-considerations"></a>
**考量事項**  
如果您希望 Fargate 使用 SOCI 索引在任務中延遲載入容器映像，請考慮以下幾點：
+ 只有在 Linux 平台版本 `1.4.0` 上執行的任務才能使用 SOCI 索引。不支援在 Fargate 上執行 Windows 容器的任務。
+ 支援在 X86\$164 或 ARM64 CPU 架構上執行的任務。
+ 任務定義中的容器映像均須儲存在相容的映像登錄中。以下列出相容的登錄：
  + Amazon ECR 私有登錄檔。
+ 僅支援使用 gzip 壓縮或未壓縮的容器映像。不支援使用 zstd 壓縮的容器映像。
+ 對於 SOCI 索引資訊清單 v2，產生 SOCI 索引資訊清單會修改容器映像資訊清單，因為我們會為 SOCI 索引新增註釋。此舉會產生新的容器映像摘要，但容器映像檔案系統層的內容會保持不變。
+ 對於 SOCI 索引資訊清單 v2，在容器映像已儲存於容器映像儲存庫後，若再產生 SOCI 索引，則需重新推送該容器映像。重新推送容器映像不會因為重複檔案系統層而增加儲存成本，因為此過程僅會上傳新的資訊清單檔案。
+ 我們建議您嘗試延遲載入大於 250 MiB 壓縮大小的容器映像。您不太可能看到載入較小映像的時間減少。
+ 由於延遲載入可能會變更任務開始所需的時間，因此您可能需要變更各種逾時，例如 Elastic Load Balancing 的運作狀態檢查寬限期。
+ 若想防止容器映像延遲載入，需在不連接 SOCI 索引的情況下，重新推送該容器映像。
<a name="create-soci"></a>
**建立 Seekable OCI 索引**  
若要讓容器映像延遲載入，需建立 SOCI 索引 (中繼資料檔案)，並將其與容器映像一起儲存於容器映像儲存庫中。若要建立並推送 SOCI 索引，您可以使用 GitHub 上的開放原始碼 [soci-snapshotter CLI 工具](https://github.com/awslabs/soci-snapshotter)。或者，您可以部署 CloudFormation AWS SOCI 索引建置器。這是無伺服器解決方案，可在容器映像推送至 Amazon ECR 時自動建立並推送 SOCI 索引。如需有關解決方案與安裝步驟的詳細資訊，請參閱 GitHub 上的 [CloudFormation AWS SOCI Index Builder](https://awslabs.github.io/cfn-ecr-aws-soci-index-builder/)。CloudFormation AWS SOCI 索引建置器是一種自動化 SOCI 入門的方法，而開放原始碼社交工具在索引產生方面具有更大的靈活性，並且能夠在您的持續整合和持續交付 (CI/CD) 管道中整合索引產生。

**注意**  
若要為映像建立 SOCI 索引，映像必須存在於執行 `soci-snapshotter` 的電腦上的 containerd 映像存放區中。如果映像位於 Docker 映像存放區中，則無法找到該映像。
<a name="verify-soci"></a>
**驗證任務是否使用延遲載入**  
若要驗證任務是否使用 SOCI 延遲載入，請從任務內部檢查任務中繼資料端點。當您查詢任務中繼資料端點版本 4 時，您從中查詢的容器的預設路徑中有一個 `Snapshotter` 欄位。此外，`/task` 路徑中的每個容器都有 `Snapshotter` 欄位。此欄位的預設值為 `overlayfs`，如果使用 SOCI，則此欄位會設定為 `soci`。若要驗證容器映像是否已連接 SOCI 索引資訊清單 v2，您可以透過 AWS CLI從 Amazon ECR 擷取映像索引。

```
IMAGE_REPOSITORY=r
IMAGE_TAG=latest

aws ecr batch-get-image \
    --repository-name=$IMAGE_REPOSITORY \
    --image-ids imageTag=$IMAGE_TAG \
    --query 'images[0].imageManifest' --output text | jq -r '.manifests[] | select(.artifactType=="application/vnd.amazon.soci.index.v2+json")'
```

若要驗證容器映像是否已連接 SOCI 索引資訊清單 v1，您可以使用 OCI Referrers API。

```
ACCOUNT_ID=111222333444
AWS_REGION=us-east-1
IMAGE_REPOSITORY=nginx-demo
IMAGE_TAG=latest
IMAGE_DIGEST=$(aws ecr describe-images --repository-name $IMAGE_REPOSITORY --image-ids imageTag=$IMAGE_TAG --query 'imageDetails[0].imageDigest' --output text)
ECR_PASSWORD=$(aws ecr get-login-password)

curl \
    --silent \
    --user AWS:$ECR_PASSWORD \
    https://$ACCOUNT_ID.dkr.ecr.$AWS_REGION.amazonaws.com/v2/$IMAGE_REPOSITORY/referrers/$IMAGE_DIGEST?artifactType=application%2Fvnd.amazon.soci.index.v1%2Bjson | jq -r '.'
```

# EC2 Windows 執行個體的 Amazon ECS 任務定義差異
<a name="windows_task_definitions"></a>

在 EC2 Windows 執行個體上執行的任務，並不支援所有可用的 Amazon ECS 任務定義參數。有些參數完全不受支援，而有些參數的行為會有所不同。

Amazon EC2 Windows 任務定義不支援下列任務定義參數：
+ `containerDefinitions`
  + `disableNetworking`
  + `dnsServers`
  + `dnsSearchDomains`
  + `extraHosts`
  + `links`
  + `linuxParameters`
  + `privileged`
  + `readonlyRootFilesystem`
  + `user`
  + `ulimits`
+ `volumes`
  + `dockerVolumeConfiguration`
+ `cpu`

  我們建議為 Windows 容器指定容器層級的 CPU。
+ `memory`

  我們建議為 Windows 容器指定容器層級的記憶體。
+ `proxyConfiguration`
+ `ipcMode`
+ `pidMode`
+ `taskRoleArn`

  EC2 Windows 執行個體上任務的 IAM 角色功能需要額外的設定，但其中大部分設定步驟與 Linux 容器執行個體上任務的 IAM 角色設定類似。如需更多資訊，請參閱[Amazon EC2 Windows 執行個體的額外組態](task-iam-roles.md#windows_task_IAM_roles)。