

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

# 更新 Amazon ECS 服務參數
<a name="update-service-parameters"></a>

建立服務之後，有時可能需要更新服務參數，例如任務數量。

服務排程器啟動新任務時，會使用下列邏輯來決定叢集中的任務置放。
+ 決定叢集中的哪些容器執行個體可以支援服務的任務定義。例如，它們具有所需的 CPU、記憶體、連接埠與容器執行個體屬性。
+ 依預設，服務排程器會嘗試以這種方式平衡可用區域間的任務，即使您可以選擇不同的置放策略。
  + 在執行個體所在可用區域中，依此服務的執行中任務數量下限，對有效容器執行個體進行排序。例如，如果區域 A 有一項執行中的服務任務，而區域 B 和 C 都沒有，則最適合置放的即為區域 B 或 C 中的有效容器執行個體。
  + 將新的服務任務放置在最佳可用區域的有效容器執行個體 (根據先前的步驟)，且偏好此服務中的執行中任務數量最少的容器執行個體。

當服務排程器停止執行中的任務時，會嘗試使用下列邏輯維護叢集中可用區域間的平衡：
+ 在執行個體所在可用區域中，依此服務的執行中任務數量上限，對容器執行個體進行排序。例如，如果區域 A 有一項執行中的服務任務，而區域 B 和 C 各有兩項，則最適合終止的即為區域 B 或 C 中的容器執行個體。
+ 停止最佳可用區域之容器執行個體中的任務 (根據先前的步驟)，且偏好此服務之執行中任務數量最多的容器執行個體。

使用下列清單來判斷您是否可以變更服務參數。

**可用區域重新平衡**  
指出服務是否使用可用區域重新平衡。  
您可以針對滾動部署變更此參數。

**容量提供者策略**  
容量提供者策略的詳細資料。您可以在建立叢集、執行任務或更新服務時設定容量提供者。  
使用 Fargate 時，容量提供者為 `FARGATE` 或 `FARGATE_SPOT`。  
使用 Amazon EC2 時，容量提供者為 Auto Scaling 群組。  
可以針對滾動部署與藍/綠部署變更容量提供者。  
下列清單可提供有效的轉換：  
+ 將 Fargate 更新為 Auto Scaling 群組容量提供者。
+ 將 EC2 更新為 Fargate 容量提供者。
+ 將 Fargate 容量提供者更新為 Auto Scaling 群組容量提供者。
+ 將 Amazon EC2 容量提供者更新為 Fargate 容量提供者。
+ 將 Auto Scaling 群組或 Fargate 容量提供者更新回啟動類型。使用 CLI 或 API 時，需要在 `capacityProviderStrategy` 參數中傳遞空白清單。

**叢集**  
無法變更叢集名稱。

