

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

# 互連 Amazon ECS 服務
<a name="interconnecting-services"></a>

在 Amazon ECS 任務中執行的應用程式通常需要接收來自網際網路的連線，或通常需要連線到在 Amazon ECS 服務中執行的其他應用程式。如果需要來自網際網路的外部連線，建議您使用 Elastic Load Balancing。如需有關整合負載平衡的詳細資訊，請參閱[使用負載平衡分佈 Amazon ECS 服務流量](service-load-balancing.md)。

如果您需要應用程式連線到在 Amazon ECS 服務中執行的其他應用程式，Amazon ECS 提供以下無需負載平衡器的方法：
+ *Amazon ECS Service Connect*

  建議使用 Service Connect，其可提供 Amazon ECS 組態，用於服務探索、連線與流量監控。透過 Service Connect，應用程式可以使用簡短名稱與標準連接埠，連線至同一叢集、其他叢集中的 Amazon ECS 服務，包括同一 AWS 區域內跨 VPC 的服務。

  當您使用 Service Connect 時，Amazon ECS 將管理服務探索的所有環節：建立可被探索的名稱、在任務啟動與停止時動態管理每個任務的項目、在每個已設定為可探索這些名稱的任務中執行代理程式。應用程式可透過 DNS 名稱的標準功能查詢這些名稱並建立連線。若應用程式已具備此能力，則您無需修改應用程式即可使用 Service Connect。

  您需在每個服務與任務定義內提供完整的組態。Amazon ECS 會在每次服務部署時管理此組態的變更，確保統一部署中的所有任務行為一致。例如，使用 DNS 作為服務探索機制時，常見問題在於遷移過程難以控制。若變更 DNS 名稱指向的新替代 IP 位址，可能需要等待最長 TTL 時間，所有用戶端才會開始使用新服務。而透過 Service Connect，用戶端部署會透過取代用戶端任務來更新組態。您可以設定部署斷路器及其他部署組態，使 Service Connect 的變更與任何其他部署一樣受到同等管控。

  如需詳細資訊，請參閱[使用 Service Connect 以利用簡稱連線 Amazon ECS 服務](service-connect.md)。
+ *Amazon ECS 服務探索*

  服務間通訊的另一種方法是使用服務探索進行直接通訊。透過此方法，您可使用 AWS Cloud Map 服務探索與 Amazon ECS 的整合功能。使用服務探索，Amazon ECS 會將啟動任務的清單同步至 AWS Cloud Map，這會維護 DNS 主機名稱，以解析該特定服務中一或多個任務的內部 IP 地址。Amazon VPC 中的其他服務可使用此 DNS 主機名稱，透過容器的內部 IP 位址直接向另一個容器傳送流量。

  這種服務間通訊方法的延遲較低。容器之間沒有額外的元件。流量會從一個容器直接傳送至另一個容器。

  此方法適用於採用 `awsvpc` 網路模式的場景，該模式下每個任務都有專屬的唯一 IP 位址。大多數軟體僅支援使用 DNS `A` 記錄，這些記錄會直接解析為 IP 位址。使用 `awsvpc` 網路模式時，每個任務的 IP 位址都是 `A` 記錄。不過，如果您使用 `bridge` 網路模式，多個容器可能會共用同一個 IP 位址。此外，動態連接埠映射會導致容器在該單一 IP 位址上隨機指派連接埠號碼。至此，僅靠 `A` 記錄已不足以滿足服務探索需求。您必須同時使用 `SRV` 記錄。這種類型的記錄可以追蹤 IP 位址與連接埠號碼，但要求對應用程式進行相應設定。您使用的某些預先建置的應用程式可能不支援 `SRV` 記錄。

  `awsvpc` 網路模式的另一項優勢，是每個服務都會擁有唯一的安全群組。您可以設定此安全群組，使其僅允許需要與該服務通訊的特定上游服務建立連入連線。

  使用服務探索實現服務間直接通訊的主要劣勢在於，您必須實作額外邏輯來處理重試機制與連線失敗問題。DNS 記錄具有存留時間 (TTL) 設定，可控制記錄的快取存留時長。DNS 記錄的更新與快取失效需要一定時間，才能讓應用程式取得最新版本的 DNS 記錄。因此，應用程式最終可能會將 DNS 記錄解析至已不存在的另一個容器。應用程式需要處理重試，並具有忽略不良後端的邏輯。

  如需詳細資訊，請參閱[使用服務探索以利用 DNS 名稱連接 Amazon ECS 服務](service-discovery.md)
+ *Amazon VPC Lattice*

  Amazon VPC Lattice 是一種受管應用程式聯網服務，Amazon ECS 客戶可用來觀察、保護和監控跨 AWS 運算服務、VPCs 和帳戶建置的應用程式，而無需修改其程式碼。

  VPC Lattice 使用目標群組，這是運算資源的集合。這些目標會執行您的應用程式或服務，可以是 Amazon EC2 執行個體、IP 地址、Lambda 函數和 Application Load Balancer。透過將其 Amazon ECS 服務與 VPC Lattice 目標群組建立關聯，客戶現在可以在 VPC Lattice 中將 Amazon ECS 任務啟用為 IP 目標。當已註冊服務的任務啟動時，Amazon ECS 會自動將任務註冊到 VPC Lattice 目標群組。

  如需詳細資訊，請參閱[使用 Amazon VPC Lattice 連接、觀察和保護您的 Amazon ECS 服務](ecs-vpc-lattice.md)。

## 網路模式相容性資料表
<a name="interconnect-network-mode-compatibility-table"></a>

下表說明這些選項與任務網路模式之間的相容性。在資料表中，「用戶端」是指從 Amazon ECS 任務內部建立連線的應用程式。


****  

| 互連線選項 | 橋接 | `awsvpc` | 主機 | 
| --- | --- | --- | --- | 
| 服務探索 | 是的，但用戶端需要知道在 DNS 中不含 hostPort 的 SRV 記錄。 | 是 | 是的，但用戶端需要知道在 DNS 中不含 hostPort 的 SRV 記錄。 | 
| Service Connect  | 是 | 是 | 否 | 
| VPC Lattice | 是 | 是 | 是 | 

# 使用 Service Connect 以利用簡稱連線 Amazon ECS 服務
<a name="service-connect"></a>

Amazon ECS Service Connect 提供服務對服務通訊的管理作為 Amazon ECS 組態。其會在 Amazon ECS 中同時建置服務探索和服務網格。這會提供：您透過服務部署管理的每個服務內的完整組態、統一參考未根據 VPC DNS 組態之命名空間內的服務的方式，以及可監控所有應用程式的標準化指標和日誌。Service Connect 僅讓服務互連。

下圖顯示 VPC 和 2 個服務中具有 2 個子網路的 Service Connect 網路範例。一種用戶端服務，在每個子網路中執行具有 1 項任務的 WordPress。一種伺服器服務，在每個子網路中執行具有 1 項任務的 MySQL。這兩種服務都具有高度可用性，並且對任務和可用區域問題具有彈性，因為每個服務都會執行分散在 2 個子網路上的多個任務。實心箭頭顯示從 WordPress 到 MySQL 的連線。例如，從具有 IP 地址 `172.31.16.1` 任務中的 WordPress 容器內執行的 `mysql --host=mysql` CLI 命令。該命令在 MySQL 預設連接埠上使用簡短名稱 `mysql`。此名稱和連接埠會在相同任務中連線至 Service Connect Proxy。WordPress 任務中的 Proxy 會在異常值偵測中使用循環配置負載平衡，以及任何先前的失敗資訊，以挑選要連接的 MySQL 任務。如圖中的實心箭頭所示，Proxy 連線至具 IP 地址 `172.31.16.2` MySQL 任務中的第二個 Proxy。在同一任務中，第二個 Proxy 連線至本機 MySQL 伺服器。這兩個 Proxy 都會回報在 Amazon ECS 和 Amazon CloudWatch 主控台中以圖形顯示的連線效能，讓您以相同的方式從各種應用程式取得效能指標。

