

# 타사 컨트롤러를 사용한 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와의 Application AutoScaling 통합은 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를 사용하는 경우 작업 세트당 하나의 Application Load Balancer 대상 그룹만 허용됩니다.  
다음 조각은 사용할 `loadBalancer` 객체의 예제를 보여줍니다.  

   ```
   "loadBalancers": [
           {
               "targetGroupArn": "",
               "containerName": "",
               "containerPort": 0
           }
   ]
   ```
`loadBalancer` 객체를 지정할 때는 `targetGroupArn`을 지정하고 `loadBalancerName` 파라미터를 생략해야 합니다.  
`networkConfiguration`  
서비스에 대한 네트워크 구성. 이 파라미터는 `awsvpc` 네트워크 모드를 사용하는 태스크 정의가 고유한 탄력적 네트워크 인터페이스를 받는 데 필요하며 다른 네트워크 모드에 대해서는 지원되지 않습니다. 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`으로 업데이트하여 축소할 수 있습니다.