**Deployment configuration (部署組態)**  
部署組態包括用於偵測失敗的 CloudWatch 警示與斷路器，以及所需的組態。  
如果服務無法達到穩定狀態，部署斷路器會確定服務部署是否會失敗。如果使用部署斷路器，服務部署會轉換為失敗狀態並停止啟動新任務。如果使用復原選項，當服務部署失敗後，服務會復原至上一次成功完成的部署。  
更新使用 Amazon ECS 斷路器的服務時，Amazon ECS 會建立服務部署與服務修訂版。這些資源可用於檢視服務歷史記錄的詳細資訊。如需詳細資訊，請參閱[使用 Amazon ECS 服務部署檢視服務歷史記錄](service-deployment.md)。  
服務排程器 (在服務的部署組態中) 使用運作狀態百分比下限和百分比上限參數，決定部署策略。  
如果服務使用滾動更新 (`ECS`) 部署類型，則**運作狀態百分比下限**代表部署期間，服務中必須保持在 `RUNNING` 狀態的任務數量下限，以所需任務數量百分比表示 (無條件進位到最接近的整數)。如果服務包含使用 EC2 的任務，即使有任何容器執行個體處於 `DRAINING` 狀態，此參數也適用。使用此參數進行部署，無須使用額外的叢集容量。例如，如果您的服務所需任務數量為四項，且運作狀態百分比下限為 50%，則排程器可先停止兩項現有的任務以釋出叢集容量，再啟動兩項新的任務。對於未使用負載平衡器的服務，如果任務處於 `RUNNING` 狀態，則服務會將任務視為運作狀態良好。對於使用負載平衡器的服務，如果任務處於 `RUNNING` 狀態且負載平衡器也回報為運作狀態良好，則服務會將任務視為運作狀態良好。運作狀態百分比下限的預設值為 100%。  
如果服務使用滾動更新 (`ECS`) 部署類型，則**百分比上限**參數代表在部署期間，服務中允許處於 `PENDING`、`RUNNING` 或 `STOPPING` 狀態的任務數量上限，以所需任務數量百分比表示 (無條件捨去到最接近的整數)。如果服務包含使用 EC2 的任務，即使有任何容器執行個體處於 `DRAINING` 狀態，此參數也適用。使用此參數來定義部署批次大小。例如，如果您的服務有所需的四個任務數目及百分比上限值 200%，則排程器可先啟動四項新任務，再停止四項舊任務。前提是有執行此操作所需的叢集資源。百分比上限的預設值為 200%。  
當服務排程器於更新期間取代任務時，服務會先從負載平衡器 (如果使用) 移除任務，並等待連線耗盡。然後，對任務中執行的容器發出相當於 **docker stop** 的命令。這會造成 `SIGTERM` 信號和 30 秒逾時，並在之後傳送 `SIGKILL`，強制停止容器。如果容器在接收到 `SIGTERM` 信號後於 30 秒內從容處理完畢並結束，就不會傳送任何 `SIGKILL` 信號。服務排程器依據您定義的運作狀態百分比下限和百分比上限設定，啟動和停止任務。  
在容器運作狀態檢查或負載平衡器目標群組運作狀態檢查失敗後，服務排程器也會取代判定為狀況不佳的任務。此取代取決於 `maximumPercent` 和 `desiredCount` 服務定義參數。如果任務標記為運作狀態不佳，服務排程器會先啟動替代任務。然後會發生下列情況。  
+ 如果替代任務的運作狀態為 `HEALTHY`，服務排程器會停止運作狀態不良的任務
+ 如果替代任務的運作狀態為 `UNHEALTHY`，排程器會停止運作狀態不佳的替代任務或現有運作狀態不佳的任務，以使任務總計數等於 `desiredCount`。
如果 `maximumPercent` 參數限制排程器先啟動替代任務，排程器會隨機停止運作狀態不佳的任務，以釋放容量，然後啟動替代任務。開始和停止程序會繼續進行，直到所有運作狀態不佳的任務都會取代為運作狀態良好的 一旦已取代了所有運作狀態不佳的任務，而且只執行運作狀態良好的任務，如果任務總數超過 `desiredCount`，則運作良好的任務會隨機停止，直到任務總計數等於 `desiredCount` 為止。如需有關 `maximumPercent` 和 `desiredCount` 的詳細資訊，請參閱[服務定義參數](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service_definition_parameters.html)。