![\[顯示最低 HA 服務的範例 Service Connect 網路\]](http://docs.aws.amazon.com/zh_tw/AmazonECS/latest/developerguide/images/serviceconnect.png)


以下術語會與 Service Connect 搭配使用。

**連接埠名稱**  
將名稱指派給特定連接埠映射的 Amazon ECS 任務定義組態。此組態僅供 Amazon ECS Service Connect 使用。

**用戶端別名**  
Amazon ECS 服務組態，用於指派端點中使用的連接埠號碼。此外，用戶端別名可以指派端點的 DNS 名稱，以覆寫探索名稱。如果 Amazon ECS 服務中未提供探索名稱，則用戶端別名會覆寫連接埠名稱作為端點名稱。如需端點範例，請參閱*端點*的定義。您可以將多個用戶端別名指派給 Amazon ECS 服務。此組態僅供 Amazon ECS Service Connect 使用。

**探索名稱**  
此為選用的中繼名稱，您可以從任務定義為指定的連接埠建立此名稱。此名稱用於建立 AWS Cloud Map 服務。如果未提供此名稱，則會使用任務定義中的連接埠名稱。您可以將多個探索名稱指派給 Amazon ECS 服務的特定連接埠。此組態僅供 Amazon ECS Service Connect 使用。  
AWS Cloud Map 服務名稱在命名空間中必須是唯一的。由於此限制，對於每個命名空間中的特定任務定義，如果未提供探索名稱，您只能有一個 Service Connect 組態。

**端點**  
連線到 API 或網站的 URL。URL 包含協定、DNS 名稱和連接埠。如需一般端點的更多資訊，請參閱 Amazon Web Services 一般參考內*AWS 詞彙表*中的[端點](https://docs.aws.amazon.com/glossary/latest/reference/glos-chap.html#endpoint)。  
Service Connect 可建立與 Amazon ECS 服務連線的端點，並將 Amazon ECS 服務中的任務設定為連線到端點。URL 包含協定、DNS 名稱和連接埠。您可以在任務定義中選取協定和連接埠名稱，因為連接埠必須比對容器映像內的應用程式。在服務中，您可以依名稱選取每個連接埠，並且可以指派 DNS 名稱。如果您未在 Amazon ECS 服務組態中指定 DNS 名稱，則會依預設使用任務定義中的連接埠名稱。例如，Service Connect 端點可以是 `http://blog:80`、`grpc://checkout:8080` 或 `http://_db.production.internal:99`。

**Service Connect 服務**  
Amazon ECS 服務中單一端點的組態。這是 Service Connect 組態的一部分，包含主控台中 **Service Connect and discovery name configuration** (Service Connect 和探索名稱組態) 中的單一列，或是 Amazon ECS 服務 JSON 組態內 `services` 清單中的某個物件。此組態僅供 Amazon ECS Service Connect 使用。  
如需詳細資訊，請參閱 Amazon Elastic Container Service API Reference (《Amazon Elastic Container Service API 參考》) 中的 [ServiceConnectService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ServiceConnectService.html)。

**命名空間**  
用於 Service Connect 之 AWS Cloud Map 命名空間的簡短名稱或完整 Amazon Resource Name (ARN)。命名空間必須與 Amazon ECS 服務和叢集位於相同的 AWS 區域 中。中的命名空間類型 AWS Cloud Map 不會影響 Service Connect。命名空間可以是與 中可用 AWS 帳戶 之 using AWS Resource Access Manager (AWS RAM) AWS RAM 共用 AWS 區域 的命名空間。如需有關共用命名空間的詳細資訊，請參閱 *AWS Cloud Map Developer Guide* 中的 [Cross-account AWS Cloud Map namespace sharing](https://docs.aws.amazon.com/cloud-map/latest/dg/sharing-namespaces.html)。  
Service Connect 使用 AWS Cloud Map 命名空間做為彼此通訊的 Amazon ECS 任務邏輯分組。每個 Amazon ECS 服務只能屬於一個命名空間。命名空間內的服務可以分佈到同一 AWS 區域內的不同 Amazon ECS 叢集。如果命名空間是共用命名空間，則服務可以分佈到命名空間擁有者與命名空間取用者 AWS 帳戶。您可以根據任何條件隨意組織服務。

**用戶端服務**  
執行網路用戶端應用程式的服務。此服務必須設定命名空間。服務中的每個任務都可以透過 Service Connect Proxy 容器探索，並連線到命名空間中的所有端點。  
如果任務中任何容器需要從命名空間中的服務連線到端點，請選擇用戶端服務。如果前端、反向 Proxy 或負載平衡器應用程式透過其他方法 (例如 Elastic Load Balancing) 接收外部流量，則可使用此類型的 Service Connect 組態。

**用戶端-伺服器服務**  
執行網路或 Web 服務應用程式的 Amazon ECS 服務。此服務必須具有命名空間，並且至少已設定一個端點。您可以使用端點連上服務中的每項任務。Service Connect Proxy 容器會接聽端點名稱和連接埠，以將流量引導至任務中的應用程式容器。  
如果有任何容器在連接埠上公開並接聽網路流量，請選擇用戶端-伺服器服務。這些應用程式不需要連線至同一命名空間中的其他用戶端-伺服器服務，但仍需設定用戶端組態。後端、中介軟體、業務層或大多數微服務都可以使用這種類型的 Service Connect 組態。如果您希望前端、反向 Proxy 或負載平衡器應用程式接收來自相同命名空間中使用 Service Connect 設定的其他服務流量，則這些服務應使用此類型的 Service Connect 組態。

Service Connect 功能會建立相關服務的虛擬網路。您可以跨多個不同的命名空間使用相同的服務組態，以執行獨立但相同的應用程式集合。Service Connect 會定義 Amazon ECS 服務中的 Proxy 容器。如此一來，您可以使用相同的任務定義，在具有不同 Service Connect 組態的不同命名空間中執行相同的應用程式。服務執行的每項任務都會在任務中執行代理容器。

Service Connect 適用於相同命名空間內 Amazon ECS 服務之間的連線。對於下列應用程式，您需要使用額外的互連線方法，才能連線到使用 Service Connect 設定的 Amazon ECS 服務：
+ 在其他命名空間中設定的任務
+ 未針對 Service Connect 設定的任務
+ Amazon ECS 以外的其他應用程式

這些應用程式可以透過 Service Connect Proxy 連線，但無法解析 Service Connect 端點名稱。

若要讓這些應用程式解析 Amazon ECS 任務的 IP 位址，則需使用其他互連方法。

**Topics**
+ [定價](#service-connect-pricing)
+ [Amazon ECS Service Connect 元件](service-connect-concepts-deploy.md)
+ [Amazon ECS Service Connect 組態概觀](service-connect-concepts.md)
+ [具有共用 AWS Cloud Map 命名空間的 Amazon ECS Service Connect](service-connect-shared-namespaces.md)
+ [Amazon ECS Service Connect 存取日誌](service-connect-envoy-access-logs.md)
+ [加密 Amazon ECS Service Connect 流量](service-connect-tls.md)
+ [使用 設定 Amazon ECS Service Connect AWS CLI](create-service-connect.md)

## 定價
<a name="service-connect-pricing"></a>
+ Amazon ECS Service Connect 定價取決於您使用 AWS Fargate 或 Amazon EC2 基礎設施來託管容器化工作負載。在 AWS Outposts上使用 Amazon ECS 時，定價直接採用與您使用 Amazon EC2 時所用的相同模型。如需詳細資訊，請參閱 [Amazon ECS 定價](https://aws.amazon.com/ecs/pricing)。
+ 使用 Amazon ECS Service Connect 無需額外付費。
+ Service Connect 使用 AWS Cloud Map 時，用量不收取額外費用。
+ 客戶需支付 Amazon ECS Service Connect 使用的運算資源費用，包括 vCPU 與記憶體。由於 Amazon ECS Service Connect 代理程式在客戶任務內執行，因此執行無需額外費用。任務資源會在客戶工作負載與 Amazon ECS Service Connect 代理程式之間共用。
+ 搭配 使用 Amazon ECS Service Connect 流量加密功能時 AWS 私有 CA，客戶會為他們建立的私有憑證授權機構和每個發行的 TLS 憑證付費。如需更多詳細資訊，請參閱 [AWS 私有憑證授權單位 定價](https://aws.amazon.com/private-ca/pricing/)。若要預估 TLS 憑證的每月成本，客戶需要知道已啟用 TLS 的 Amazon ECS 服務數量，將其乘以憑證成本，然後再乘以六。由於 Amazon ECS Service Connect 每五天自動輪換 TLS 憑證，因此每項 Amazon ECS 服務平均每月會發行六個憑證。

# Amazon ECS Service Connect 元件
<a name="service-connect-concepts-deploy"></a>

使用 Amazon ECS Service Connect 時，可以將每項 Amazon ECS 服務設定為執行接收網路請求 (用戶端-伺服器服務) 的伺服器應用程式，或執行發出請求的用戶端應用程式 (用戶端服務)。

當您準備開始使用 Service Connect 時，請先從用戶端-伺服器服務開始。您可以將 Service Connect 組態新增至新服務或現有服務。Amazon ECS 會在命名空間中建立 Service Connect 端點。此外，Amazon ECS 會在服務中建立新部署來取代目前正在執行的任務。

現有任務和其他應用程式可以繼續連線到現有端點和外部應用程式。如果用戶端-伺服器服務透過橫向擴充來新增任務，則將在所有任務之間對來自用戶端的新連線進行平衡。如果已更新用戶端-伺服器服務，則將在所有新版本的任務之間對來自用戶端的新連線進行平衡。

現有任務無法解析並連線到新端點。只有在同一命名空間中具有 Service Connect 組態且在此部署後開始執行的新任務，才能解析並連線至此端點。

這意味著用戶端應用程式的運算子會判斷其應用程式的組態何時變更，即使伺服器應用程式的運算子可以隨時變更其組態也是如此。每次部署命名空間中的任何服務後，命名空間中的端點清單都可能變更。現有任務與替代任務的行為會繼續保持與最近一次部署後相同的行為。

請考慮下列範例。

首先，假設您正在單一 AWS CloudFormation 範本和單一 CloudFormation 堆疊中建立公有網際網路可用的應用程式。公有探索和連線能力應由 建立 CloudFormation，包括前端用戶端服務。需要按照此順序建立該服務，以防止在一段時間內，前端用戶端服務正在執行並可公開使用，但後端用戶端服務不是。如此可避免在該期間向大眾傳送錯誤訊息。在 中 AWS CloudFormation，您必須使用 `dependsOn` 來指示多個 CloudFormation Amazon ECS 服務無法平行或同時進行。您應該為用戶端任務連線的每個後端用戶端-伺服器服務，將 `dependsOn` 新增至前端用戶端服務。

其次，假設前端服務存在，但沒有 Service Connect 組態。任務正在連線到現有的後端服務。請先使用 **DNS** 中或前端使用的 `clientAlias` 相同名稱，將用戶端-伺服器 Service Connect 組態新增至後端服務。這會建立新的部署，因此所有部署轉返偵測 AWS 管理主控台或 AWS SDKs AWS CLI和其他方法來轉返，並將後端服務還原至先前的部署和組態。如果您對後端服務的效能和行為感到滿意，請將用戶端或用戶端-伺服器 Service Connect 組態新增至前端服務。只有新部署中的任務會使用在這些新任務中新增的 Service Connect Proxy。如果此組態發生問題，您可以使用部署復原偵測或 AWS 管理主控台、 AWS CLI、 AWS SDKs和其他方法來復原和還原至先前的組態，並將後端服務還原至先前的部署和組態。如果您使用另一個以 DNS 為基礎的服務探索系統，而非 Service Connect，則任何前端或用戶端應用程式會在本機 DNS 快取到期後開始使用新端點和變更的端點組態，該過程通常需要數小時。

## 聯網
<a name="service-connect-concepts-network"></a>

依預設，Service Connect Proxy 會監聽任務定義連接埠映射中的 `containerPort`。安全群組規則必須允許來自用戶端將執行之子網路的傳入流量到達此連接埠。

即使您在 Service Connect 服務組態中設定連接埠號碼，也不會變更 Service Connect Proxy 所接聽用戶端-伺服器服務的連接埠。當您設定此連接埠號碼時，Amazon ECS 會在這些任務內的 Service Connect Proxy 上變更用戶端服務連線到其中的端點連接埠。用戶端服務中的 Proxy 會使用 `containerPort` 連線至用戶端-伺服器服務中的 Proxy。

如果您想要變更 Service Connect Proxy 接聽的連接埠，請變更用戶端-伺服器服務 Service Connect 組態中的 `ingressPortOverride`。如果變更此連接埠號碼，則必須允許此連接埠的傳入流量，此服務的流量會使用該連接埠。

應用程式傳送到針對 Service Connect 設定的 Amazon ECS 服務的流量，會要求 Amazon VPC 和子網路具有路由表規則和網路 ACL 規則，以允許您正在使用的 `containerPort` 和 `ingressPortOverride` 連接埠號碼。

 您可以使用 Service Connect 在 VPC 之間傳送流量。路由表規則、網路 ACL 與安全群組的相同需求適用於這兩種 VPC。

例如，兩個叢集會在不同的 VPC 中建立任務。每個叢集中的服務會設定為使用相同的命名空間。這兩個服務中的應用程式無需任何 VPC DNS 組態，即可解析命名空間中的每個端點。不過，除非 VPC 對等互連、VPC 或子網路路由表以及 VPC 網路 ACL 允許 `containerPort` 與 `ingressPortOverride` 連接埠號碼上的流量，否則 Proxy 無法連線。

對於使用 `bridge` 聯網模式的任務，您必須建立安全群組，其傳入規則需允許上層動態連接埠範圍的流量。然後，將該安全群組指派給 Service Connect 叢集中的所有 EC2 執行個體。

## Service Connect Proxy
<a name="service-connect-concepts-proxy"></a>

如果使用 Service Connect 組態建立或更新服務，Amazon ECS 會在每個新任務啟動時新增新的容器。這種使用單獨容器的模式稱為 `sidecar`。此容器在任務定義中不存在，您無法對其進行設定。Amazon ECS 會在服務中管理容器組態。因此，您可以在沒有 Service Connect 的情況下，於多項服務、命名空間與任務之間重複使用相同的任務定義。

**Proxy 資源**
+ 對於任務定義，必須設定 CPU 與記憶體參數。

  建議在 Service Connect Proxy 容器的任務 CPU 與記憶體中，額外新增 256 個 CPU 單元與至少 64 MiB 記憶體。在 AWS Fargate 上，您可以設定的最低記憶體容量為 512 MiB。在 Amazon EC2 上，任務定義記憶體是必要的。
+ 對於服務，您需要在 Service Connect 組態中進行日誌設定。
+ 如果您希望此服務中的任務在尖峰負載時每秒接收的請求數超過 500 個，建議在此 Service Connect Proxy 容器的任務定義中，將 512 個 CPU 單元新增至任務 CPU。
+ 如果您希望在命名空間中建立超過 100 個 Service Connect 服務，或在命名空間內所有 Amazon ECS 服務中建立總共 2000 個任務，建議在 Service Connect Proxy 容器的任務記憶體中新增 128 MiB 記憶體。您應該在命名空間中所有 Amazon ECS 服務使用的每個任務定義中執行此操作。

**代理組態**  
您的應用程式會以與應用程式所在的相同任務連線至附屬容器中的 Proxy。Amazon ECS 會設定任務與容器，以便應用程式僅在應用程式連線至同一命名空間中的端點名稱時才連線至 Proxy。所有其他流量都不會使用 Proxy。其他流量包含相同 VPC 中的 IP 地址、 AWS 服務端點和外部流量。

**Load balancing**  
服務連線會將 Proxy 設定為使用循環配置策略，在 Service Connect 端點中的任務之間進行負載平衡。位於連線來源任務中的本機 Proxy，會挑選提供端點之用戶端-伺服器服務中的其中一項任務。  
例如，假設在服務中執行 WordPress 的任務，該服務在名為*本機*的命名空間中設定為*用戶端服務*。有另一個包含具有執行 MySQL 資料庫 2 個任務的服務。此服務設定為在相同命名空間中透過 Service Connect 提供名為 `mysql` 的端點。在 WordPress 任務中，WordPress 應用程式使用端點名稱連線至資料庫。此名稱的連線會移至在相同任務的邊車容器中執行的 Proxy。然後，Proxy 可以使用循環配置策略連線至任一 MySQL 任務。  
負載平衡策略：循環配置

**異常值偵測**  
此功能會使用 Proxy 先前連線失敗的相關資料，以避免傳送新的連線至連線失敗的主機。Service Connect 會設定 Proxy 的異常值偵測功能，以提供被動運作狀態檢查。  
使用之前的範例，該 Proxy 可以連線至任一 MySQL 任務。如果 Proxy 與特定 MySQL 任務進行了多個連線，並且在過去的 30 秒內有 5 次以上的連線失敗，那麼 Proxy 會在 30 到 300 秒內避免該 MySQL 任務。

**重試**  
Service Connect 會將 Proxy 設定為重試透過 Proxy 傳遞且失敗的連線，而第二次嘗試則避免使用先前連線的主機。這可確保透過 Service Connect 的每個連線都不會因為一次性原因而失敗。  
重試次數：2

**Timeout (逾時)**  
Service Connect 會設定 Proxy 等待用戶端-伺服器應用程式回應的最長時間。預設逾時值為 15 秒，但可以更新。  
選用的參數：  
**idleTimeout** – 連線在閒置時保持作用中狀態的時間 (以秒為單位)。值為 `0` 會停用 `idleTimeout`。  
`HTTP`/`HTTP2`/`GRPC` 的 `idleTimeout` 預設值為 5 分鐘。  
`TCP` 的 `idleTimeout` 預設值為 1 小時。  
**perRequestTimeout** – 等待上游對每個請求發出完整回應的時間。值為 `0` 會關閉 `perRequestTimeout`。這僅能在應用程式容器的 `appProtocol` 為 `HTTP`/`HTTP2`/`GRPC` 時設定。預設值為 15 秒。  
如果 `idleTimeout` 設定為小於 `perRequestTimeout` 的時間，則連線將在達到 `idleTimeout` 而不是 `perRequestTimeout` 的時候關閉。

## 考量事項
<a name="service-connect-considerations"></a>

使用 Service Connect，請考量下列事項：
+ 在 Fargate 中執行的任務必須使用 Fargate Linux 平台版本 `1.4.0` 或更高版本，才能使用 Service Connect。
+ 容器執行個體上的 Amazon ECS 代理程式版本必須是 `1.67.2` 或更高版本。
+ 容器執行個體必須執行 Amazon ECS 最佳化 Amazon Linux 2023 AMI 版本 `20230428` 或更高版本，或 Amazon ECS 最佳化 Amazon Linux 2 AMI 版本 `2.0.20221115`，才能使用 Service Connect。除 Amazon ECS 容器代理程式外，這些版本也具有 Service Connect 代理程式。如需有關 Service Connect 代理程式的更多資訊，請參閱 GitHub 上的 [Amazon ECS Service Connect 代理程式](https://github.com/aws/amazon-ecs-service-connect-agent)。
+ 容器執行個體必須具有資源 `arn:aws:ecs:region:0123456789012:task-set/cluster/*` 的 `ecs:Poll` 許可。如果您使用的是 `ecsInstanceRole`，則不需要新增其他許可。`AmazonEC2ContainerServiceforEC2Role` 受管政策具有必要的許可。如需詳細資訊，請參閱[Amazon ECS 容器執行個體 IAM 角色](instance_IAM_role.md)。
+ 使用 `bridge` 網路模式且使用 Service Connect 的任務不支援 `hostname` 容器定義參數。
+ 任務定義必須設定任務記憶體限制，才能使用 Service Connect。如需詳細資訊，請參閱[Service Connect Proxy](#service-connect-concepts-proxy)。
+ 不支援設定容器記憶體限制的任務定義。

  您可以在容器上設定容器記憶體限制，但是您必須將任務記憶體限制設為大於容器記憶體限制總和的數字。任務限制中未在容器限制中配置的其他 CPU 和記憶體，會由 Service Connect Proxy 容器和其他未設定容器限制的容器使用。如需詳細資訊，請參閱[Service Connect Proxy](#service-connect-concepts-proxy)。
+ 您可以設定 Service Connect 在相同 區域中使用任何 AWS Cloud Map 命名空間，這些命名空間位於相同 或 AWS 帳戶 與您的 AWS 帳戶 共用 AWS Resource Access Manager。如需有關使用共用命名空間的詳細資訊，請參閱 [具有共用 AWS Cloud Map 命名空間的 Amazon ECS Service Connect](service-connect-shared-namespaces.md)。
+ 每一項服務只能屬於一個命名空間。
+ 僅支援服務建立的任務。
+ 所有端點在命名空間內必須不重複。
+ 所有探索名稱在命名空間內必須不重複。
+ 必須重新部署現有服務，應用程式才能解析新的端點。不會將最近部署後新增至命名空間的新端點新增至任務組態。如需詳細資訊，請參閱[Amazon ECS Service Connect 元件](#service-connect-concepts-deploy)。
+ 刪除叢集時，Service Connect 不會刪除命名空間。您必須在 中刪除命名空間 AWS Cloud Map。
+ Application Load Balancer 流量預設為在 `awsvpc` 網路模式下透過 Service Connect 代理程式進行路由。如果您希望非服務流量繞過 Service Connect 代理程式，請在 Service Connect 服務組態中使用 `[ingressPortOverride](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ServiceConnectService.html)` 參數。
+ 使用 TLS 的 Service Connect 不支援 `bridge` 聯網模式。僅支援 `awsvpc` 聯網模式。
+ 在 `awsvpc` 模式下，對於純 IPv4 與雙堆疊組態的服務，Service Connect Proxy 會將流量轉送至 IPv4 localhost `127.0.0.1`。對於純 IPv6 組態的服務，Proxy 會將流量轉送至 IPv6 localhost `::1`。建議將應用程式設定為監聽兩個 localhost，以便在服務從純 IPv4 或雙堆疊組態更新為純 IPv6 組態時實現無縫體驗。如需詳細資訊，請參閱[EC2 的 Amazon ECS 任務聯網選項](task-networking.md)及[Fargate 的 Amazon ECS 任務聯網選項](fargate-task-networking.md)。

**Service Connect 不支援下列項目：**
+ Windows 容器
+ HTTP 1.0
+ 獨立任務
+ 使用由 CodeDeploy 提供支援的藍/綠部署與外部部署類型的服務
+ Service Connect 不支援 Amazon ECS Anywhere 的 `External` 容器執行個體。
+ PPv2
+ FIPS 模式

# Amazon ECS Service Connect 組態概觀
<a name="service-connect-concepts"></a>

當您使用 Service Connect 時，需要在資源中設定參數。

下表說明了 Amazon ECS 資源的組態參數。


| 參數位置 | 應用程式類型 | Description | 必要 | 
| --- | --- | --- | --- | 
| 任務定義 | 用戶端 | 用戶端任務定義中的 Service Connect 沒有可用的變更。 | N/A | 
| 任務定義 | 用戶端-伺服器 | 伺服器必須將 name 欄位新增至容器 portMappings 中的連接埠。如需詳細資訊，請參閱[portMappings](task_definition_parameters.md#ContainerDefinition-portMappings) | 是 | 
| 任務定義 | 用戶端-伺服器 | 伺服器可以選擇性地提供應用程式協定 (例如 HTTP)，以接收其伺服器應用程式 (例如 HTTP 5xx) 的協定特定指標。 | 否 | 
| 服務定義 | 用戶端 | 用戶端服務必須新增 serviceConnectConfiguration，才能設定要加入的命名空間。此命名空間必須包含此服務需要探索的所有伺服器服務。如需詳細資訊，請參閱[serviceConnectConfiguration](service_definition_parameters.md#Service-serviceConnectConfiguration)。 | 是 | 
| 服務定義 | 用戶端-伺服器 | 伺服器服務必須新增 serviceConnectConfiguration，才能設定可從中使用服務的 DNS 名稱、連接埠號碼和命名空間。如需詳細資訊，請參閱[serviceConnectConfiguration](service_definition_parameters.md#Service-serviceConnectConfiguration)。 | 是 | 
| 叢集 | 用戶端 | 叢集可以新增預設的 Service Connect 命名空間。在服務中設定 Service Connect 時，叢集中的新服務會繼承命名空間。 | 否 | 
| 叢集 | 用戶端-伺服器 | 在套用至伺服器服務的叢集中，Service Connect 沒有可用的變更。伺服器任務定義和服務必須設定相應的組態。 | N/A | 

**Service Connect 的設定步驟概觀**  
下列步驟概述了如何設定 Service Connect。

**重要**  
 Service Connect 會在您的帳戶中建立 AWS Cloud Map 服務。透過手動註冊/取消註冊執行個體、變更執行個體屬性或刪除服務來修改這些 AWS Cloud Map 資源，可能會導致應用程式流量或後續部署產生非預期的行為。
 Service Connect 不支援任務定義中的連結。

1. 將連接埠名稱新增至任務定義中的連接埠對映。此外，您可以識別應用程式的第 7 層協定，以取得其他指標。

1. 建立具有 AWS Cloud Map 命名空間的叢集、使用共用命名空間，或分別建立命名空間。為簡化組織管理，請建立具有您所需命名空間名稱的叢集，並為該命名空間指定相同的名稱。在這種情況下，Amazon ECS 會使用必要的組態建立新的 HTTP 命名空間。Service Connect 不會使用或建立 Amazon Route 53 中的 DNS 託管區域。

1. 設定服務以在命名空間內建立 Service Connect 端點。

1. 部署服務以建立端點。Amazon ECS 會將 Service Connect Proxy 容器新增至每項任務，並在 AWS Cloud Map中建立 Service Connect 端點。此容器未在任務定義中設定，而且任務定義可以重複使用而不需要修改，以在相同的命名空間或多個命名空間中建立多個服務。

1. 將用戶端應用程式部署為服務，以連線到端點。Amazon ECS 會在每項任務中透過 Service Connect Proxy，將這些應用程式連線至 Service Connect 端點。

   應用程式僅使用 Proxy 來連線至 Service Connect 端點。沒有其他設定可使用 Proxy。Proxy 會執行循環配置負載平衡、異常值偵測和重試。如需 Proxy 的詳細資訊，請參閱 [Service Connect Proxy](service-connect-concepts-deploy.md#service-connect-concepts-proxy)。

1. 透過 Amazon CloudWatch 中的 Service Connect Proxy 監控流量。

## 叢集組態
<a name="service-connect-concepts-cluster-defaults"></a>

您可以在建立或更新叢集時為 Service Connect 設定預設命名空間。您指定為預設的命名空間名稱可以位於相同的 AWS 區域 和 帳戶中，也可以位於相同的 中 AWS 區域 ，並由另一個 AWS 帳戶 使用 共用 AWS Resource Access Manager。

如果您建立叢集並指定預設的 Service Connect 命名空間，則叢集會在 Amazon ECS 建立命名空間時在 `PROVISIONING` 狀態中等待。您可以看到 `attachment` 所處的叢集狀態顯示命名空間的狀態。根據預設，附件不會顯示在 中 AWS CLI，您必須新增 `--include ATTACHMENTS`才能查看。

如果您想要使用 與 AWS 帳戶 共用的命名空間 AWS RAM，請在叢集組態中指定命名空間的 Amazon Resource Name (ARN)。如需共用 AWS Cloud Map 命名空間的詳細資訊，請參閱 [具有共用 AWS Cloud Map 命名空間的 Amazon ECS Service Connect](service-connect-shared-namespaces.md)。

## 服務組態
<a name="service-connect-concepts-config"></a>

Service Connect 針對最低組態要求而設計。您必須為要在任務定義中與 Service Connect 搭配使用的每個連接埠映射設定名稱。在 服務中，您需要開啟 Service Connect，然後選取 中的命名空間 AWS 帳戶 或共用命名空間，以建立用戶端服務。若要建立用戶端-伺服器服務，您需要新增符合其中一個連接埠映射名稱的單一 Service Connect 服務組態。Amazon ECS 會重複使用任務定義中的連接埠號碼和連接埠名稱，以定義 Service Connect 服務和端點。若要覆寫這些值，您可以在主控台中使用 **Discovery** (探索)、**DNS** 和 **Port** (連接埠) 等其他參數，或分別在 Amazon ECS API 中使用 `discoveryName` 和 `clientAliases`。

## 初始運作狀態檢查組態
<a name="service-connect-concepts-health-check"></a>

Service Connect 可確保將流量路由至任務之前，任務的運作狀態良好。當任務啟動時 （在部署、擴展或取代期間），Service Connect 會監控任務的運作狀態，以確保已準備好接受流量。您必須定義任務定義中必要容器的運作狀態檢查，才能啟用此行為。

當任務準備好接受流量時，初始運作狀態檢查的行為會考量達到 狀態的潛在延遲：
+ 如果任務是 `HEALTHY`，則立即可供流量使用。
+ 如果任務的運作狀態為 `UNKNOWN`，則 Service Connect 會遵循任務基本容器的容器運作狀態檢查組態 （請參閱 [運作狀態檢查](task_definition_parameters.md#container_definition_healthcheck)) 來計算逾時，最多可達 `8 minutes`，再將其提供給流量使用，即使它仍為 `UNKNOWN`。
+ 如果任務是 `UNHEALTHY`，Amazon ECS 可能會啟動替代任務。如果沒有運作狀態良好的任務，您的部署可能會根據服務的組態復原。

對於所有持續的流量，Service Connect 會根據極端值偵測使用被動運作狀態檢查，以有效率地路由流量。

# 具有共用 AWS Cloud Map 命名空間的 Amazon ECS Service Connect
<a name="service-connect-shared-namespaces"></a>

Amazon ECS Service Connect 支援在同一 AWS 帳戶 內跨多個 使用共用 AWS Cloud Map 命名空間 AWS 區域。此功能可讓您建立分散式應用程式，其中在不同的 中執行的服務 AWS 帳戶 可以透過 Service Connect 彼此探索和通訊。共用命名空間使用 AWS Resource Access Manager (AWS RAM) 進行管理，允許安全的跨帳戶資源共用。如需共用命名空間的詳細資訊，請參閱《 *AWS Cloud Map 開發人員指南*》中的[跨帳戶 AWS Cloud Map 命名空間共用](https://docs.aws.amazon.com/cloud-map/latest/dg/sharing-namespaces.html)。

**重要**  
必須使用 `AWSRAMPermissionCloudMapECSFullPermission` 受管許可來共用命名空間，Service Connect 才能在命名空間正常運作。

當您搭配 Service Connect 使用共用 AWS Cloud Map 命名空間時，來自多個 的服務 AWS 帳戶 可以參與相同的服務命名空間。這對於具有多個 的組織特別有用 AWS 帳戶 ，這些組織需要維持跨帳戶邊界service-to-service通訊，同時保持安全和隔離。

**注意**  
若要與位於不同 VPC 中的服務通訊，您需要設定 VPC 間連線功能。這可以使用 VPC 對等互連來實現。如需詳細資訊，請參閱 *Amazon Virtual Private Cloud VPC Peering Guide* 中的 [Create or delete a VPC Peering connection](https://docs.aws.amazon.com/vpc/latest/peering/create-vpc-peering-connection.html)。

# 搭配 Amazon ECS Service Connect 使用共用 AWS Cloud Map 命名空間
<a name="service-connect-shared-namespaces-setup"></a>

設定 Service Connect 的共用 AWS Cloud Map 命名空間包含下列步驟：建立命名空間的命名空間擁有者、透過 AWS Resource Access Manager (AWS RAM) 共用的擁有者、接受資源共用的取用者，以及設定 Service Connect 使用共用命名空間的取用者。

## 步驟 1：建立 AWS Cloud Map 命名空間
<a name="service-connect-shared-namespaces-create"></a>

命名空間擁有者會建立將與其他 帳戶共用的 AWS Cloud Map 命名空間。

**使用 建立共用的命名空間 AWS 管理主控台**

1. 在 https：//[https://console.aws.amazon.com/cloudmap/](https://console.aws.amazon.com/cloudmap/) 開啟 AWS Cloud Map 主控台。

1. 選擇 **Create namespace (建立命名空間)**。

1. 輸入**命名空間名稱**。所有參與帳戶中的服務都會使用此名稱。

1. 在**命名空間類型**欄位中，根據使用案例選擇適當的類型：
   + **API 呼叫** – HTTP 命名空間，用於不使用 DNS 功能進行服務探索。
   + **VPC 中的 API 呼叫與 DNS 查詢** – 私有 DNS 命名空間，用於在 VPC 中使用私有 DNS 查詢進行服務探索。
   + **API 呼叫與公有 DNS 查詢** – 公有 DNS 命名空間，用於使用公有 DNS 查詢進行服務探索。

1.  選擇 **Create namespace (建立命名空間)**。

## 步驟 2：使用 共用命名空間 AWS RAM
<a name="service-connect-shared-namespaces-share"></a>

命名空間擁有者使用 與其他 AWS RAM 共用命名空間 AWS 帳戶。

**使用 AWS RAM 主控台共用命名空間**

1. 在 https：//[https://console.aws.amazon.com/ram/](https://console.aws.amazon.com/ram/) 開啟 AWS RAM 主控台。

1. 選擇 **Create resource share (建立資源共用)**。

1. 在**名稱**欄位中，輸入資源共用的描述性名稱。

1. 在**資源**區段中：

   1. 在**資源類型**欄位中，選擇 **Cloud Map 命名空間**。

   1. 選取您在前一步驟中建立的命名空間。

1. 在**受管許可**區段中，指定 **AWSRAMPermissionCloudMapECSFullPermission**。
**重要**  
必須使用 `AWSRAMPermissionCloudMapECSFullPermission` 受管許可來共用命名空間，Service Connect 才能在命名空間正常運作。

1. 在**主體**區段中，指定要與之共用命名空間的 AWS 帳戶 。您可以輸入帳戶 ID 或組織單位 ID。

1. 選擇 **Create resource share (建立資源共用)**。

## 步驟 3：接受資源共用
<a name="service-connect-shared-namespaces-accept"></a>

命名空間取用者帳戶必須接受資源共用邀請，才能使用共用命名空間。

**使用 AWS RAM 主控台接受資源共享邀請**

1. 在消費者帳戶中，開啟位於 https：//[https://console.aws.amazon.com/ram/](https://console.aws.amazon.com/ram/) 的 AWS RAM 主控台。

1. 在導覽窗格中，依次選擇**與我共用**、**資源共用**。

1. 選取資源共用邀請，然後選擇**接受資源共用**。

1. 接受後，請記下資源詳細資訊中的共用命名空間 ARN。設定 Service Connect 服務時，您將使用此 ARN。

## 步驟 4：使用共用命名空間設定 Amazon ECS 服務
<a name="service-connect-shared-namespaces-configure"></a>

接受共用命名空間後，命名空間取用者可以將 Amazon ECS 服務設定為使用共用命名空間。組態與使用一般命名空間類似，但您必須指定命名空間 ARN 而不是名稱。如需詳細的服務建立程序，請參閱[建立 Amazon ECS 滾動更新部署](create-service-console-v2.md)。

**使用 建立具有共用命名空間的服務 AWS 管理主控台**

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

1. 在**叢集**頁面上，選擇要在其中建立服務的叢集。

1. 在**服務**下選擇**建立**。

1. 根據工作負載填入其他詳細資訊後，在 **Service Connect** 區段中，選擇**使用 Service Connect**。

1. 在**命名空間**欄位中，輸入共用命名空間的完整 ARN。

   ARN 格式為：`arn:aws:servicediscovery:region:account-id:namespace/namespace-id`

1. 視需要針對服務類型 (用戶端或用戶端-伺服器) 進行剩餘的 Service Connect 設定。

1. 完成服務建立程序。

您也可以使用 AWS CLI AWS SDKs設定服務，方法是在 的 `namespace` 參數中指定共用命名空間 ARN`serviceConnectConfiguration`。

```
aws ecs create-service \
    --cluster my-cluster \
    --service-name my-service \
    --task-definition my-task-def \
    --service-connect-configuration '{
        "enabled": true,
        "namespace": "arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-abcdef1234567890",
        "services": [{
            "portName": "web",
            "discoveryName": "my-service",
            "clientAliases": [{
                "port": 80,
                "dnsName": "my-service"
            }]
        }]
    }'
```

## 考量事項
<a name="service-connect-shared-namespaces-considerations"></a>

搭配 Service Connect 使用共用 AWS Cloud Map 命名空間時，請考慮下列事項：
+ AWS RAM 必須在 AWS 區域 您要使用共用命名空間的 中可用。
+ 共用命名空間必須與 AWS 區域 Amazon ECS 服務和叢集位於相同的 中。
+ 使用共用命名空間設定 Service Connect 時，必須使用命名空間 ARN，而不是 ID。
+ 支援所有命名空間類型：HTTP、私有 DNS 與公有 DNS 命名空間。
+ 如果撤銷共用命名空間的存取權，則需要與命名空間互動的 Amazon ECS 操作 (例如 `CreateService`、`UpdateService` 與 `ListServicesByNamespace`) 將會失敗。如需有關對共用命名空間許可問題進行疑難排解的詳細資訊，請參閱[使用共用 AWS Cloud Map 命名空間對 Amazon ECS Service Connect 進行故障診斷](service-connect-shared-namespaces-troubleshooting.md)。
+ 若在共用私有 DNS 命名空間中使用 DNS 查詢進行服務探索：
  + 命名空間擁有者需要呼叫 `create-vpc-association-authorization`，並指定與命名空間關聯的私有託管區域的 ID 以及取用者的 VPC。

    ```
    aws route53 create-vpc-association-authorization --hosted-zone-id Z1234567890ABC --vpc VPCRegion=us-east-1,VPCId=vpc-12345678
    ```
  + 命名空間取用者需要呼叫 `associate-vpc-with-hosted-zone`，並指定私有託管區域的 ID。

    ```
    aws route53 associate-vpc-with-hosted-zone --hosted-zone-id Z1234567890ABC --vpc VPCRegion=us-east-1,VPCId=vpc-12345678
    ```
+ 只有命名空間擁有者可以管理資源共用。
+ 命名空間取用者可以在共用命名空間內建立與管理服務，但無法修改命名空間本身。
+ 無論是哪個帳戶建立服務，探索名稱在共用命名空間內都必須是唯一的。
+ 共用命名空間中的服務可以探索和連線到其他可存取命名空間之 AWS 帳戶的 服務。
+ 為 Service Connect 啟用 TLS 並使用共用命名空間時， AWS 私有 CA 憑證認證機構 (CA) 的範圍僅限於該命名空間。撤銷共用命名空間的存取權時，CA 的存取權也會停止。
+ 使用共用命名空間時，命名空間擁有者和取用者預設無法存取跨帳戶 Amazon CloudWatch 指標。目標指標只會發佈至擁有用戶端服務的帳戶。擁有用戶端服務的帳戶無法存取擁有用戶端伺服器服務的帳戶接收的指標，反之亦然。若要允許跨帳戶存取指標，請設定 CloudWatch 跨帳戶可觀測性。如需設定跨帳戶可觀測性的詳細資訊，請參閱《Amazon [CloudWatch 使用者指南》中的 CloudWatch 跨帳戶可觀測性](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Unified-Cross-Account.html)。 *Amazon CloudWatch * 如需 Service Connect CloudWatch 指標的詳細資訊，請參閱 [Amazon ECS CloudWatch 指標](available-metrics.md)。

# 使用共用 AWS Cloud Map 命名空間對 Amazon ECS Service Connect 進行故障診斷
<a name="service-connect-shared-namespaces-troubleshooting"></a>

使用以下資訊對共用 AWS Cloud Map 命名空間和 Service Connect 的問題進行故障診斷。如需有關尋找錯誤訊息的詳細資訊，請參閱 [Amazon ECS 疑難排解](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/troubleshooting.html)。

因缺少許可或撤銷命名空間存取權，会顯示與許可問題相關的錯誤訊息。

**重要**  
必須使用 `AWSRAMPermissionCloudMapECSFullPermission` 受管許可來共用命名空間，Service Connect 才能在命名空間正常運作。

錯誤訊息會以下列其中一種格式顯示：

An error occurred (ClientException) when calling the <OperationName> operation: User: arn:aws:iam::<account-id>:user/<user-name> is not authorized to perform: <ActionName> on resource: <ResourceArn> because no resource-based policy allows the <ActionName> action

下列案例可能會導致此格式的錯誤訊息：

**叢集建立或更新失敗**  
當 Amazon ECS 操作如 `CreateCluster`或 因缺少 AWS Cloud Map 許可而`UpdateCluster`失敗時，就會發生這些問題。這些操作需要下列 AWS Cloud Map 動作的許可：  
+ `servicediscovery:GetNamespace`
確保取用者帳戶已接受資源共用邀請，且在 Service Connect 組態中使用了正確的命名空間 ARN。

**服務建立或更新失敗**  
當 Amazon ECS 操作如 `CreateService`或 因缺少 AWS Cloud Map 許可而`UpdateService`失敗時，就會發生這些問題。這些操作需要下列 AWS Cloud Map 動作的許可：  
+ `servicediscovery:CreateService`
+ `servicediscovery:GetNamespace`
+ `servicediscovery:GetOperation` (用於建立新的 AWS Cloud Map 服務)
+ `servicediscovery:GetService` (用於 AWS Cloud Map 服務已存在時)
確保取用者帳戶已接受資源共用邀請，且在 Service Connect 組態中使用了正確的命名空間 ARN。

**`ListServicesByNamespace` 操作失敗**  
當 Amazon ECS `ListServicesByNamespace` 操作失敗時，會發生此問題。此操作需要下列 AWS Cloud Map 動作的許可：  
+ `servicediscovery:GetNamespace`
若要解決此問題：  
+ 確認取用者帳戶具有 `servicediscovery:GetNamespace` 許可。
+ 呼叫 API 時使用命名空間 ARN，而不是名稱。
+ 確保資源共用處於作用中狀態，且已接受邀請。

User: <iam-user> is not authorized to perform: <ActionName> on resource: <ResourceArn> with an explicit deny in an identity-based policy.

下列案例可能會導致此格式的錯誤訊息：

**服務刪除失敗並停滯在 `DRAINING` 狀態**  
當 Amazon ECS `DeleteService` 操作因撤銷命名空間存取權而缺少 `servicediscovery:DeleteService` 許可時，會發生此問題。服務最初可能看起來已成功刪除，但會停滯在 `DRAINING` 狀態。錯誤訊息會顯示為 Amazon ECS 服務事件。  
若要解決此問題，命名空間擁有者必須與取用者帳戶共用命名空間，才能完成服務刪除。

**服務中的任務執行失敗**  
當任務因缺少許可而啟動失敗時，會發生此問題。錯誤訊息會顯示為已停止的任務錯誤。如需詳細資訊，請參閱[解決 Amazon ECS 已停止任務錯誤](resolve-stopped-errors.md)。  
執行任務需要下列 AWS Cloud Map 動作：  
+ `servicediscovery:GetOperation`
+ `servicediscovery:RegisterInstance`
確保取用者帳戶具有所需許可，並且可以存取共用命名空間。

**任務無法完全停止或停滯在 `DEACTIVATING` 或 `DEPROVISIONING` 狀態**  
當任務在關閉期間因為缺少許可而無法從 AWS Cloud Map 服務取消註冊時，就會發生此問題。錯誤會在任務附件中顯示為 `statusReason`，可使用 `DescribeTasks` API 擷取附件。如需詳細資訊，請參閱 *Amazon Elastic Container Service API Reference* 中的 [DescribeTasks](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTasks.html)。  
停止任務需要下列 AWS Cloud Map 動作：  
+ `servicediscovery:DeregisterInstance`
+ `servicediscovery:GetOperation`
如果撤銷共用命名空間存取權，任務可能會保持 `DEACTIVATING` 或 `DEPROVISIONING` 狀態，直到命名空間存取權還原。需請求命名空間擁有者還原命名空間的存取權。

# Amazon ECS Service Connect 存取日誌
<a name="service-connect-envoy-access-logs"></a>

Amazon ECS Service Connect 支援存取日誌，以提供 Service Connect Proxy 處理之個別請求的詳細遙測。存取日誌透過擷取每個請求流量中繼資料來補充現有的應用程式日誌，例如 HTTP 方法、路徑、回應碼、旗標和時間資訊。這可讓對請求層級流量模式和服務互動進行更深入的可觀測性，以有效地進行故障診斷和監控。

若要啟用存取日誌，請在 `serviceConnectConfiguration` 物件中指定 `logConfiguration`和 `accessLogConfiguration` 物件。您可以設定日誌的格式，以及日誌是否應該在 中包含查詢參數`accessLogConfiguration`。日誌會由 中指定的日誌驅動程式交付至目的地日誌群組`logConfiguration`。

```
{
    "serviceConnectConfiguration": {
        "enabled": true,
        "namespace": "myapp.namespace",
        "services": [
            ...
        ],
        "logConfiguration": {
            "logDriver": "awslogs",
            "options": {
                "awslogs-group": "my-envoy-log-group",
                "awslogs-region": "us-west-2",
                "awslogs-stream-prefix": "myapp-envoy-logs"
            }
        },
         "accessLogConfiguration": {
            "format": "TEXT",
            "includeQueryParameters": "ENABLED" 
        }
    }
}
```

## 考量事項
<a name="service-connect-envoy-access-logs-considerations"></a>

當您啟用存取日誌的存取權時，請考慮下列事項
+ 存取日誌和應用程式日誌都會寫入 `/dev/stdout`。若要將存取日誌與應用程式日誌分開，建議使用具有自訂Fluent Bit或Fluentd組態的`awsfirelens`日誌驅動程式。
+  建議使用 `awslogs` 日誌驅動程式將應用程式和存取日誌傳送至相同的 CloudWatch 目的地。
+ 使用平台版本 `1.4.0` 和更高版本的 Fargate 服務支援存取日誌。
+ 根據預設，請求 ID 和字符等查詢參數會從存取日誌中排除。若要在存取日誌中包含查詢參數，請將 `includeQueryParameters`設定為 `"ENABLED"`。

## 存取日誌格式
<a name="service-connect-envoy-access-logs-formats"></a>

存取日誌可以使用 JSON 格式字典或文字格式字串進行格式化，不同類型存取日誌的支援命令運算子不同。

### HTTP 存取日誌
<a name="service-connect-envoy-access-logs-formats-http"></a>

HTTP 日誌預設包含下列命令運算子：

------
#### [ Text ]

```
[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%"
%RESPONSE_CODE% %BYTES_RECEIVED% %BYTES_SENT% %DURATION%
%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%"
"%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%"\n
```

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

```
{
  "start_time": "%START_TIME%",
  "method": "%REQ(:METHOD)%",
  "path": "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%",
  "protocol": "%PROTOCOL%",
  "response_code": "%RESPONSE_CODE%",
  "bytes_received": "%BYTES_RECEIVED%",
  "bytes_sent": "%BYTES_SENT%",
  "duration_ms": "%DURATION%",
  "upstream_service_time": "%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%",
  "forwarded_for": "%REQ(X-FORWARDED-FOR)%",
  "user_agent": "%REQ(USER-AGENT)%",
  "request_id": "%REQ(X-REQUEST-ID)%",
  "authority": "%REQ(:AUTHORITY)%",
  "upstream_host": "%UPSTREAM_HOST%"
}
```

------

### HTTP2 存取日誌
<a name="service-connect-envoy-access-logs-formats-http2"></a>

除了 HTTP 日誌包含的命令運算子之外，HTTP2 日誌預設還包含 `%STREAM_ID%`運算子。

------
#### [ Text ]

```
[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%"
%RESPONSE_CODE% %BYTES_RECEIVED% %BYTES_SENT% %DURATION%
%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%"
"%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%" "%STREAM_ID%"\n
```

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

```
{
  "start_time": "%START_TIME%",
  "method": "%REQ(:METHOD)%",
  "path": "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%",
  "protocol": "%PROTOCOL%",
  "response_code": "%RESPONSE_CODE%",
  "bytes_received": "%BYTES_RECEIVED%",
  "bytes_sent": "%BYTES_SENT%",
  "duration": "%DURATION%",
  "upstream_service_time": "%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%",
  "forwarded_for": "%REQ(X-FORWARDED-FOR)%",
  "user_agent": "%REQ(USER-AGENT)%",
  "request_id": "%REQ(X-REQUEST-ID)%",
  "authority": "%REQ(:AUTHORITY)%",
  "upstream_host": "%UPSTREAM_HOST%",
  "stream_id": "%STREAM_ID%"
}
```

------

### gRPC 存取日誌
<a name="service-connect-envoy-access-logs-formats-grpc"></a>

除了 HTTP 日誌包含的命令運算子之外，gRPC 存取日誌預設還包含 `%STREAM_ID%`和 `%GRPC_STATUS()%`運算子。

------
#### [ Text ]

```
[%START_TIME%] "%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%"
%RESPONSE_CODE% %GRPC_STATUS()% %BYTES_RECEIVED% %BYTES_SENT% %DURATION%
%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)% "%REQ(X-FORWARDED-FOR)%" "%REQ(USER-AGENT)%"
"%REQ(X-REQUEST-ID)%" "%REQ(:AUTHORITY)%" "%UPSTREAM_HOST%" "%STREAM_ID%"\n
```

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

```
{
  "start_time": "%START_TIME%",
  "method": "%REQ(:METHOD)%",
  "path": "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%",
  "protocol": "%PROTOCOL%",
  "response_code": "%RESPONSE_CODE%",
  "grpc_status": "%GRPC_STATUS()%",
  "bytes_received": "%BYTES_RECEIVED%",
  "bytes_sent": "%BYTES_SENT%",
  "duration": "%DURATION%",
  "upstream_service_time": "%RESP(X-ENVOY-UPSTREAM-SERVICE-TIME)%",
  "forwarded_for": "%REQ(X-FORWARDED-FOR)%",
  "user_agent": "%REQ(USER-AGENT)%",
  "request_id": "%REQ(X-REQUEST-ID)%",
  "authority": "%REQ(:AUTHORITY)%",
  "upstream_host": "%UPSTREAM_HOST%",
  "stream_id": "%STREAM_ID%"
}
```

------

### TCP 存取日誌
<a name="service-connect-envoy-access-logs-formats-tcp"></a>

根據預設，TCP 存取日誌中會包含下列命令運算子：

------
#### [ Text ]

```
[%START_TIME%] %DOWNSTREAM_REMOTE_ADDRESS% %DOWNSTREAM_REMOTE_PORT% 
%BYTES_RECEIVED% %BYTES_SENT% %DURATION%  
%CONNECTION_TERMINATION_DETAILS% %CONNECTION_ID%\n
```

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

```
{
  "start_time": "%START_TIME%",
  "downstream_remote_address": "%DOWNSTREAM_REMOTE_ADDRESS%",
  "downstream_remote_port": "%DOWNSTREAM_REMOTE_PORT%",s
  "bytes_received": "%BYTES_RECEIVED%",
  "bytes_sent": "%BYTES_SENT%",
  "duration": "%DURATION%",
  "connection_termination_details": "%CONNECTION_TERMINATION_DETAILS%",
  "connection_id": %CONNECTION_ID%
}
```

------

如需這些命令運算子的詳細資訊，請參閱 Envoy 文件中的[命令運算](https://www.envoyproxy.io/docs/envoy/latest/configuration/observability/access_log/usage#command-operators)子。

# 啟用 Amazon ECS Service Connect 的存取日誌
<a name="service-connect-access-logs-configuration"></a>

使用 Service Connect 的 Amazon ECS 服務預設不會啟用存取日誌。您可以透過下列方式啟用存取日誌。

## 使用 啟用存取日誌 AWS CLI
<a name="service-connect-access-logs-configure-cli"></a>

下列命令顯示如何在建立服務`accessLogConfiguration`時指定 AWS CLI ，以使用 啟用 Amazon ECS 服務的存取日誌：

```
aws ecs create-service \
    --cluster my-cluster \
    --service-name my-service \
    --task-definition my-task-def \
    --service-connect-configuration '{
        "enabled": true,
        "namespace": "arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-abcdef1234567890",
        "services": [{
            "portName": "web",
            "discoveryName": "my-service",
            "clientAliases": [{
                "port": 80,
                "dnsName": "my-service"
            }]
        }],
        "logConfiguration": {
            "logDriver": "awslogs",
            "options": {
                "awslogs-group": "my-envoy-log-group",
                "awslogs-region": "us-west-2",
                "awslogs-stream-prefix": "myapp-envoy-logs"
            }
        },
         "accessLogConfiguration": {
            "format": "TEXT",
            "includeQueryParameters": "ENABLED" 
        }
    }'
```

## 使用主控台啟用存取日誌
<a name="service-connect-access-logs-configure-console"></a>

如需詳細的服務建立程序，請參閱[建立 Amazon ECS 滾動更新部署](create-service-console-v2.md)。

**使用 建立具有共用命名空間的服務 AWS 管理主控台**

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

1. 在**叢集**頁面上，選擇要在其中建立服務的叢集。

1. 在**服務**下選擇**建立**。

1. 根據工作負載填入其他詳細資訊後，在 **Service Connect** 區段中，選擇**使用 Service Connect**。

1. 根據您的服務類型 （用戶端或用戶端伺服器） 視需要設定 Service Connect 設定。

1. 展開**存取日誌組態**。針對**格式**，選擇 **JSON** 或 `TEXT`。

1. 若要在存取日誌中包含查詢參數，請選取**包含查詢參數**。

1. 完成服務建立程序。

# 加密 Amazon ECS Service Connect 流量
<a name="service-connect-tls"></a>

Amazon ECS Service Connect 支援使用 Transport Layer Security (TLS) 憑證，為 Amazon ECS 服務自動加密流量。當您將 Amazon ECS 服務指向 [AWS 私有憑證授權單位 (AWS 私有 CA)](https://docs.aws.amazon.com/privateca/latest/userguide/PcaWelcome.html) 時，Amazon ECS 會自動佈建 TLS 憑證，以加密 Amazon ECS Service Connect 服務之間的流量。Amazon ECS 會產生、輪換與分發用於流量加密的 TLS 憑證。

Service Connect 的自動流量加密使用業界領先的加密功能來保護服務間通訊，協助您滿足安全需求。它支援使用 AWS 私有憑證授權單位 `256-bit ECDSA`和 `2048-bit RSA`加密的 TLS 憑證。您還可以完全控制私有憑證與簽署金鑰，協助您滿足合規需求。依預設，支援 TLS 1.3，但不支援 TLS 1.0 - 1.2。Service Connect 支援具有下列密碼的 TLS 1.3：
+ `TLS_AES_128_GCM_SHA256`
+ `TLS_AES_256_GCM_SHA384`
+ `TLS_CHACHA20_POLY1305_SHA256`

**注意**  
若要使用 TLS 1.3，必須在目標的接聽程式上將其啟用。  
只有透過 Amazon ECS 代理程式傳遞的傳入與傳出流量才會加密。

## Service Connect 與 Application Load Balancer 運作狀態檢查
<a name="service-connect-tls-alb-healthchecks"></a>

您可以搭配 Application Load Balancer 運作狀態檢查與 TLS 1.3 加密使用 Service Connect。

### Application Load Balancer 組態
<a name="service-connect-tls-alb-config"></a>

使用下列設定來設定 Application Load Balancer：
+ 使用 TLS 1.3 安全政策 (例如 `ELBSecurityPolicy-TLS13-1-2-2021-06`) 設定 TLS 接聽程式。如需詳細資訊，請參閱 [Security policies for your Application Load Balancer](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/describe-ssl-policies.html)。
+ 使用下列設定來建立目標群組：
  + 將通訊協定設定為 HTTPS
  + 將目標群組連接至 TLS 接聽程式
  + 將運作狀態檢查連接埠設定為符合 Service Connect 服務的容器連接埠需求

### Service Connect 組態
<a name="service-connect-tls-sc-config"></a>

使用下列設定來設定服務：
+ 將服務設定為使用 `awsvpc` 網路模式，因為不支援 `bridge` 網路模式。
+ 為服務啟用 Service Connect。
+ 使用下列設定來設定負載平衡器組態：
  + 指定為 Application Load Balancer 設定的目標群組
  + 將容器連接埠設定為符合 Service Connect TLS 服務的容器連接埠需求
+ 避免為服務設定 `ingressPortOverride`。如需詳細資訊，請參閱 *Amazon Elastic Container Service API Reference* 中的 [ServiceConnectService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ServiceConnectService.html)。

### 考量事項
<a name="service-connect-tls-alb-considerations"></a>

使用 Application Load Balancer、TLS 與 Service Connect 時，請考量下列事項：
+ 搭配 TLS 加密使用 Service Connect 時，需使用 `awsvpc` 網路模式 (而不是 `bridge` 網路模式) 進行 HTTPS 運作狀態檢查。HTTP 運作狀態檢查將繼續使用 `bridge` 模式。
+ 將目標群組運作狀態檢查連接埠設定為符合 Service Connect 服務的容器連接埠 (而不是預設的 HTTPS 連接埠 (443)) 需求。

## AWS 私有憑證授權單位 憑證和 Service Connect
<a name="service-connect-tls-certificates"></a>

您需要擁有基礎結構 IAM 角色。如需有關此角色的詳細資訊，請參閱 [Amazon ECS 基礎結構 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/infrastructure_IAM_role.html                     )。

**AWS 私有憑證授權單位 適用於 Service Connect 的 模式**

AWS 私有憑證授權單位 可以兩種模式執行：一般用途和短期。
+ 一般用途 – 可設定任何過期日期的憑證。
+ 短期 – 有效性上限為七天的憑證。

儘管 Amazon ECS 支援這兩種模式，但建議使用短期憑證。依預設，憑證每五天輪換一次，相較於一般用途模式，在短期模式下執行可大幅節省成本。

Service Connect 不支援撤銷憑證，而是改為利用會頻繁輪換的短期憑證。您有權使用 [Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html) 中的[受管輪換](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotate-secrets_managed.html)來修改輪換頻率、停用或刪除秘密，但這樣做可能會產生下列後果。
+ 較短的輪換頻率 - 由於 AWS KMS Secrets Manager AWS 私有 CA和 Auto Scaling 的輪換工作負載增加，較短的輪換頻率會產生更高的成本。
+ 較長的輪換頻率 – 如果輪換頻率超過**七天**，應用程式通訊將會失敗。
+ 刪除秘密 – 刪除秘密會導致輪換失敗並影響客戶應用程式通訊。

如果秘密輪換失敗，會在 [AWS CloudTrail](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-user-guide.html) 中發布 `RotationFailed` 事件。您還可以為 `RotationFailed` 設定 [CloudWatch 警示](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)。

**重要**  
請勿將複本區域新增至秘密。這樣做會阻止 Amazon ECS 刪除秘密，因為 Amazon ECS 沒有從複寫中移除區域的許可。若已新增複寫，請執行下列命令。  

```
aws secretsmanager remove-regions-from-replication \
 --secret-id SecretId \
 --remove-replica-regions region-name
```

**次級憑證授權機構**  
您可以將任何 AWS 私有 CA根憑證或次級憑證帶到 Service Connect TLS，以發行服務的終端實體憑證。提供的發行者會視為各地的簽署者與信任根。您可以從不同的次級 CA 為應用程式的不同部分發行終端實體憑證。使用 時 AWS CLI，請提供 CA 的 Amazon Resource Name (ARN) 來建立信任鏈。

**內部部署憑證授權機構**  
若要使用內部部署 CA，需要在 AWS 私有憑證授權單位中建立與設定次級 CA。這可確保為 Amazon ECS 工作負載發行的所有 TLS 憑證與在內部部署執行的工作負載共用信任鏈，並且能夠安全地連線。

**重要**  
在 `AmazonECSManaged : true`中新增**必要的**標籤 AWS 私有 CA。

**基礎設施即程式碼**  
搭配基礎結構即程式碼 (IaC) 工具使用 Service Connect TLS 時，務必正確設定相依性以避免問題，例如服務停滯在耗盡狀態。如果 AWS KMS 提供金鑰，則應在 Amazon ECS 服務之後刪除 IAM 角色和 AWS 私有 CA 相依性。

如果用於 Service Connect 的命名空間是共用命名空間，您可以選擇使用共用 AWS 私有 CA 資源。如需詳細資訊，請參閱 *AWS 私有憑證授權單位 User Guide* 中的 [Attach a policy for cross-account access](https://docs.aws.amazon.com/privateca/latest/userguide/pca-ram.html)。

## Service Connect 與 Secrets Manager
<a name="service-connect-asm"></a>

**搭配 TLS 加密使用 Amazon ECS Service Connect 時，服務會透過下列方式與 Secrets Manager 互動：**  
Service Connect 會利用提供的基礎結構角色，在 Secrets Manager 中建立秘密。這些秘密用於儲存 TLS 憑證的關聯私有金鑰，以加密 Service Connect 服務之間的流量。

**警告**  
Service Connect 會自動建立與管理這些秘密，從而簡化為服務實作 TLS 加密的程序。但是，務必注意潛在的安全隱患。具有 Secrets Manager 讀取存取權的其他 IAM 角色可能可以存取這些自動建立的秘密。如果未正確設定存取控制，這可能會向未經授權的一方公開敏感的加密資料。  
若要降低此風險，請遵循下列最佳實務：  
小心管理與限制 Secrets Manager 存取權，尤其是 Service Connect 建立的秘密。
定期稽核 IAM 角色及其許可，確保遵循最低權限原則。

授予 Secrets Manager 讀取存取權時，請考慮排除 Service Connect 建立的 TLS 私有金鑰。為此，您可以透過在 IAM 政策中使用條件，來排除具備符合下列模式之 ARN 的秘密：

```
"arn:aws:secretsmanager:::secret:ecs-sc!"
```

以下是一個 IAM 政策範例，該政策拒絕對所有以 `GetSecretValue` 為字首的秘密執行 `ecs-sc!` 動作：

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

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "secretsmanager:GetSecretValue",
            "Resource": "arn:aws:secretsmanager:*:*:secret:ecs-sc!*"
        }
    ]
}
```

------

**注意**  
這是一般範例，可能需要根據您的特定使用案例和 AWS 帳戶組態進行調整。務必全面測試 IAM 政策，確保它們在維護安全性的同時提供預期的存取權。

透過了解 Service Connect 如何與 Secrets Manager 互動，您可以更好地管理 Amazon ECS 服務的安全性，同時利用自動 TLS 加密的優勢。

## Service Connect 和 AWS Key Management Service
<a name="service-connect-kms"></a>

您可以使用 [AWS Key Management Service](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) 來加密和解密 Service Connect 資源。 AWS KMS 是一項由 管理的服務，您可以在 AWS 其中建立和管理加密金鑰來保護您的資料。

 AWS KMS 搭配 Service Connect 使用 時，您可以選擇使用 AWS 為您 AWS 管理的 擁有金鑰，也可以選擇現有的 AWS KMS 金鑰。您也可以[建立要使用的新 AWS KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#create-symmetric-cmk)。

**提供自己的加密金鑰**  
您可以提供自己的金鑰材料，也可以透過將自己的金鑰 AWS Key Management Service 匯入 來使用外部金鑰存放區 AWS KMS，然後在 Amazon ECS Service Connect 中指定該金鑰的 Amazon Resource Name (ARN)。

以下是範例 AWS KMS 政策。將 *user-input* 值取代實際值。

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

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "id",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:role/role-name"
      },
      "Action": [
        "kms:Encrypt",
        "kms:Decrypt",
        "kms:GenerateDataKey",
        "kms:GenerateDataKeyPair"
      ],
      "Resource": "*"
    }
  ]
}
```

------

如需有關金鑰政策的詳細資訊，請參閱 *AWS Key Management Service Developer Guide* 中的 [Creating a key policy](https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-overview.html)。

**注意**  
Service Connect 僅支援對稱加密 AWS KMS 金鑰。您無法使用任何其他類型的 AWS KMS 金鑰來加密 Service Connect 資源。如需判斷 AWS KMS 金鑰是否為對稱加密金鑰的說明，請參閱[識別非對稱 KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/identify-key-types.html#identify-asymm-keys)。

如需 AWS Key Management Service 對稱加密金鑰的詳細資訊，請參閱《 *AWS Key Management Service 開發人員指南*》中的[對稱加密 AWS KMS 金鑰](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#symmetric-cmks)。

# 為 Amazon ECS Service Connect 啟用 TLS
<a name="enable-service-connect-tls"></a>

您可以在建立或更新 Service Connect 服務時啟用流量加密。

**使用 啟用現有命名空間中服務的流量加密 AWS 管理主控台**

1. 您需要擁有基礎結構 IAM 角色。如需有關此角色的詳細資訊，請參閱 [Amazon ECS 基礎結構 IAM 角色](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/infrastructure_IAM_role.html                     )。

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

1. 在導覽窗格中，選擇 **Namespaces (命名空間)**。

1. 選擇要為其啟用流量加密之**服務**所在的**命名空間**。

1. 選擇要啟用流量加密的**服務**。

1. 選擇右上角的**更新服務**，然後向下捲動至「Service Connect」區段。

1. 在服務資訊下方，選擇**開啟流量加密**以啟用 TLS。

1. 在 **Service Connect TLS 角色**欄位中，選擇現有的基礎結構 IAM 角色或建立一個新角色。

1. 在**簽署者憑證授權機構**欄位中，選擇現有的憑證授權機構或建立一個新的憑證授權機構。

   如需詳細資訊，請參閱[AWS 私有憑證授權單位 憑證和 Service Connect](service-connect-tls.md#service-connect-tls-certificates)。

1. 針對**選擇 AWS KMS key**，選擇 AWS 擁有和管理的金鑰，或者您可以選擇不同的金鑰。您也可以選擇建立一個新金輪。

如需使用 AWS CLI 為您的服務設定 TLS 的範例，請參閱[使用 設定 Amazon ECS Service Connect AWS CLI](create-service-connect.md)。

# 驗證 Amazon ECS Service Connect 是否啟用 TLS
<a name="verify-tls-enabled"></a>

Service Connect 會在 Service Connect 代理程式啟動 TLS，並在目的地代理程式將其終止。因此，應用程式程式碼絕不會看到 TLS 互動。使用下列步驟來驗證 TLS 是否已啟用。

1. 在應用程式映像中包含 `openssl` CLI。

1. 在服務上啟用 [ECS Exec](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html)，以透過 SSM 連線至任務。或者，您也可以在與服務相同的 Amazon VPC 中啟動 Amazon EC2 執行個體。

1. 從要驗證的服務中擷取任務的 IP 與連接埠。您可以在 AWS Cloud Map 主控台中擷取任務 IP 地址。該資訊位於命名空間的服務詳細資訊頁面上。

1. 使用 `execute-command` 登入任何任務，如下列範例所示。或者，登入在**步驟 2** 中建立的 Amazon EC2 執行個體。

   ```
   $ aws ecs execute-command --cluster cluster-name \
       --task task-id  \
       --container container-name \
       --interactive \
       --command "/bin/sh"
   ```
**注意**  
直接呼叫 DNS 名稱不會顯示憑證。

1. 在已連線的 Shell 中，使用 `openssl` CLI 來驗證與檢視連接至任務的憑證。

   範例：

   ```
   openssl s_client -connect 10.0.147.43:6379 < /dev/null 2> /dev/null \ 
   | openssl x509 -noout -text
   ```

   回應範例：

   ```
   Certificate:
       Data:
           Version: 3 (0x2)
           Serial Number:
               <serial-number>
           Signature Algorithm: ecdsa-with-SHA256
           Issuer: <issuer>
           Validity
               Not Before: Jan 23 21:38:12 2024 GMT
               Not After : Jan 30 22:38:12 2024 GMT
           Subject: <subject>
           Subject Public Key Info:
               Public Key Algorithm: id-ecPublicKey
                   Public-Key: (256 bit)
                   pub:
                       <pub>
                   ASN1 OID: prime256v1
                   NIST CURVE: P-256
           X509v3 extensions:
               X509v3 Subject Alternative Name:
                   DNS:redis.yelb-cftc
               X509v3 Basic Constraints:
                   CA:FALSE
               X509v3 Authority Key Identifier:
                   keyid:<key-id>
   
               X509v3 Subject Key Identifier:
                   1D:<id>
               X509v3 Key Usage: critical
                   Digital Signature, Key Encipherment
               X509v3 Extended Key Usage:
                   TLS Web Server Authentication, TLS Web Client Authentication
       Signature Algorithm: ecdsa-with-SHA256
           <hash>
   ```

# 使用 設定 Amazon ECS Service Connect AWS CLI
<a name="create-service-connect"></a>

您可以搭配 AWS CLI使用 Service Connect，來建立包含 Fargate 任務的 Amazon ECS 服務。

**注意**  
您可以使用雙堆疊服務端點，透過 IPv4 和 IPv6 AWS CLI從 、 SDKs 和 Amazon ECS API 與 Amazon ECS 互動。如需詳細資訊，請參閱[使用 Amazon ECS 雙堆疊端點](dual-stack-endpoint.md)。

## 先決條件
<a name="create-service-connect-prereqs"></a>

下列是使用 Service Connect 的先決條件：
+ 確認 AWS CLI 已安裝並設定最新版本的 。如需詳細資訊，請參閱 [Installing or updating to the latest version of the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。
+ 您的 IAM 使用者擁有 [AmazonECS\$1FullAccess](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonECS_FullAccess) IAM 政策範例中指定的所需許可。
+ 您已建立要使用的 VPC、子網路、路由表和安全群組。如需詳細資訊，請參閱[建立 Virtual Private Cloud](get-set-up-for-amazon-ecs.md#create-a-vpc)。
+ 您具有名為 `ecsTaskExecutionRole` 的任務執行角色，且 `AmazonECSTaskExecutionRolePolicy` 受管政策已附加至該角色。此角色允許 Fargate 將 NGINX 應用程式日誌和 Service Connect Proxy 日誌寫入 Amazon CloudWatch Logs。如需詳細資訊，請參閱[建立任務執行角色](task_execution_IAM_role.md#create-task-execution-role)。

## 步驟 1：建立叢集
<a name="create-service-connect-cluster"></a>

使用下列步驟建立 Amazon ECS 叢集和命名空間。

**建立 Amazon ECS 叢集和 AWS Cloud Map 命名空間**

1. 建立要使用的名為 `tutorial` 的 Amazon ECS 叢集。參數 `--service-connect-defaults` 會設定叢集的預設命名空間。在範例輸出中，名稱的 AWS Cloud Map 命名空間`service-connect`不存在於此帳戶中 AWS 區域，因此命名空間是由 Amazon ECS 建立。該命名空間是在帳戶的 AWS Cloud Map 中建立，並且對所有其他命名空間都可見，因此請使用可指示此用途的名稱。

   ```
   aws ecs create-cluster --cluster-name tutorial --service-connect-defaults namespace=service-connect
   ```

   輸出：

   ```
   {
       "cluster": {
           "clusterArn": "arn:aws:ecs:us-west-2:123456789012:cluster/tutorial",
           "clusterName": "tutorial",
           "serviceConnectDefaults": {
               "namespace": "arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-EXAMPLE"
           },
           "status": "PROVISIONING",
           "registeredContainerInstancesCount": 0,
           "runningTasksCount": 0,
           "pendingTasksCount": 0,
           "activeServicesCount": 0,
           "statistics": [],
           "tags": [],
           "settings": [
               {
                   "name": "containerInsights",
                   "value": "disabled"
               }
           ],
           "capacityProviders": [],
           "defaultCapacityProviderStrategy": [],
           "attachments": [
               {
                   "id": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
                   "type": "sc",
                   "status": "ATTACHING",
                   "details": []
               }
           ],
           "attachmentsStatus": "UPDATE_IN_PROGRESS"
       }
   }
   }
   ```

1. 確認已建立叢集：

   ```
   aws ecs describe-clusters --clusters tutorial
   ```

   輸出：

   ```
   {
       "clusters": [
           {
               "clusterArn": "arn:aws:ecs:us-west-2:123456789012:cluster/tutorial",
               "clusterName": "tutorial",
               "serviceConnectDefaults": {
                   "namespace": "arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-EXAMPLE"
               },
               "status": "ACTIVE",
               "registeredContainerInstancesCount": 0,
               "runningTasksCount": 0,
               "pendingTasksCount": 0,
               "activeServicesCount": 0,
               "statistics": [],
               "tags": [],
               "settings": [],
               "capacityProviders": [],
               "defaultCapacityProviderStrategy": []
           }
       ],
       "failures": []
   }
   ```

1. （選用） 確認已在其中建立命名空間 AWS Cloud Map。您可以在建立時，使用 AWS 管理主控台 或正常 AWS CLI 組態 AWS Cloud Map。

   例如，使用 AWS CLI：

   ```
   aws servicediscovery get-namespace --id ns-EXAMPLE
   ```

   輸出：

   ```
   {
       "Namespace": {
           "Id": "ns-EXAMPLE",
           "Arn": "arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-EXAMPLE",
           "Name": "service-connect",
           "Type": "HTTP",
           "Properties": {
               "DnsProperties": {
                   "SOA": {}
               },
               "HttpProperties": {
                   "HttpName": "service-connect"
               }
           },
           "CreateDate": 1661749852.422,
           "CreatorRequestId": "service-connect"
       }
   }
   ```

## 步驟 2：為伺服器建立服務
<a name="create-service-connect-nginx-server"></a>

Service Connect 功能適用於在 Amazon ECS 上進行多個應用程式的互連線。這些應用程式中至少有一個需要提供要連線的 Web 服務。在此步驟中，您要建立如下項目：
+ 會使用未修改的官方 NGINX 容器映像且包含 Service Connect 組態的任務定義。
+ Amazon ECS 服務定義，將 Service Connect 設定為針對此服務的流量提供服務探索與服務網格代理。此組態會重複使用叢集組態中的預設命名空間，以減少您為每個服務所做的服務組態數量。
+ Amazon ECS 服務。該服務會使用任務定義執行一項任務，並為 Service Connect Proxy 插入額外的容器。Proxy 會在任務定義中容器連接埠映射的連接埠上接聽。在 Amazon ECS 中執行的用戶端應用程式中，用戶端任務中的 Proxy 會接聽任務定義連接埠名稱、服務探索名稱或服務用戶端別名名稱的輸出連線，以及來自用戶端別名的連接埠號碼。

**使用 Service Connect 建立 Web 服務**

1. 註冊與 Fargate 相容的任務定義，並使用 `awsvpc` 網路模式。請遵循下列步驟：

   1. 使用以下任務定義的內容，建立名為 `service-connect-nginx.json` 的檔案：

      此任務定義透過將 `name` 和 `appProtocol` 參數新增至連接埠映射來設定 Service Connect。使用多個連接埠時，連接埠名稱有助於您識別服務組態中的此連接埠。依預設，連接埠名稱也會用作可探索的名稱，以供命名空間中的其他應用程式使用。

      任務定義包含任務 IAM 角色，因為服務已啟用 ECS Exec。
**重要**  
此任務定義使用 `logConfiguration`，將 nginx 輸出從 `stdout` 和 `stderr` 傳送到 Amazon CloudWatch Logs。此任務執行角色沒有所需的額外許可，無法建立 CloudWatch Logs 日誌群組。使用 AWS 管理主控台 或 在 CloudWatch Logs 中建立日誌群組 AWS CLI。如果不想將 nginx 日誌傳送到 CloudWatch Logs，您可以移除 `logConfiguration`。  
將任務執行角色中的 AWS 帳戶 ID 取代為您的 AWS 帳戶 ID。

      ```
      {
          "family": "service-connect-nginx",
          "executionRoleArn": "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
          "taskRoleArn": "arn:aws:iam::123456789012:role/ecsTaskRole",
          "networkMode": "awsvpc",
          "containerDefinitions": [
              {
              "name": "webserver",
              "image": "public.ecr.aws/docker/library/nginx:latest",
              "cpu": 100,
              "portMappings": [
                  {
                      "name": "nginx",
                      "containerPort": 80,
                      "protocol": "tcp", 
                      "appProtocol": "http"
                  }
              ],
              "essential": true,
              "logConfiguration": {
                  "logDriver": "awslogs",
                  "options": {
                      "awslogs-group": "/ecs/service-connect-nginx",
                      "awslogs-region": "region", 
                      "awslogs-stream-prefix": "nginx"
                  }
              }
              }
          ],
          "cpu": "256",
          "memory": "512"
      }
      ```

   1. 使用 `service-connect-nginx.json` 檔案註冊任務定義：

      ```
      aws ecs register-task-definition --cli-input-json file://service-connect-nginx.json
      ```

1. 建立服務：

   1. 使用您要建立的 Amazon ECS 服務的內容，建立名為 `service-connect-nginx-service.json` 的檔案。此範例使用上個步驟中建立的任務定義。需要 `awsvpcConfiguration`，因為任務定義範例使用 `awsvpc` 網路模式。

      建立 ECS 服務時，請指定 Fargate 以及支援 Service Connect 的 `LATEST` 平台版本。`securityGroups` 和 `subnets` 所屬的 VPC 必須具有使用 Amazon ECS 的需求。您可以從 Amazon VPC 主控台取得安全群組和子網路識別碼。

      此服務透過新增 `serviceConnectConfiguration` 參數來設定 Service Connect。不需要命名空間，因為叢集已設定預設命名空間。在命名空間的 ECS 中執行的用戶端應用程式使用 `portName` 和 `clientAliases` 中的連接埠連線至此服務。例如，由於 nginx 在根位置 `/` 提供歡迎頁面，因此可以使用 `http://nginx:80/` 連上此服務。未在 Amazon ECS 中執行或不在相同命名空間中的外部應用程式，可以使用任務的 IP 地址和任務定義中的連接埠號碼，透過 Service Connect Proxy 連上此應用程式。對於 `tls` 組態，請為 `awsPcaAuthorityArn`、`kmsKey` 與 IAM 角色的 `roleArn` 新增憑證 `arn`。

      此服務會使用 `logConfiguration`，將 Service Connect Proxy 輸出從 `stdout` 和 `stderr` 傳送至 Amazon CloudWatch Logs。此任務執行角色沒有所需的額外許可，無法建立 CloudWatch Logs 日誌群組。使用 AWS 管理主控台 或 在 CloudWatch Logs 中建立日誌群組 AWS CLI。我們建議您建立此日誌群組，並將 Proxy 日誌儲存在 CloudWatch Logs 中。如果不想將 Proxy 日誌傳送到 CloudWatch Logs，您可以移除 `logConfiguration`。

      ```
      {
          "cluster": "tutorial",
          "deploymentConfiguration": {
              "maximumPercent": 200,
              "minimumHealthyPercent": 0
          },
          "deploymentController": {
              "type": "ECS"
          },
          "desiredCount": 1,
          "enableECSManagedTags": true,
          "enableExecuteCommand": true,
          "launchType": "FARGATE",
          "networkConfiguration": {
              "awsvpcConfiguration": {
                  "assignPublicIp": "ENABLED",
                  "securityGroups": [
                      "sg-EXAMPLE"
                  ],
                  "subnets": [
                      "subnet-EXAMPLE",
                      "subnet-EXAMPLE",
                      "subnet-EXAMPLE"
                  ]
                 }
          },
          "platformVersion": "LATEST",
          "propagateTags": "SERVICE",
          "serviceName": "service-connect-nginx-service",
          "serviceConnectConfiguration": {
              "enabled": true,
              "services": [
                  {
                      "portName": "nginx",
                      "clientAliases": [
                          {
                              "port": 80
                          }
                      ],
                      "tls": {
                         "issuerCertificateAuthority": {
                            "awsPcaAuthorityArn": "certificateArn"
                         }, 
                         "kmsKey": "kmsKey", 
                         "roleArn": "iamRoleArn"
                      }
                  }
              ],
              "logConfiguration": {
                  "logDriver": "awslogs",
                  "options": {
                      "awslogs-group": "/ecs/service-connect-proxy",
                      "awslogs-region": "region",
                      "awslogs-stream-prefix": "service-connect-proxy"
                  }
              }
          },
          "taskDefinition": "service-connect-nginx"
      }
      ```

   1. 使用 `service-connect-nginx-service.json` 檔案建立服務：

      ```
      aws ecs create-service --cluster tutorial --cli-input-json file://service-connect-nginx-service.json
      ```

      輸出：

      ```
      {
          "service": {
              "serviceArn": "arn:aws:ecs:us-west-2:123456789012:service/tutorial/service-connect-nginx-service",
              "serviceName": "service-connect-nginx-service",
              "clusterArn": "arn:aws:ecs:us-west-2:123456789012:cluster/tutorial",
              "loadBalancers": [],
              "serviceRegistries": [],
              "status": "ACTIVE",
              "desiredCount": 1,
              "runningCount": 0,
              "pendingCount": 0,
              "launchType": "FARGATE",
              "platformVersion": "LATEST",
              "platformFamily": "Linux",
              "taskDefinition": "arn:aws:ecs:us-west-2:123456789012:task-definition/service-connect-nginx:1",
              "deploymentConfiguration": {
                  "deploymentCircuitBreaker": {
                      "enable": false,
                      "rollback": false
                  },
                  "maximumPercent": 200,
                  "minimumHealthyPercent": 0
              },
              "deployments": [
                  {
                      "id": "ecs-svc/3763308422771520962",
                      "status": "PRIMARY",
                      "taskDefinition": "arn:aws:ecs:us-west-2:123456789012:task-definition/service-connect-nginx:1",
                      "desiredCount": 1,
                      "pendingCount": 0,
                      "runningCount": 0,
                      "failedTasks": 0,
                      "createdAt": 1661210032.602,
                      "updatedAt": 1661210032.602,
                      "launchType": "FARGATE",
                      "platformVersion": "1.4.0",
                      "platformFamily": "Linux",
                      "networkConfiguration": {
                          "awsvpcConfiguration": {
                              "assignPublicIp": "ENABLED",
                              "securityGroups": [
                                  "sg-EXAMPLE"
                              ],
                              "subnets": [
                                  "subnet-EXAMPLEf",
                                  "subnet-EXAMPLE",
                                  "subnet-EXAMPLE"
                              ]
                          }
                      },
                      "rolloutState": "IN_PROGRESS",
                      "rolloutStateReason": "ECS deployment ecs-svc/3763308422771520962 in progress.",
                      "failedLaunchTaskCount": 0,
                      "replacedTaskCount": 0,
                      "serviceConnectConfiguration": {
                          "enabled": true,
                          "namespace": "service-connect",
                          "services": [
                              {
                                  "portName": "nginx",
                                  "clientAliases": [
                                      {
                                          "port": 80
                                      }
                                  ]
                              }
                          ],
                          "logConfiguration": {
                              "logDriver": "awslogs",
                              "options": {
                                  "awslogs-group": "/ecs/service-connect-proxy",
                                  "awslogs-region": "us-west-2",
                                  "awslogs-stream-prefix": "service-connect-proxy"
                              },
                              "secretOptions": []
                          }
                      },
                      "serviceConnectResources": [
                          {
                              "discoveryName": "nginx",
                              "discoveryArn": "arn:aws:servicediscovery:us-west-2:123456789012:service/srv-EXAMPLE"
                          }
                      ]
                  }
              ],
              "roleArn": "arn:aws:iam::123456789012:role/aws-service-role/ecs.amazonaws.com/AWSServiceRoleForECS",
              "version": 0,
              "events": [],
              "createdAt": 1661210032.602,
              "placementConstraints": [],
              "placementStrategy": [],
              "networkConfiguration": {
                  "awsvpcConfiguration": {
                      "assignPublicIp": "ENABLED",
                      "securityGroups": [
                          "sg-EXAMPLE"
                      ],
                      "subnets": [
                          "subnet-EXAMPLE",
                          "subnet-EXAMPLE",
                          "subnet-EXAMPLE"
                      ]
                  }
              },
              "schedulingStrategy": "REPLICA",
              "enableECSManagedTags": true,
              "propagateTags": "SERVICE",
              "enableExecuteCommand": true
          }
      }
      ```

      您提供的 `serviceConnectConfiguration` 會出現在輸出的第一個*部署*中。當您以需要對任務進行變更的方式對 ECS 服務進行變更時，Amazon ECS 會建立新的部署。

## 步驟 3：確認您是否可以連線
<a name="create-service-connect-verify"></a>

若要確認 Service Connect 已設定且正常運作，請依照下列步驟從外部應用程式連線至 Web 服務。然後，查看 CloudWatch 中由 Service Connect Proxy 建立的其他指標。

**從外部應用程式連線至 Web 服務**
+ 使用任務 IP 地址連線至任務 IP 地址和容器連接埠

  使用 AWS CLI 取得任務 ID，方法是使用 `aws ecs list-tasks --cluster tutorial`。

  如果子網路和安全群組允許任務定義的連接埠上來自公用網際網路的流量，您可以從電腦連線到公用 IP。不過，公有 IP 無法從 `describe-tasks` 取得，因此這些步驟涉及前往 Amazon EC2 AWS 管理主控台 或 AWS CLI 以取得彈性網路界面的詳細資訊。

  在此範例中，相同 VPC 中的 Amazon EC2 執行個體使用的是任務的私有 IP。該應用程式是 nginx，但 `server: envoy` 標題顯示使用的是 Service Connect Proxy。Service Connect Proxy 正在任務定義中容器連接埠上接聽。

  ```
  $ curl -v 10.0.19.50:80/
  *   Trying 10.0.19.50:80...
  * Connected to 10.0.19.50 (10.0.19.50) port 80 (#0)
  > GET / HTTP/1.1
  > Host: 10.0.19.50
  > User-Agent: curl/7.79.1
  > Accept: */*
  >
  * Mark bundle as not supporting multiuse
  < HTTP/1.1 200 OK
  < server: envoy
  < date: Tue, 23 Aug 2022 03:53:06 GMT
  < content-type: text/html
  < content-length: 612
  < last-modified: Tue, 16 Apr 2019 13:08:19 GMT
  < etag: "5cb5d3c3-264"
  < accept-ranges: bytes
  < x-envoy-upstream-service-time: 0
  <
  <!DOCTYPE html>
  <html>
  <head>
  <title>Welcome to nginx!</title>
  <style>
      body {
          width: 35em;
          margin: 0 auto;
          font-family: Tahoma, Verdana, Arial, sans-serif;
      }
  </style>
  </head>
  <body>
  <h1>Welcome to nginx!</h1>
  <p>If you see this page, the nginx web server is successfully installed and
  working. Further configuration is required.</p>
  
  <p>For online documentation and support please refer to
  <a href="http://nginx.org/">nginx.org</a>.<br/>
  Commercial support is available at
  <a href="http://nginx.com/">nginx.com</a>.</p>
  
  <p><em>Thank you for using nginx.</em></p>
  </body>
  </html>
  ```

**檢視 Service Connect 指標**  
Service Connect Proxy 會在 CloudWatch 指標中建立應用程式 (HTTP、HTTP2、gRPC 或 TCP 連線) 指標。使用 CloudWatch 主控台時，請參閱 Amazon ECS 命名空間下的 **DiscoveryName**、(**DiscoveryName、ServiceName、ClusterName**)、**TargetDiscoveryName** 與 (**TargetDiscoveryName、ServiceName、ClusterName**) 的其他指標維度。如需有關這些指標與維度的詳細資訊，請參閱 Amazon CloudWatch Logs User Guide 中的 [View Available Metrics](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/viewing_metrics_with_cloudwatch.html)。

# 使用服務探索以利用 DNS 名稱連接 Amazon ECS 服務
<a name="service-discovery"></a>

您可以選擇性地設定 Amazon ECS 服務，以使用 Amazon ECS 服務探索。服務探索使用 AWS Cloud Map API 動作來管理 Amazon ECS 服務的 HTTP 和 DNS 命名空間。如需詳細資訊，請參閱 *AWS Cloud Map Developer Guide* 中的 [What Is AWS Cloud Map](https://docs.aws.amazon.com/cloud-map/latest/dg/Welcome.html)。

服務探索可在下列 AWS 區域使用：


| 區域名稱 | 區域 | 
| --- | --- | 
|  美國東部 (維吉尼亞北部)  |  us-east-1  | 
|  美國東部 (俄亥俄)  |  us-east-2  | 
|  美國西部 (加州北部)  |  us-west-1  | 
|  美國西部 (奧勒岡)  |  us-west-2  | 
|  Africa (Cape Town)  |  af-south-1  | 
|  亞太地區 (香港)  |  ap-east-1  | 
|  亞太區域 (台北)  |  ap-east-2  | 
|  亞太區域 (孟買)  |  ap-south-1  | 
|  亞太地區 (海德拉巴)  |  ap-south-2  | 
|  亞太區域 (東京)  |  ap-northeast-1  | 
|  亞太區域 (首爾)  |  ap-northeast-2  | 
|  亞太地區 (大阪)  |  ap-northeast-3  | 
|  亞太區域 (新加坡)  |  ap-southeast-1  | 
|  亞太區域 (雪梨)  |  ap-southeast-2  | 
|  亞太地區 (雅加達)  |  ap-southeast-3  | 
|  亞太地區 (墨爾本)  |  ap-southeast-4  | 
|  亞太地區 (馬來西亞)  |  ap-southeast-5  | 
|  亞太區域 (紐西蘭)  |  ap-southeast-6  | 
|  亞太區域 (泰國)  |  ap-southeast-7  | 
|  加拿大 (中部)  |  ca-central-1  | 
|  加拿大西部 (卡加利)  |  ca-west-1  | 
|  中國 (北京)  |  cn-north-1  | 
|  中國 (寧夏)  |  cn-northwest-1  | 
|  歐洲 (法蘭克福)  |  eu-central-1  | 
|  歐洲 (蘇黎世)  |  eu-central-2  | 
|  歐洲 (愛爾蘭)  |  eu-west-1  | 
|  歐洲 (倫敦)  |  eu-west-2  | 
|  歐洲 (巴黎)  |  eu-west-3  | 
|  歐洲 (米蘭)  |  eu-south-1  | 
|  Europe (Stockholm)  |  eu-north-1  | 
|  以色列 (特拉維夫)  |  il-central-1  | 
|  歐洲 (西班牙)  |  eu-south-2  | 
|  中東 (阿拉伯聯合大公國)  |  me-central-1  | 
|  墨西哥 (中部)  |  mx-central-1  | 
|  Middle East (Bahrain)  |  me-south-1  | 
|  南美洲 (聖保羅)  |  sa-east-1  | 
|  AWS GovCloud （美國東部）  |  us-gov-east-1  | 
|  AWS GovCloud （美國西部）  |  us-gov-west-1  | 

## 服務探索概念
<a name="service-discovery-concepts"></a>

服務探索包含下列元件：
+ **服務探索命名空間**：擁有相同網域名稱 (例如 `example.com`) 的服務探索服務的邏輯群組，這是要路由流量的位置。您可以透過呼叫 `aws servicediscovery create-private-dns-namespace` 命令或 Amazon ECS 主控台建立命名空間。您可以使用 `aws servicediscovery list-namespaces` 命令來檢視由目前帳戶所建立的命名空間摘要資訊。如需服務探索命令的詳細資訊，請參閱《 *AWS Cloud Map （服務探索） AWS CLI 參考指南*`[list-namespaces](https://docs.aws.amazon.com/cli/latest/reference/servicediscovery/list-namespaces.html)`》中的 `[create-private-dns-namespace](https://docs.aws.amazon.com/cli/latest/reference/servicediscovery/create-private-dns-namespace.html)`和 。
+ **服務探索服務**：存在於服務探索命名空間中，由命名空間的服務名稱和 DNS 設定組成。它提供以下核心元件：
  + **服務登錄**檔：可讓您透過 DNS 或 AWS Cloud Map API 動作查詢服務，並取得一或多個可用來連線至服務的可用端點。
+ **服務探索執行個體**：存在於服務探索服務內，由服務目錄中每個 Amazon ECS 服務相關聯的屬性組成。
  + **執行個體屬性**：針對每個設定為使用的服務探索的 Amazon ECS 服務，以下中繼資料會新增為自訂屬性：
    + **`AWS_INSTANCE_IPV4`** – 對於 `A`記錄，Route 53 傳回以回應 DNS 查詢的 IPv4 地址，並在探索執行個體詳細資訊時 AWS Cloud Map 傳回 ，例如 `192.0.2.44`。
    + **`AWS_INSTANCE_IPV6`**– 針對 `AAAA`記錄，Route 53 傳回以回應 DNS 查詢的 IPv6 地址，並在探索執行個體詳細資訊時 AWS Cloud Map 傳回 ，例如 ` 2001:0db8:85a3:0000:0000:abcd:0001:2345`。對於 Amazon ECS 雙堆疊服務，會同時新增 `AWS_INSTANCE_IPv4` 與 `AWS_INSTANCE_IPv6`。對於 Amazon ECS 純 IPv6 服務，僅會新增 `AWS_INSTANCE_IPv6`。
    + **`AWS_INSTANCE_PORT`**：與服務探索服務相關聯的連接埠值。
    + **`AVAILABILITY_ZONE`**：在其中啟動任務的可用區域。對於使用 EC2 的任務，這是容器執行個體所在的可用區域。對於使用 Fargate 的任務，這是彈性網路介面所在的可用區域。
    + **`REGION`**：任務所在的區域。
    + **`ECS_SERVICE_NAME`**：任務所屬的 Amazon ECS 服務名稱。
    + **`ECS_CLUSTER_NAME`**：任務所屬的 Amazon ECS 叢集名稱。
    + **`EC2_INSTANCE_ID`**：放置任務的容器執行個體的 ID。如果任務使用 Fargate，則不會新增此自訂屬性。
    + **`ECS_TASK_DEFINITION_FAMILY`**：任務使用的任務定義系列。
    + **`ECS_TASK_SET_EXTERNAL_ID`**：如果任務集合是為外部部署建立，並與服務探索登錄關聯，則 `ECS_TASK_SET_EXTERNAL_ID` 屬性將包含任務集合的外部 ID。
+ **Amazon ECS 運作狀態檢查**：Amazon ECS 會定期執行容器層級的運作狀態檢查。端點若未通過運作狀態檢查，則會從 DNS 路由中移除並標記為運作狀態不佳。

## 服務探索考量
<a name="service-discovery-considerations"></a>

使用服務探索時應考慮以下事項：
+ 服務探索支援在 Fargate 上使用 1.1.0 或更新平台版本的任務。如需詳細資訊，請參閱[適用於 Amazon ECS 的 Fargate 平台版本](platform-fargate.md)。
+ 被設定為使用服務探索的服務有每個服務 1,000 項任務的限制。這是由於 Route 53 服務配額所致。
+ Amazon ECS 主控台的建立服務工作流程僅支援將服務註冊到私有 DNS 命名空間。建立 AWS Cloud Map 私有 DNS 命名空間時，會自動建立 Route 53 私有託管區域。
+ 必須設定 VPC DNS 屬性，以成功進行 DNS 解析。如需有關如何設定屬性的詳細資訊，請參閱 *Amazon VPC 使用者指南*中的 [VPC 中的 DNS 支援](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-dns.html#vpc-dns-support)。
+ Amazon ECS 不支援在共用 AWS Cloud Map 命名空間中註冊服務。
+ 為服務探索服務建立的 DNS 記錄總是會使用任務的私有 IP 地址註冊，而非公有 IP 地址 (即使使用公有命名空間)。
+ 服務探索要求任務指定 `awsvpc`、`bridge` 或 `host` 網路模式 (不支援 `none`)。
+ 如果服務任務定義使用 `awsvpc` 網路模式，您可以為每項服務任務建立任意組合的 `A` 或 `SRV` 記錄。如果使用 `SRV` 記錄，必須具備連接埠。如果服務使用雙堆疊子網路，可以另外建立 `AAAA` 記錄。如果服務使用純 IPv6 子網路，則無法建立 `A` 記錄。
+ 如果服務任務定義使用 `bridge` 或 `host` 網路模式，則 SRV 記錄是唯一受支援的 DNS 記錄類型。為每個服務任務建立 SRV 記錄。SRV 紀錄必須從任務定義中指定容器名稱和容器連接埠組合。
+ 您可以在 VPC 內查詢服務探索服務的 DNS 記錄。其採用的格式為：`<service-discovery-service-name>.<service-discovery-namespace>`。
+ 針對服務名稱執行 DNS 查詢時，`A` 與 `AAAA` 記錄會傳回一組對應至任務的 IP 位址。`SRV` 記錄會為每項任務傳回一組 IP 位址與連接埠。
+ 如果您有八個以下正常運作的記錄，Route 53 會使用所有正常記錄回應所有 DNS 查詢。
+ 當所有記錄都狀況不良，Route 53 會使用最多八個狀況不良的記錄來回應 DNS 查詢。
+ 您可以為負載平衡器後方的服務設定服務探索，但會將服務探索流量一律路由到任務，而不是負載平衡器。
+ 服務探索不支援使用 Classic Load Balancer。
+ 針對您的服務探索服務，我們建議您使用由 Amazon ECS 管理的容器層級運作狀態檢查。
  + **HealthCheckCustomConfig**—Amazon ECS 代替您管理運作狀態檢查。Amazon ECS 利用來自容器和運作狀態檢查的資訊和您的任務狀態，透過 AWS Cloud Map更新運作狀態。當您建立服務探索服務時，會使用 `--health-check-custom-config` 參數來指定。如需詳細資訊，請參閱 *AWS Cloud Map API 參考*中的 [HealthCheckCustomConfig](https://docs.aws.amazon.com/cloud-map/latest/api/API_HealthCheckCustomConfig.html)。
+ 使用服務探索時建立 AWS Cloud Map 的資源必須手動清除。
+ 任務與執行個體會註冊為 `UNHEALTHY`，直到容器運作狀態檢查傳回值。如果運作狀態檢查通過，狀態會更新為 `HEALTHY`。如果容器運作狀態檢查失敗，則會取消註冊服務探索執行個體。

## 服務探索定價
<a name="service-discovery-pricing"></a>

使用 Amazon ECS 服務探索的客戶需要支付 Route 53 資源和 AWS Cloud Map 探索 API 操作的費用。其中包括建立 Route 53 託管區域和查詢服務登錄檔的費用。如需詳細資訊，請參閱 *AWS Cloud Map 開發人員指南*中的 [AWS Cloud Map 定價](https://docs.aws.amazon.com/cloud-map/latest/dg/cloud-map-pricing.html)。

Amazon ECS 會執行容器層級的運作狀態檢查，並將其公開給 AWS Cloud Map 自訂的運作狀態檢查 API 操作。這目前提供給客戶免費使用。如果您針對公開的任務設定其他網路運作狀態檢查，則會向您收取其費用。

# 建立使用服務探索的 Amazon ECS 服務
<a name="create-service-discovery"></a>

了解如何使用 AWS CLI建立一項服務，其中包含使用服務探索的 Fargate 任務。

如需 AWS 區域 支援服務探索的清單，請參閱 [使用服務探索以利用 DNS 名稱連接 Amazon ECS 服務](service-discovery.md)。

如需支援 Fargate 的區域的資訊，請參閱[AWS Fargate 上 Amazon ECS 支援的 區域](AWS_Fargate-Regions.md)。

**注意**  
您可以使用雙堆疊服務端點，透過 IPv4 和 IPv6 AWS CLI從 、 SDKs 和 Amazon ECS API 與 Amazon ECS 互動。如需詳細資訊，請參閱[使用 Amazon ECS 雙堆疊端點](dual-stack-endpoint.md)。

## 先決條件
<a name="create-service-discovery-prereqs"></a>

在您開始教學課程之前，請務必先達成以下先決條件：
+  AWS CLI 已安裝並設定最新版本的 。如需詳細資訊，請參閱 [Installing or updating to the latest version of the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。
+ [設定以使用 Amazon ECS。](get-set-up-for-amazon-ecs.md) 中所述的步驟已完成。
+ 您的 IAM 使用者擁有 [AmazonECS\$1FullAccess](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonECS_FullAccess) IAM 政策範例中指定的所需許可。
+ 您已建立至少一個 VPC 和一個安全群組。如需詳細資訊，請參閱[建立 Virtual Private Cloud](get-set-up-for-amazon-ecs.md#create-a-vpc)。

## 步驟 1：在 中建立服務探索資源 AWS Cloud Map
<a name="create-service-discovery-namespace"></a>

請依照下列步驟建立服務探索命名空間和服務探索服務。

1. 建立私有雲端資源服務探索命名空間。此範例會建立名為 `tutorial` 的命名空間。將 *vpc-abcd1234* 替換為您現有其中一個 VPC 的識別碼。

   ```
   aws servicediscovery create-private-dns-namespace \
         --name tutorial \
         --vpc vpc-abcd1234
   ```

   以下是此命令的輸出：

   ```
   {
       "OperationId": "h2qe3s6dxftvvt7riu6lfy2f6c3jlhf4-je6chs2e"
   }
   ```

1. 使用上一步輸出的 `OperationId`，驗證私有命名空間是否已成功建立。請記下命名空間 ID，因為您在後續命令中使用它。

   ```
   aws servicediscovery get-operation \
         --operation-id h2qe3s6dxftvvt7riu6lfy2f6c3jlhf4-je6chs2e
   ```

   輸出如下。

   ```
   {
       "Operation": {
           "Id": "h2qe3s6dxftvvt7riu6lfy2f6c3jlhf4-je6chs2e",
           "Type": "CREATE_NAMESPACE",
           "Status": "SUCCESS",
           "CreateDate": 1519777852.502,
           "UpdateDate": 1519777856.086,
           "Targets": {
              "NAMESPACE": "ns-uejictsjen2i4eeg"
           }
       }
   }
   ```

1. 使用上一步輸出中的 `NAMESPACE` ID，建立服務探索服務。此範例會建立名為 `myapplication` 的服務。請記下服務 ID 和 ARN，因為您在後續命令中使用它們。

   ```
   aws servicediscovery create-service \
         --name myapplication \
         --dns-config "NamespaceId="ns-uejictsjen2i4eeg",DnsRecords=[{Type="A",TTL="300"}]" \
         --health-check-custom-config FailureThreshold=1
   ```

   輸出如下。

   ```
   {
       "Service": {
          "Id": "srv-utcrh6wavdkggqtk",
           "Arn": "arn:aws:servicediscovery:region:aws_account_id:service/srv-utcrh6wavdkggqtk",
           "Name": "myapplication",
           "DnsConfig": {
               "NamespaceId": "ns-uejictsjen2i4eeg",
               "DnsRecords": [
                   {
                       "Type": "A",
                       "TTL": 300
                   }
               ]
           },
           "HealthCheckCustomConfig": {
               "FailureThreshold": 1
           },
           "CreatorRequestId": "e49a8797-b735-481b-a657-b74d1d6734eb"
       }
   }
   ```

## 步驟 2：建立 Amazon ECS 資源
<a name="create-service-discovery-cluster"></a>

請依照下列步驟建立您的 Amazon ECS 叢集、任務定義和服務。

1. 建立 Amazon ECS 叢集 此範例會建立名稱為 `tutorial` 的叢集。

   ```
   aws ecs create-cluster \
         --cluster-name tutorial
   ```

1. 註冊與 Fargate 相容的任務定義，並使用 `awsvpc` 網路模式。請遵循下列步驟：

   1. 使用以下任務定義的內容，建立名為 `fargate-task.json` 的檔案：

      ```
      {
          "family": "tutorial-task-def",
              "networkMode": "awsvpc",
              "containerDefinitions": [
                  {
                      "name": "sample-app",
                      "image": "public.ecr.aws/docker/library/httpd:2.4",
                      "portMappings": [
                          {
                              "containerPort": 80,
                              "hostPort": 80,
                              "protocol": "tcp"
                          }
                      ],
                      "essential": true,
                      "entryPoint": [
                          "sh",
                          "-c"
                      ],
                      "command": [
                          "/bin/sh -c \"echo '<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> </div></body></html>' >  /usr/local/apache2/htdocs/index.html && httpd-foreground\""
                      ]
                  }
              ],
              "requiresCompatibilities": [
                  "FARGATE"
              ],
              "cpu": "256",
              "memory": "512"
      }
      ```

   1. 使用 `fargate-task.json` 註冊任務定義。

      ```
      aws ecs register-task-definition \
            --cli-input-json file://fargate-task.json
      ```

1. 依照下列步驟建立 ECS 服務：

   1. 使用您要建立的 ECS 服務的內容，建立名為 `ecs-service-discovery.json` 的檔案。此範例使用上個步驟中建立的任務定義。需要 `awsvpcConfiguration`，因為任務定義範例使用 `awsvpc` 網路模式。

      建立 ECS 服務時，請指定 Fargate 以及支援服務探索的 `LATEST` 平台版本。在 AWS Cloud Map 中建立服務探索服務時，`registryArn` 是傳回的 ARN。`securityGroups` 和 `subnets` 必須屬於用來建立 Cloud Map 命名空間的 VPC。您可以從 Amazon VPC 主控台取得安全群組和子網路識別碼。

      ```
      {
          "cluster": "tutorial",
          "serviceName": "ecs-service-discovery",
          "taskDefinition": "tutorial-task-def",
          "serviceRegistries": [
             {
                "registryArn": "arn:aws:servicediscovery:region:aws_account_id:service/srv-utcrh6wavdkggqtk"
             }
          ],
          "launchType": "FARGATE",
          "platformVersion": "LATEST",
          "networkConfiguration": {
             "awsvpcConfiguration": {
                "assignPublicIp": "ENABLED",
                "securityGroups": [ "sg-abcd1234" ],
                "subnets": [ "subnet-abcd1234" ]
             }
          },
          "desiredCount": 1
      }
      ```

   1. 使用 `ecs-service-discovery.json` 建立您的 ECS 服務。

      ```
      aws ecs create-service \
            --cli-input-json file://ecs-service-discovery.json
      ```

## 步驟 3：在 中驗證服務探索 AWS Cloud Map
<a name="create-service-discovery-verify"></a>

您可以查詢服務探索資訊，以確認一切都已正確建立。設定服務探索之後，您可以使用 AWS Cloud Map API 操作，或從 VPC `dig` 中的執行個體呼叫 。請遵循下列步驟：

1. 使用服務探索的服務 ID，來列出服務探索執行個體。請記下執行個體 ID (以粗體標示) 以進行資源清理。

   ```
    aws servicediscovery list-instances \
          --service-id srv-utcrh6wavdkggqtk
   ```

   輸出如下。

   ```
   {
       "Instances": [
           {
               "Id": "16becc26-8558-4af1-9fbd-f81be062a266",
               "Attributes": {
                   "AWS_INSTANCE_IPV4": "172.31.87.2"
                   "AWS_INSTANCE_PORT": "80", 
                   "AVAILABILITY_ZONE": "us-east-1a", 
                   "REGION": "us-east-1", 
                   "ECS_SERVICE_NAME": "ecs-service-discovery", 
                   "ECS_CLUSTER_NAME": "tutorial", 
                   "ECS_TASK_DEFINITION_FAMILY": "tutorial-task-def"
               }
           }
       ]
   }
   ```

1. 使用服務探索命名空間、服務和其他參數如 ECS 叢集名稱，來查詢服務探索執行個體的詳細資訊。

   ```
   aws servicediscovery discover-instances \
         --namespace-name tutorial \
         --service-name myapplication \
         --query-parameters ECS_CLUSTER_NAME=tutorial
   ```

1. 在 Route 53 託管區域為服務探索服務建立的 DNS 記錄，可使用以下 AWS CLI 命令查詢：

   1. 使用命名空間 ID 取得命名空間的相關資訊，其中包括 Route 53 託管區域 ID。

      ```
      aws servicediscovery \
            get-namespace --id ns-uejictsjen2i4eeg
      ```

      輸出如下。

      ```
      {
          "Namespace": {
              "Id": "ns-uejictsjen2i4eeg",
              "Arn": "arn:aws:servicediscovery:region:aws_account_id:namespace/ns-uejictsjen2i4eeg",
              "Name": "tutorial",
              "Type": "DNS_PRIVATE",
              "Properties": {
                   "DnsProperties": {
                      "HostedZoneId": "Z35JQ4ZFDRYPLV"
                  }
              },
              "CreateDate": 1519777852.502,
              "CreatorRequestId": "9049a1d5-25e4-4115-8625-96dbda9a6093"
          }
      }
      ```

   1. 使用上一步中的 Route 53 託管區域 ID (請參閱粗體文字)，取得託管區域的資源紀錄集。

      ```
      aws route53 list-resource-record-sets \
            --hosted-zone-id Z35JQ4ZFDRYPLV
      ```

1. 您還可以使用 `dig` 從您的 VPC 內的執行個體查詢 DNS。

   ```
   dig +short myapplication.tutorial
   ```

## 步驟 4：清理
<a name="create-service-discovery-cleanup"></a>

當您完成此教學課程時，清除相關聯的資源以避免未使用的資源產生費用。請遵循下列步驟：

1. 使用您之前提到的服務 ID 和執行個體 ID，取消註冊服務探索服務執行個體。

   ```
   aws servicediscovery deregister-instance \
         --service-id srv-utcrh6wavdkggqtk \
         --instance-id 16becc26-8558-4af1-9fbd-f81be062a266
   ```

   輸出如下。

   ```
   {
       "OperationId": "xhu73bsertlyffhm3faqi7kumsmx274n-jh0zimzv"
   }
   ```

1. 使用來自上一步輸出的 `OperationId`，請驗證已成功取消註冊服務探索服務。

   ```
   aws servicediscovery get-operation \ 
         --operation-id xhu73bsertlyffhm3faqi7kumsmx274n-jh0zimzv
   ```

   ```
   {
     "Operation": {
           "Id": "xhu73bsertlyffhm3faqi7kumsmx274n-jh0zimzv",
           "Type": "DEREGISTER_INSTANCE",
           "Status": "SUCCESS",
           "CreateDate": 1525984073.707,
           "UpdateDate": 1525984076.426,
           "Targets": {
               "INSTANCE": "16becc26-8558-4af1-9fbd-f81be062a266",
               "ROUTE_53_CHANGE_ID": "C5NSRG1J4I1FH",
               "SERVICE": "srv-utcrh6wavdkggqtk"
           }
       }
   }
   ```

1. 使用服務 ID 刪除服務探索服務。

   ```
   aws servicediscovery delete-service \ 
         --id srv-utcrh6wavdkggqtk
   ```

1. 使用命名空間 ID 刪除服務探索命名空間 。

   ```
   aws servicediscovery delete-namespace \ 
         --id ns-uejictsjen2i4eeg
   ```

   輸出如下。

   ```
   {
       "OperationId": "c3ncqglftesw4ibgj5baz6ktaoh6cg4t-jh0ztysj"
   }
   ```

1. 使用上一步輸出的 `OperationId`，確認服務探索命名空間已成功刪除。

   ```
   aws servicediscovery get-operation \ 
         --operation-id c3ncqglftesw4ibgj5baz6ktaoh6cg4t-jh0ztysj
   ```

   輸出如下。

   ```
   {
       "Operation": {
           "Id": "c3ncqglftesw4ibgj5baz6ktaoh6cg4t-jh0ztysj",
           "Type": "DELETE_NAMESPACE",
           "Status": "SUCCESS",
           "CreateDate": 1525984602.211,
           "UpdateDate": 1525984602.558,
           "Targets": {
               "NAMESPACE": "ns-rymlehshst7hhukh",
               "ROUTE_53_CHANGE_ID": "CJP2A2M86XW3O"
           }
       }
   }
   ```

1. 將 Amazon ECS 服務所需的計數更新為 `0`。您必須執行此操作，才能在後續步驟中刪除服務。

   ```
   aws ecs update-service \
         --cluster tutorial \
         --service ecs-service-discovery \
         --desired-count 0
   ```

1. 刪除 Amazon ECS 服務：

   ```
   aws ecs delete-service \
         --cluster tutorial \
         --service ecs-service-discovery
   ```

1. 刪除 Amazon ECS 叢集：

   ```
   aws ecs delete-cluster \
         --cluster tutorial
   ```

# 使用 Amazon VPC Lattice 連接、觀察和保護您的 Amazon ECS 服務
<a name="ecs-vpc-lattice"></a>

Amazon VPC Lattice 是一種全受管應用程式聯網服務，可讓 Amazon ECS 客戶觀察、保護和監控跨 AWS 運算服務、VPCs 和帳戶建置的應用程式，而無需進行任何程式碼變更。

VPC Lattice 使用目標群組，這是運算資源的集合。這些目標會執行您的應用程式或服務，可以是 Amazon EC2 執行個體、IP 地址、Lambda 函數和 Application Load Balancer。透過將其 Amazon ECS 服務與 VPC Lattice 目標群組建立關聯，客戶現在可以在 VPC Lattice 中將 Amazon ECS 任務啟用為 IP 目標。當已註冊服務的任務啟動時，Amazon ECS 會自動將任務註冊到 VPC Lattice 目標群組。

**注意**  
使用五個 VPC Lattice 組態時，部署時間可能會比使用較少組態時稍長。

接聽程式規則用於在符合條件時將流量轉送至指定目標群組。接聽程式会使用所設定之連接埠上的通訊協定來檢查連線請求。服務會根據您在設定接聽程式時定義的規則，將請求路由至其已註冊目標。

Amazon ECS 还會根據 VPC Lattice 運作狀態檢查，自動取代運作狀態不良的任務。一旦與 VPC Lattice 相關聯，Amazon ECS 客戶也可以利用 VPC Lattice 中的許多其他跨運算連線、安全性和可觀測性功能，例如跨叢集、VPCs 和帳戶連線至服務 AWS Resource Access Manager、授權和身分驗證的 IAM 整合，以及進階流量管理功能。

Amazon ECS 客戶可以透過下列方式受益於 VPC Lattice。
+ 提高開發人員生產力 – VPC Lattice 可讓您專注於建置功能，同時由 VPC Lattice 以統一的方式處理所有運算平台上的聯網、安全性與可觀測性挑戰，從而提高開發人員生產力。
+ 強化安全狀態 – VPC Lattice 可讓開發人員輕鬆驗證與保護跨應用程式與運算平台的通訊、強制執行傳輸中加密，並透過 VPC Lattice 驗證政策套用精細存取控制。這可以強化安全狀態，以滿足業界領先的法規與合規需求。
+ 改善應用程式可擴展性與恢復能力 – VPC Lattice 可讓您建立已部署應用程式的網路，並提供以路徑為基礎的路由、以標頭為基礎的路由與以方法為基礎的路由、身分驗證、授權與監控等功能。這些優勢不會對工作負載造成資源負荷，並且可以支援每秒產生數百萬個請求的多叢集部署，而不會增加明顯的延遲。
+ 異質基礎結構的部署彈性 – VPC Lattice 在所有運算服務中提供一致的功能，例如 Amazon ECS、Fargate、Amazon EC2、Amazon EKS 與 Lambda，便於組織彈性地為每個應用程式選擇合適的基礎結構。

## VPC Lattice 如何搭配 Amazon ECS 服務運作
<a name="ecs-lattice-compatibility"></a>

搭配 Amazon ECS 使用 VPC Lattice 時，某些 Amazon ECS 服務的使用方式可能會變更，而某些服務則會保持不變。

**Application Load Balancer**  
您不再需要建立特定的 Application Load Balancer，以用於 VPC Lattice 中的 Application Load Balancer 目標群組類型，然後再連結至 Amazon ECS 服務。只需將 Amazon ECS 服務設定為使用 VPC Lattice 目標群組即可。您也可以選擇同時搭配 Amazon ECS 使用 Application Load Balancer。

**Amazon ECS 滾動部署**  
只有 Amazon ECS 滾動部署能搭配 VPC Lattice 運作，並且 Amazon ECS 會在部署期間安全地將任務引入服務和從服務中移除。不支援 CodeDeploy 與藍/綠部署。

若要進一步了解 VPC Lattice，請參閱 [Amazon VPC Lattice User Guide](https://docs.aws.amazon.com/vpc-lattice/latest/ug/what-is-vpc-lattice.html)。

# 建立使用 VPC Lattice 的服務
<a name="ecs-vpc-lattice-create-service"></a>

您可以使用 AWS 管理主控台 或 AWS CLI 來建立具有 VPC Lattice 的服務。

## 先決條件
<a name="create-ecs-vpc-lattice-prereqs"></a>

在您開始教學課程之前，請務必先達成以下先決條件：
+  AWS CLI 已安裝並設定最新版本的 。如需詳細資訊，請參閱[安裝 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)。
**注意**  
您可以使用雙堆疊服務端點，透過 IPv4 和 IPv6 AWS CLI從 、 SDKs 和 Amazon ECS API 與 Amazon ECS 互動。如需詳細資訊，請參閱[使用 Amazon ECS 雙堆疊端點](dual-stack-endpoint.md)。
+ [設定以使用 Amazon ECS。](get-set-up-for-amazon-ecs.md) 中所述的步驟已完成。
+ 您的 IAM 使用者擁有 [AmazonECS\$1FullAccess](security-iam-awsmanpol.md#security-iam-awsmanpol-AmazonECS_FullAccess) IAM 政策範例中指定的所需許可。

## 建立搭配 使用 VPC Lattice 的服務 AWS 管理主控台
<a name="ecs-lattice-create-console"></a>

請遵循下列步驟，透過 AWS 管理主控台建立使用 VPC Lattice 的服務。

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

1. 在導覽頁面中，選擇**叢集**)。

1. 在**叢集**頁面上，選擇要建立服務的叢集。

1. 在 **Services** (服務) 索引標籤上，選擇 **Create** (建立)。

   如果您之前從未建立服務，請遵循[使用主控台建立 Amazon ECS 服務](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-service-console-v2.html)中的步驟，然後在到達 VPC Lattice 區段時繼續執行這些步驟。

1. 勾選按鈕以選擇**開啟 VPC Lattice**。

1. 若要使用現有角色，請在 **Amazon ECS 的 ECS 基礎結構角色**欄位中，選擇一個已建立的角色，以便在建立 VPC Lattice 目標群組時使用。若要建立新角色，請**建立 ECS 基礎結構角色**。

1. 選擇 **VPC**。

   **VPC** 取決於您在註冊任務定義時選取的聯網模式。如果您搭配 EC2 使用 `host` 或 `network` 模式，請選擇 VPC。

   對於 `awsvpc` 模式，系統會根據您在**聯網**下選擇的 VPC 自動選取 VPC，且無法變更。

1. 在**目標群組**下，選擇一個或多個目標群組。您需要選擇至少一個目標群組，最多可以選擇五個。選擇**新增目標群組**以新增額外的目標群組。針對選擇的每個目標群組，選擇**連接埠名稱**、**通訊協定**與**連接埠**。若要刪除目標群組，請選擇**移除**。
**注意**  
若要新增現有的目標群組，需要使用 AWS CLI。如需如何使用 新增目標群組的說明 AWS CLI，請參閱《 * AWS Command Line Interface 參考*》中的 [register-targets](https://docs.aws.amazon.com/cli/latest/reference/vpc-lattice/register-targets.html)。
雖然 VPC Lattice 服務可以有多個目標群組，但每個目標群組只能新增至一項服務。
若要在純 IPv6 組態中建立服務，請選擇 IP 位址類型為 `IPv6` 的目標群組。

1. 此時，您會導覽至 VPC Lattice 主控台以繼續設定。在這裡，您可以將新的目標群組加入接聽程式的預設動作或現有 VPC Lattice 服務的規則中。

   如需詳細資訊，請參閱 [VPC Lattice 服務的接聽程式規則](https://docs.aws.amazon.com/vpc-lattice/latest/ug/listener-rules.html)。

**重要**  
您需要允許安全群組或任務使用傳入規則 `vpc-lattice` 字首，否則運作狀態檢查可能會失敗。

## 建立搭配 使用 VPC Lattice 的服務 AWS CLI
<a name="ecs-lattice-create-cli"></a>

使用 AWS CLI 建立具有 VPC Lattice 的服務。將每個*使用者輸入預留位置*替換為自己的資訊。

1. 建立目標群組組態檔案。下列範例名為 `tg-config.json`

   ```
   {
       "ipAddressType": "IPV4",
       "port": 443,
       "protocol": "HTTPS",
       "protocolVersion": "HTTP1",
       "vpcIdentifier": "vpc-f1663d9868EXAMPLE"
   }
   ```

1. 使用下列命令來建立 VPC Lattice 目標群組。

   ```
   aws vpc-lattice create-target-group \
       --name my-lattice-target-group-ip \
       --type IP \
       --config file://tg-config.json
   ```
**注意**  
若要在純 IPv6 組態中建立服務，請建立 IP 位址類型為 `IPv6` 的目標群組。如需詳細資訊，請參閱 *AWS CLI Command Reference* 中的 [create-target-group](https://docs.aws.amazon.com/cli/latest/reference/vpc-lattice/create-target-group.html)。

   輸出範例：

   ```
   {
       "arn": "arn:aws:vpc-lattice:us-east-2:123456789012:targetgroup/tg-0eaa4b9ab4EXAMPLE",
       "config": {
           "healthCheck": {
               "enabled": true,
               "healthCheckIntervalSeconds": 30,
               "healthCheckTimeoutSeconds": 5,
               "healthyThresholdCount": 5,
               "matcher": {
                   "httpCode": "200"
               },
               "path": "/",
               "protocol": "HTTPS",
               "protocolVersion": "HTTP1",
               "unhealthyThresholdCount": 2
           },
           "ipAddressType": "IPV4",
           "port": 443,
           "protocol": "HTTPS",
           "protocolVersion": "HTTP1",
           "vpcIdentifier": "vpc-f1663d9868EXAMPLE"
       },
       "id": "tg-0eaa4b9ab4EXAMPLE",
       "name": "my-lattice-target-group-ip",
       "status": "CREATE_IN_PROGRESS",
       "type": "IP"
   }
   ```

1. 下列名為 *ecs-service-vpc-lattice.json* 的 JSON 檔案是一個範例，用來將 Amazon ECS 服務連接至 VPC Lattice 目標群組。以下範例中的 `portName` 與您在任務定義的 `portMappings` 屬性的 `name` 欄位中定義的名稱相同。

   ```
   {
       "serviceName": "ecs-service-vpc-lattice",
       "taskDefinition": "ecs-task-def",
           "vpcLatticeConfigurations": [
           {
               "targetGroupArn": "arn:aws:vpc-lattice:us-west-2:123456789012:targetgroup/tg-0eaa4b9ab4EXAMPLE",
               "portName": "testvpclattice",
               "roleArn": "arn:aws:iam::123456789012:role/ecsInfrastructureRoleVpcLattice"
           }
       ],
       "desiredCount": 5,
       "role": "ecsServiceRole"
   }
   ```

   使用下列命令建立 Amazon ECS 服務，並使用上述 JSON 範例將其連接至 VPC Lattice 目標群組。

   ```
   aws ecs create-service \
       --cluster clusterName \
       --serviceName ecs-service-vpc-lattice \
       --cli-input-json file://ecs-service-vpc-lattice.json
   ```

**注意**  
Amazon ECS Anywhere 不支援 VPC Lattice。