

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

# 使用第三方控制器部署 Amazon ECS 服務
<a name="deployment-type-external"></a>

*外部*部署類型可讓您使用任何第三方部署控制器，以完全控制 Amazon ECS 服務的部署程序。服務的詳細資訊是由服務管理 API 動作 (`CreateService`、`UpdateService` 和 `DeleteService`) 或任務設定管理 API 動作 (`CreateTaskSet`、`UpdateTaskSet`、`UpdateServicePrimaryTaskSet` 和 `DeleteTaskSet`) 所管理。每個 API 動作會管理服務定義參數的子集。

`UpdateService` API 動作更新服務的所需計數和運作狀態檢查寬限期參數。如果需要更新運算選項、平台版本、負載平衡器詳細資訊、網路組態或任務定義，必須建立新的任務集。

`UpdateTaskSet` API 動作只更新任務集的擴展參數。

`UpdateServicePrimaryTaskSet` API 動作修改服務中哪個任務集是主要任務集。當您呼叫 `DescribeServices` API 動作時，它會傳回主要任務集指定的所有欄位。如果更新服務的主要任務集，當定義新的主要任務時，存在於新主要任務集的任何任務集參數值 (不同於服務中的舊主要任務集) 將會更新為新的值。如果沒有為服務定義主要任務集，則描述服務時，任務集欄位是 null。

## 外部部署考量
<a name="deployment-type-external-considerations"></a>

使用外部部署類型時，請考慮下列各項：
+ 支援的負載平衡器類型可為 Application Load Balancer 或 Network Load Balancer。
+ Fargate 或 `EXTERNAL` 部署控制器類型不支援 `DAEMON` 排程策略。
+ 應用程式自動擴展功能與 Amazon ECS 的整合僅支援將 Amazon ECS 服務作為目標。Amazon ECS 支援的可擴展維度為 `ecs:service:DesiredCount` (Amazon ECS 服務的任務計數)。應用程式自動擴展功能與 Amazon ECS 任務集之間沒有直接整合。Amazon ECS 任務集會根據 Amazon ECS 服務的 `DesiredCount` 計算 `ComputedDesiredCount`。

## 外部部署工作流程
<a name="deployment-type-external-workflow"></a>

下列是在 Amazon ECS 上管理外部部署的基本工作流程。

**使用外部部署控制器管理 Amazon ECS 服務**