**部署控制器**  
用於服務的部署控制器。部署控制器有三種類型：  
+ `ECS`
+ `EXTERNAL`
+ `CODE_DEPLOY`
更新服務時，可以更新其使用的部署控制器。下列清單可提供有效的轉換：  
+ 將 CodeDeploy 藍/綠部署 (`CODE_DEPLOY`) 更新為 ECS 滾動部署或藍/綠部署 (`ECS`)。
+ 將 CodeDeploy 藍/綠部署 (`CODE_DEPLOY`) 更新為外部部署 (`EXTERNAL`)。
+ 將 ECS 滾動部署或藍/綠部署 (`ECS`) 更新為外部部署 (`EXTERNAL`)。
+ 將外部部署 (`EXTERNAL`) 更新為 ECS 滾動部署或藍/綠部署 (`ECS`)。
更新服務的部署控制器時，請考量下列事項：  
+ 如果服務使用 VPC Lattice 或 Amazon ECS Service Connect，則無法將服務的部署控制器從 `ECS` 部署控制器更新為任何其他控制器。
+ 在正在進行的服務部署期間，無法更新服務的部署控制器。
+ 如果服務上沒有負載平衡器，則無法將服務的部署控制器更新為 `CODE_DEPLOY`。
+ 如果 `deploymentConfiguration` 包含警示、部署斷路器或 `BLUE_GREEN` 部署策略，則無法將服務的部署控制器從 `ECS` 更新為任何其他控制器。如需詳細資訊，請參閱[Amazon ECS 服務部署控制器與策略](ecs_service-options.md)。
+ 如果您將服務的部署控制器從 `ECS` 更新為任何其他控制器，Amazon ECS 將不會使用您在容器定義中為 `versionConsistency` 指定的值。
+ 如果您將服務的部署控制器從 `ECS` 更新為任何其他控制器，`UpdateService` 與 `DescribeService` API 回應仍將傳回 `deployments` 而不是 `taskSets`。如需有關 `UpdateService` 與 `CreateService` 的詳細資訊，請參閱 *Amazon ECS API Reference* 中的 [UpdateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_Service.html) 與 [CreateService](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_Service.html)。
+ 如果服務使用滾動更新部署策略，將部署控制器從 `ECS` 更新為任何其他控制器會變更 `deploymentConfiguration` 中 `maximumPercent` 值的使用方式。`maximumPercent` 不僅僅用作滾動更新部署中的總任務數量上限，還用於取代運作狀態不良的任務。如需有關排程器如何取代運作狀態不良任務的詳細資訊，請參閱 [Amazon ECS 服務](ecs_services.md)。
+ 如果您將服務的部署控制器從 `ECS` 更新為任何其他部署控制器，則系統會忽略使用負載平衡器組態指定的任何 `advancedConfiguration`。如需詳細資訊，請參閱 *Amazon ECS API reference* 中的 [LoadBalancer](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_LoadBalancer.html) 與 [AdvancedConfiguration](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_AdvancedConfiguration.html)。
使用 CloudFormation 更新服務的部署控制器時，請根據正在執行的遷移類型，考量下列事項。  
+ 如果 CloudFormation 範本包含 `EXTERNAL` 部署控制器資訊以及 `TaskSet` 與 `PrimaryTaskSet` 資源，並且在從 `EXTERNAL` 更新為 `ECS` 時從範本中移除任務集資源，則在部署控制器更新為 `ECS` 後，`DescribeTaskSet` 與 `DeleteTaskSet` API 呼叫會傳回 400 錯誤。這會導致 CloudFormation 刪除任務集資源失敗，即使 CloudFormation 堆疊轉換為 `UPDATE_COMPLETE` 狀態，也是如此。如需詳細資訊，請參閱 AWS CloudFormation User Guide 中的 [Resource removed from stack but not deleted](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/troubleshooting.html#troubleshooting-errors-resource-removed-not-deleted)。若要修正此問題，請使用 Amazon ECS `DeleteTaskSet` API 直接刪除任務集。如需有關如何刪除任務集的詳細資訊，請參閱 *Amazon Elastic Container Service* *API Reference* 中的 [DeleteTaskSet](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DeleteTaskSet.html)。
+ 如果要從 `CODE_DEPLOY` 遷移至 `ECS` 並使用新的任務定義，且 CloudFormation 執行復原操作，則 Amazon ECS `UpdateService` 請求會失敗，並顯示下列錯誤：

  ```
  Resource handler returned message: "Invalid request provided: Unable to update 
  task definition on services with a CODE_DEPLOY deployment controller. Use AWS 
  CodeDeploy to trigger a new deployment. (Service: Ecs, Status Code: 400, 
  Request ID: 0abda1e2-f7b3-4e96-b6e9-c8bc585181ac) (SDK Attempt Count: 1)" 
  (RequestToken: ba8767eb-c99e-efed-6ec8-25011d9473f0, HandlerErrorCode: InvalidRequest)
  ```
+ 從 `ECS` 成功遷移至 `EXTERNAL` 部署控制器後，需要手動移除 `ACTIVE` 任務集，因為 Amazon ECS 不再管理該部署。如需有關如何刪除任務集的資訊，請參閱 Amazon Elastic Container Service *API Reference* 中的 [DeleteTaskSet](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DeleteTaskSet.html)。

**所需的任務計數**  
要在服務中置放並保持執行的任務執行個體數量。  
若要暫時停止服務，請將此值設定為 0。然後，當您準備好啟動服務時，請使用原始值更新服務。  
可以針對滾動部署與藍/綠部署變更此參數。

**啟用受管標籤**  
決定是否為服務中的任務啟用 Amazon ECS 受管標籤。  
只有更新後啟動的任務才會反映更新。若要更新所有任務上的標籤，請使用強制部署選項。  
可以針對滾動部署與藍/綠部署變更此參數。

**啟用 ECS Exec**  
決定是否使用 Amazon ECS Exec。  
如果不想覆寫建立服務時設定的值，可以在執行此動作時將此值設定為 null。  
您可以針對滾動部署變更此參數。

**運作狀態檢查寬限期**  
所謂寬限期是指 Amazon ECS 服務排程器在任務首次啟動後，會在這段期間內 (以秒為單位) 忽略運作狀態不良的 Elastic Load Balancing、VPC Lattice 與容器運作狀態檢查。如果您未指定運作狀態檢查寬限期值，則會使用預設值 `0`。如果未使用任何運作狀態檢查，`healthCheckGracePeriodSeconds` 會處於未使用狀態。  
若服務的任務需要一些時間來啟動及回應運作狀態檢查，您可以指定運作狀態檢查的寬限期，最長為 2,147,483,647 秒 (約 69 年)。在此期間，Amazon ECS 服務排程器會忽略運作狀態檢查情形。此寬限期可防止服務排程器將任務標示為狀況不良並在其來得及標示前加以停止。  
可以針對滾動部署與藍/綠部署變更此參數。

**負載平衡器**  
更新負載平衡器時，必須使用服務連結角色。  
Elastic Load Balancing 負載平衡器物件的清單。該清單包含負載平衡器名稱、容器名稱，以及要從負載平衡器存取的容器連接埠。容器名稱是在容器定義中顯示的名稱。  
Amazon ECS 不會自動更新與 Elastic Load Balancing 負載平衡器或 Amazon ECS 容器執行個體相關聯的安全群組。  
當您新增、更新或移除負載平衡器組態時，Amazon ECS 會使用更新後的 Elastic Load Balancing 組態啟動新任務，然後在新任務執行時停止舊任務。  
對於使用滾動更新的服務，可以新增、更新或移除 Elastic Load Balancing 目標群組。您可以從單一目標群組更新為多個目標群組，也可以從多個目標群組更新為單一目標群組。  
對於使用藍/綠部署的服務，可以透過 CodeDeploy 使用 `[CreateDeployment](https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_CreateDeployment.html)` 來更新 Elastic Load Balancing 目標群組。請注意，藍/綠部署不支援多個目標群組。如需詳細資訊，請參閱[向服務註冊多個目標群組](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/register-multiple-targetgroups.html)。  
對於使用外部部署控制器的服務，可以使用 [CreateTaskSet](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateTaskSet.html) 來新增、更新或移除負載平衡器。請注意，外部部署不支援多個目標群組。如需詳細資訊，請參閱[向服務註冊多個目標群組](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/register-multiple-targetgroups.html)。  
傳遞空白清單以移除負載平衡器。  
您可以針對滾動部署變更此參數。

**網路組態**  
服務網路組態。  
您可以針對滾動部署變更此參數。

**置放限制條件**  
要更新服務以使用的任務置放限制條件物件陣列。如果未指定任何值，則服務的現有置放限制條件將保持不變。如果指定此值，則會覆寫為服務定義的任何現有置放限制條件。若要移除所有現有的置放限制條件，請指定空陣列。  
您最多可以為每項任務指定 10 項限制條件。此限制包含任務定義中的限制條件以及執行時間指定的限制條件。  
可以針對滾動部署與藍/綠部署變更此參數。

**置放策略**  
要更新服務以使用的任務置放策略物件。如果未指定任何值，則服務的現有置放策略將保持不變。如果指定此值，則會覆寫為服務定義的現有置放策略。若要移除現有的置放策略，請指定空白物件。  
可以針對滾動部署與藍/綠部署變更此參數。

**平台版本**  
服務執行所在的 Fargate 平台版本。  
使用 Linux 平台版本的服務無法更新為使用 Windows 平台版本，反之亦然。  
您可以針對滾動部署變更此參數。

**傳播標籤**  
決定是否將標籤從任務定義或服務傳播到任務。如果沒有指定值，則不會傳播標籤。  
只有更新後啟動的任務才會反映更新。若要更新所有任務上的標籤，請將 `forceNewDeployment` 設定為 `true`，以便 Amazon ECS 使用更新後的標籤啟動新任務。  
可以針對滾動部署與藍/綠部署變更此參數。

**Service Connect 組態**  
Amazon ECS Service Connect 的組態。此參數可決定服務如何連線至應用程式中的其他服務。  
您可以針對滾動部署變更此參數。

**服務登錄檔**  
更新服務登錄檔時，必須使用服務連結角色。  
要指派給此服務的服務探索登錄檔的詳細資訊。如需詳細資訊，請參閱[服務探索](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html)。  
當您新增、更新或移除服務登錄檔組態時，Amazon ECS 會使用更新後的服務登錄檔組態啟動新任務，然後在新任務執行時停止舊任務。  
傳遞空白清單以移除服務登錄檔。  
您可以針對滾動部署變更此參數。

**任務定義**  
用於服務的任務定義與修訂版。  
如果變更任務定義中容器使用的連接埠，則可能需要更新容器執行個體的安全群組，才能使用更新後的連接埠。  
如果您為服務更新任務定義，則在負載平衡器組態中指定的容器名稱和容器連接埠必須保留在任務定義中。  
容器映像提取行為會因運算選項而有所不同。如需詳細資訊，請參閱下列其中一個項目：  
+ [為 Amazon ECS 規劃 AWS Fargate 架構](AWS_Fargate.md)
+ [為 Amazon ECS 規劃 EC2 容量架構](launch-type-ec2.md)
+ [Amazon ECS 的外部執行個體 (Amazon ECS Anywhere)](launch-type-external.md)
您可以針對滾動部署變更此參數。

**磁碟區組態**  
磁碟區的詳細資訊，即 `configuredAtLaunch`。將任務定義中的 `configuredAtLaunch` 設定為 `true` 時，此服務參數會為服務中的每項任務設定一個 Amazon EBS 磁碟區，以便在部署期間建立與連接。您可以在 [ServiceManagedEBSVolumeConfiguration](https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ServiceManagedEBSVolumeConfiguration.html) 中設定大小、volumeType、IOPS、輸送量、快照與加密。磁碟區的 `name` 必須與任務定義中的 `name` 相符。如果設定為 null，則不會觸發新的部署。否則，如果此組態與現有組態不同，則會觸發新的部署。  
您可以針對滾動部署變更此參數。

**VPC Lattice 組態**  
服務的 VPC Lattice 組態。這會定義服務如何與 VPC Lattice 整合以進行服務間通訊。  
您可以針對滾動部署變更此參數。

## AWS CDK 考量事項
<a name="cdk-considerations"></a>

 AWS CDK 不會追蹤資源狀態。它不知道您是在建立服務還是更新服務。客戶應使用逃生艙直接存取 ecs `Service` L1 建構模組。

如需逃生艙的相關資訊，請參閱《 *AWS Cloud Development Kit (AWS CDK) v2 開發人員指南*》中的[從 AWS 建構程式庫自訂建構](https://docs.aws.amazon.com/cdk/v2/guide/cfn-layer.html#develop-customize-escape)。

若要將現有服務遷移至 `ecs.Service` 建構模組，請執行下列動作：

1. 使用逃生艙存取 `Service` L1 建構模組。

1. 在 `Service` L1 建構模組中手動設定下列屬性。

   如果服務使用 Amazon EC2 容量：
   + `daemon?`
   + `placementConstraints?`
   + `placementStrategies?`
   + 如果使用 `awsvpc` 網路模式，則需要設定 `vpcSubnets?` 與 `securityGroups?` 建構模組。

   如果服務使用 Fargate：
   + `FargatePlatformVersion`
   + `vpcSubnets?` 與 `securityGroups?` 建構。

1. 按如下方式設定 `launchType`：

   ```
   const cfnEcsService = service.node.findChild('Service') as ecs.CfnService;
   cfnEcsService.launchType = "FARGATE";
   ```

若要從啟動類型遷移至容量提供者，請執行下列動作：

1. 使用逃生艙存取 `Service` L1 建構模組。

1. 新增 `capacityProviderStrategies?` 建構模組。

1. 部署服務。