

# サードパーティーのコントローラーを使用して 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` スケジューリング戦略をサポートしません。
+ Application AutoScaling と Amazon ECS を統合した場合、Amazon ECS サービスのみをターゲットとしてサポートします。Amazon ECS でサポートされているスケーラブルなディメンションは `ecs:service:DesiredCount` であり、これは Amazon ECS サービスのタスク数です。Application AutoScaling および 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`  
サービスのタスクで使用する配置戦略オブジェクト。サービスごとに最大 4 つの戦略ルールを指定できます。

   次の例は、外部デプロイコントローラーを使用するサービスを作成するためのサービス定義です。

   ```
   {
       "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 を使用している場合、タスクセットあたり 1 つの Application Load Balancer ターゲットグループのみが許可されます。  
次のスニペットは、使用する `loadBalancer` オブジェクトの例を示しています。  

   ```
   "loadBalancers": [
           {
               "targetGroupArn": "",
               "containerName": "",
               "containerPort": 0
           }
   ]
   ```
`loadBalancer` オブジェクトを指定する場合は、`targetGroupArn` を指定し、`loadBalancerName` パラメータを省略する必要があります。  
`networkConfiguration`  
サービスのネットワーク構成。このパラメータは `awsvpc` ネットワークモードを使用して独自の Elastic Network Interface を受け取るタスク定義の場合に必要です。その他のネットワークモードではサポートされていません。Fargate のネットワーク設定の詳細については、「[Fargate における Amazon ECS タスクのネットワークオプション](fargate-task-networking.md)」を参照してください。  
`serviceRegistries`  
このサービスに割り当てるサービス検出レジストリの詳細。詳細については、「[サービス検出を使用して Amazon ECS サービスを DNS 名で接続する](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` に更新して、スケールダウンすることもできます。