1. 建立 Amazon ECS 服務。唯一的必要參數是服務名稱。使用外部部署控制器建立服務時，您可以指定以下參數。在服務內建立任務集時，指定所有其他服務參數。  
`serviceName`  
類型：字串  
必要：是  
您的服務名稱。最多允許 255 個字母 （大寫和小寫）、數字、連字號和底線。叢集中不得有相同的服務名稱，但一個區域內或多個區域間的多個叢集中可以有類似的服務名稱。  
`desiredCount`  
指定的任務集任務定義的執行個體化數量，將放在服務內保持執行。  
`deploymentConfiguration`  
選用的部署參數，可控制在部署期間執行多少任務以及停止和啟動任務的順序。  
`tags`  
類型： 物件陣列  
必要：否  
您套用到服務以協助您分類和組織的中繼資料。每個標籤皆包含由您定義的一個金鑰與一個選用值。刪除服務時，也會一併刪除標籤。服務最多可套用 50 個標籤。如需詳細資訊，請參閱[標記 Amazon ECS 資源](ecs-using-tags.md)。  
更新服務時，此參數不會觸發新的服務部署。    
`key`  
類型：字串  
長度限制：長度下限為 1。長度上限為 128。  
必要：否  
組成標籤的鍵值組的一部分。索引鍵是一般標籤，作用就像更特定標籤值的類別。  
`value`  
類型：字串  
長度限制：長度下限為 0。長度上限為 256。  
必要：否  
組成標籤的鍵值組的選用部分。值就像標籤類別 (索引鍵) 內的描述項。  
`enableECSManagedTags`  
指定是否對服務內的使用 Amazon ECS 受管標籤。如需詳細資訊，請參閱[將標籤用於計費](ecs-using-tags.md#tag-resources-for-billing)。  
`propagateTags`  
類型：字串  
有效值：`TASK_DEFINITION` \$1 `SERVICE`  
必要：否  
指定是否將標籤從任務定義或服務複製到服務中的任務。如果沒有指定值，則不會複製標籤。標籤只能在建立服務期間複製到服務內的任務。若要在建立服務或任務後對任務新增標籤，請使用 `TagResource` API 動作。  
更新服務時，此參數不會觸發新的服務部署。  
`schedulingStrategy`  
使用的排程策略。使用外部部署控制器的服務僅支援 `REPLICA` 排程策略。  
`placementConstraints`  
您服務的任務要使用的置放限制物件陣列。每項任務您最多可以指定 10 項限制 (此限制包含任務定義中的限制以及執行時間指定的限制)。若使用的是 Fargate，則不支援任務置放限制條件。  
`placementStrategy`  
您服務的任務要使用的置放策略物件。每項服務您最多可以指定四項策略規則。

   以下是使用外部部署控制器建立服務的服務定義範例。

   ```
   {
       "cluster": "",
       "serviceName": "",
       "desiredCount": 0,
       "role": "",
       "deploymentConfiguration": {
           "maximumPercent": 0,
           "minimumHealthyPercent": 0
       },
       "placementConstraints": [
           {
               "type": "distinctInstance",
               "expression": ""
           }
       ],
       "placementStrategy": [
           {
               "type": "binpack",
               "field": ""
           }
       ],
       "schedulingStrategy": "REPLICA",
       "deploymentController": {
           "type": "EXTERNAL"
       },
       "tags": [
           {
               "key": "",
               "value": ""
           }
       ],
       "enableECSManagedTags": true,
       "propagateTags": "TASK_DEFINITION"
   }
   ```

1. 建立初始任務集。任務集包含以下關於服務的詳細資訊：  
`taskDefinition`  
供任務集的任務使用的任務定義。  
`launchType`  
類型：字串  
有效值：`EC2` \$1 `FARGATE` \$1 `EXTERNAL`  
必要：否  
您服務執行所在的啟動類型。如果未指定啟動類型，預設會使用預設的 `capacityProviderStrategy`。  
更新服務時，此參數會觸發新的服務部署。  
若有指定 `launchType`，則必須省略 `capacityProviderStrategy` 參數。  
`platformVersion`  
類型：字串  
必要：否  
您服務中任務正在其上執行的平台版本。平台版本僅會為使用 Fargate 啟動類型的任務指定。如果尚未指定，預設會使用最新版本 (`LATEST`)。  
更新服務時，此參數會觸發新的服務部署。  
AWS Fargate 平台版本用於參考 Fargate 任務基礎設施的特定執行期環境。在您執行任務或建立服務時指定 `LATEST` 平台版本，即可取得任務所能使用的最新平台版本。當您擴展服務規模時，這些任務會收到於服務的目前部署上所指定的平台版本。如需詳細資訊，請參閱[適用於 Amazon ECS 的 Fargate 平台版本](platform-fargate.md)。  
並未針對使用 EC2 啟動類型的任務指定平台版本。  
`loadBalancers`  
用來代表您的服務所使用之負載平衡器的負載平衡器物件。當使用外部部署控制器時，僅支援 Application Load Balancer 和 Network Load Balancer。如果您使用 Application Load Balancer，每個任務集僅允許一個 Application Load Balancer 目標群組。  
以下程式碼片段顯示要使用的 `loadBalancer` 物件範例。  

   ```
   "loadBalancers": [
           {
               "targetGroupArn": "",
               "containerName": "",
               "containerPort": 0
           }
   ]
   ```
指定 `loadBalancer` 物件時，您必須指定 `targetGroupArn` 並省略 `loadBalancerName` 參數。  
`networkConfiguration`  
服務的網路組態。使用 `awsvpc` 網路模式的任務定義需要此參數，才能接收其自己的彈性網路介面，其他網路模式不支援此參數。如需有關 Fargate 聯網的詳細資訊，請參閱 [Fargate 的 Amazon ECS 任務聯網選項](fargate-task-networking.md)。  
`serviceRegistries`  
要指派給此服務的服務探索登錄檔詳細資訊。如需詳細資訊，請參閱[使用服務探索以利用 DNS 名稱連接 Amazon ECS 服務](service-discovery.md)。  
`scale`  
需要放在任務集來保持執行的任務數的浮點百分比。值是以服務的 `desiredCount` 的百分比總計指定。接受的值為 0 到 100 之間的數字。

   以下是為外部部署控制器建立任務集的 JSON 範例。

   ```
   {
       "service": "",
       "cluster": "",
       "externalId": "",
       "taskDefinition": "",
       "networkConfiguration": {
           "awsvpcConfiguration": {
               "subnets": [
                   ""
               ],
               "securityGroups": [
                   ""
               ],
               "assignPublicIp": "DISABLED"
           }
       },
       "loadBalancers": [
           {
               "targetGroupArn": "",
               "containerName": "",
               "containerPort": 0
           }
       ],
       "serviceRegistries": [
           {
               "registryArn": "",
               "port": 0,
               "containerName": "",
               "containerPort": 0
           }
       ],
       "launchType": "EC2",
       "capacityProviderStrategy": [
           {
               "capacityProvider": "",
               "weight": 0,
               "base": 0
           }
       ],
       "platformVersion": "",
       "scale": {
           "value": null,
           "unit": "PERCENT"
       },
       "clientToken": ""
   }
   ```

1. 需要服務變更時，請根據您更新哪些參數，使用 `UpdateService`、`UpdateTaskSet` 或 `CreateTaskSet` API 動作。如果您建立任務集，請對服務中的每個任務集使用 `scale` 參數，以決定在服務中要保持執行多少個任務。例如，如果您有一個服務包含 `tasksetA` 並建立 `tasksetB`，您可能想要先測試 `tasksetB` 的有效性，然後才將生產流量轉移給它。您可以將這兩個任務集的 `scale` 都設為 `100`，而當您準備好將所有生產流量轉移至 `tasksetB` 時，您可以將 `tasksetA` 的 `scale` 更新為 `0` 以縮減它。