

# Amazon ECS 카나리 배포 생성
<a name="deploy-canary-service"></a>

Amazon ECS 카나리 배포를 사용하면 소량의 트래픽을 새 서비스 개정('카나리')으로 이전할 수 있습니다. 배포를 검증한 다음 지정된 간격 후 나머지 트래픽을 한 번에 모두 이전합니다. 이 접근 방식을 사용하면 전체 배포 전에 위험을 최소화하면서 새 기능을 테스트할 수 있습니다.

## 사전 조건
<a name="deploy-canary-service-prerequisites"></a>

카나리 배포를 시작하기 전에 다음 작업을 수행합니다.

1. 적절한 권한을 구성하세요.
   + Elastic Load Balancing 권한에 대한 자세한 내용은 [로드 밸런서에 대한 Amazon ECS 인프라 IAM 역할](AmazonECSInfrastructureRolePolicyForLoadBalancers.md) 섹션을 참조하세요.
   + Lambda 권한에 대한 자세한 내용은 [Amazon ECS 블루/그린 배포에서 Lambda 함수에 필요한 권한](blue-green-permissions.md) 섹션을 참조하세요.

1. Amazon ECS 카나리 배포에서는 서비스가 다음 기능 중 하나를 사용해야 합니다. 적절한 리소스를 구성하세요.
   + Application Load Balancer - 자세한 내용은 [블루/그린, 선형, 카나리 배포에 대한 Application Load Balancer 리소스](alb-resources-for-blue-green.md) 섹션을 참조하세요.
   + Network Load Balancer - 자세한 내용은 [Amazon ECS 블루/그린, 선형 및 카나리 배포를 위한 Network Load Balancer](nlb-resources-for-blue-green.md) 섹션을 참조하세요.
   + Service Connect - 자세한 내용은 [Amazon ECS 블루/그린, 선형 및 카나리 배포에 대한 Service Connect 리소스](service-connect-blue-green.md) 섹션을 참조하세요.

## 절차
<a name="deploy-canary-service-procedure"></a>

콘솔 또는 AWS CLI를 사용하여 Amazon ECS 카나리 배포 서비스를 생성할 수 있습니다.

------
#### [ Console ]

1. [https://console.aws.amazon.com/ecs/v2](https://console.aws.amazon.com/ecs/v2)에서 콘솔을 엽니다.

1. 서비스를 시작할 리소스를 결정합니다.    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/deploy-canary-service.html)

   **서비스 생성** 페이지가 표시됩니다.

1. **서비스 세부 정보**에서 다음을 수행합니다.

   1. **태스크 정의**에서 사용할 태스크 정의 패밀리 및 개정을 선택하세요. 그런 다음 **태스크 정의 개정**에 사용할 개정을 입력하세요.

   1. **서비스 이름(Service name)**에 서비스의 이름을 입력합니다.

1. 기존 클러스터에서 서비스를 실행하려면 **기존 클러스터**에서 클러스터를 선택하세요. 새 클러스터에서 서비스를 실행하려면 **클러스터 생성**을 선택하세요.

1. 클러스터 인프라에 태스크를 배포하는 방식을 선택합니다. **컴퓨팅 구성**에서 옵션을 선택합니다.    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/deploy-canary-service.html)

1. **배포 구성**에서 다음을 수행합니다.

   1. **서비스 유형**에서 **복제본**을 선택하세요.

   1. **원하는 작업(Desired tasks)**에 서비스에서 시작 및 유지 관리할 작업 수를 입력합니다.

   1. Amazon ECS에서 가용 영역 전체의 태스크 분산을 모니터링하고 불균형이 있을 때 재분산하려면 **가용 영역 서비스 리밸런싱**에서 **가용 영역 서비스 리밸런싱**을 선택하세요.

   1. **상태 확인 유예 기간**에 태스크가 처음 시작된 후 서비스 스케줄러가 비정상 Elastic Load Balancing, VPC Lattice, 컨테이너 상태 확인을 무시하는 시간(초)을 입력하세요. 상태 확인 유예 기간 값을 지정하지 않으면 기본값인 0이 사용됩니다.

1. **배포 구성**에서 카나리 배포 설정을 구성하세요.

   1. **배포 전략**에서 **카나리**를 선택하세요.

   1. **카나리 백분율**에 첫 번째 단계에서 그린 서비스 개정으로 이전할 트래픽 백분율을 입력하세요(예: 초기 카나리 트래픽의 경우 10%).

   1. **카나리 베이크 소요 시간**에 남은 트래픽을 그린 서비스 개정으로 이전하기 전에 대기할 시간(분)을 입력하세요.

   1. **베이크 소요 시간**에 최종 트래픽 이전 후 블루 개정이 종료되기 전에 블루 및 그린 서비스 개정이 동시에 실행되는 시간(분)을 입력하세요.

   1. (선택 사항) 배포의 특정 단계에서 실행할 Lambda 함수를 실행하세요. **배포 수명 주기 후크**에서 수명 주기 후크를 실행할 단계를 선택하세요.

      수명 주기 후크를 추가하는 방법:

      1. **추가**를 선택합니다.

      1. **Lambda 함수**에서 함수 이름 또는 ARN을 입력하세요.

      1. **역할**에서 Lambda 함수를 간접 호출할 권한이 있는 IAM 역할을 선택하세요.

      1. **수명 주기 단계**에서 Lambda 함수를 실행해야 하는 단계를 선택하세요.

1. Amazon ECS에서 배포 오류를 탐지 및 처리하는 방법을 구성하려면 **배포 오류 탐지(Deployment failure detection)**를 펼친 다음, 옵션을 선택합니다.

   1. 작업을 시작할 수 없을 때 배포를 중지하려면 **Use the Amazon ECS deployment circuit breaker**(Amazon ECS 배포 회로 차단기 사용)를 선택합니다.

      배포 회로 차단기가 배포를 실패한 상태로 설정했을 때 소프트웨어가 마지막으로 완료한 배포로 자동 롤백하도록 하려면 **실패 시 롤백**을 선택합니다.

   1. 애플리케이션 지표를 기반으로 배포를 중지하려면 **CloudWatch 경보 사용**을 선택합니다. 그런 다음, **CloudWatch 경보 이름**에서 경보를 선택합니다. 새 경보를 생성하려면 CloudWatch 콘솔을 이동합니다.

      CloudWatch 경보가 배포를 실패한 상태로 설정할 때 소프트웨어가 마지막으로 완료한 배포 상태로 자동 롤백하도록 하려면 **실패 시 롤백**을 선택합니다.

1. (선택 사항) Service Connect를 사용하여 서비스를 상호 연결하려면 **Service Connect**를 확장한 후 다음을 지정하세요.

   1.  **Service Connect 켜기**를 선택합니다.

   1. **Service Connect configuration**(Service Connect 구성)에서 클라이언트 모드를 지정합니다.
      + 서비스에서 네임스페이스의 다른 서비스에만 연결하면 되는 네트워크 클라이언트 애플리케이션을 실행하는 경우 **클라이언트 측만**을 선택합니다.
      + 서비스가 네트워크 또는 웹 서비스 애플리케이션을 실행하고 이 서비스에 대한 엔드포인트를 제공해야 하며, 네임스페이스의 다른 서비스에 연결해야 하는 경우 **Client and server**(클라이언트 및 서버)를 선택합니다.

   1. 기본 클러스터 네임스페이스가 아닌 네임스페이스를 사용하려면 **Namespace**(네임스페이스)에서 서비스 네임스페이스를 선택합니다. 이는 AWS 계정의 동일한 AWS 리전에서 별도로 생성된 네임스페이스 또는 AWS Resource Access Manager(AWS RAM)를 사용하여 계정과 공유되는 동일한 리전의 네임스페이스일 수 있습니다. 공유 AWS Cloud Map 네임스페이스에 대한 자세한 내용은 *AWS Cloud Map 개발자 안내서*의 [Cross-account AWS Cloud Map namespace sharing](https://docs.aws.amazon.com/cloud-map/latest/dg/sharing-namespaces.html)을 참조하세요.

   1. (선택 사항) 카나리 배포에 대한 테스트 트래픽 헤더 규칙을 구성하세요. **테스트 트래픽 라우팅**에서 다음을 지정하세요.

      1. 테스트 중에 특정 요청을 그린 서비스 개정으로 라우팅하려면 **테스트 트래픽 헤더 규칙 활성화**를 선택하세요.

      1. **헤더 일치 규칙**에서 테스트 트래픽 라우팅 기준을 구성하세요.
         + **헤더 이름**: 일치시킬 HTTP 헤더의 이름을 입력합니다(예: `X-Test-Version` 또는 `User-Agent`).
         + **일치 유형**: 일치 기준을 선택합니다.
           + **정확한 일치**: 헤더 값이 지정된 값과 정확히 일치하는 요청을 라우팅합니다.
           + **헤더 있음**: 값에 관계없이 지정된 헤더를 포함하는 라우팅 요청
           + **패턴 일치**: 헤더 값이 지정된 패턴과 일치하는 요청 라우팅
         + **헤더 값**(정확한 일치 또는 패턴 일치를 사용하는 경우): 일치시킬 값 또는 패턴을 입력합니다.

         여러 헤더 일치 규칙을 추가하여 복잡한 라우팅 로직을 생성할 수 있습니다. 구성된 규칙과 일치하는 요청은 테스트를 위해 그린 서비스 개정으로 라우팅됩니다.

      1. **헤더 규칙 추가**를 선택하여 추가 헤더 일치 조건을 구성하세요.
**참고**  
테스트 트래픽 헤더 규칙을 사용하면 전체 배포를 완료하기 전에 트래픽을 제어하며 새 기능을 검증할 수 있습니다. 이를 통해 블루 서비스 개정으로 정상적인 트래픽 흐름을 유지하면서 특정 요청(예: 내부 테스트 도구 또는 베타 사용자의 요청)으로 그린 서비스 개정을 테스트할 수 있습니다.

   1. (선택 사항) 로그 구성을 지정합니다. **로그 수집 사용**을 선택합니다. 기본 옵션은 CloudWatch Logs로 컨테이너 로그를 전송합니다. 다른 로그 드라이버 옵션은 AWS FireLens를 사용하여 구성됩니다. 자세한 정보는 [Amazon ECS 로그를 AWS 서비스 또는 AWS Partner로 전송](using_firelens.md)을 참조하세요.

      다음은 각 컨테이너 로그 대상에 대한 자세한 설명입니다.
      + **Amazon CloudWatch** - CloudWatch Logs로 컨테이너 로그를 전송하도록 작업을 구성합니다. 사용자를 대신하여 CloudWatch 로그 그룹을 생성하는 기본 로그 드라이버 옵션이 제공됩니다. 다른 로그 그룹 이름을 지정하려면 드라이버 옵션 값을 변경합니다.
      + **Amazon Data Firehose** - Firehose로 컨테이너 로그를 전송하도록 작업을 구성합니다. Firehose 전송 스트림으로 로그를 전송하는 기본 로그 드라이버 옵션이 제공됩니다. 다른 전송 스트림 이름을 지정하려면 드라이버 옵션 값을 변경합니다.
      + **Amazon Kinesis Data Streams** - Kinesis Data Streams로 컨테이너 로그를 전송하도록 작업을 구성합니다. Kinesis Data Streams 스트림으로 로그를 전송하는 기본 로그 드라이버 옵션이 제공됩니다. 다른 스트림 이름을 지정하려면 드라이버 옵션 값을 변경합니다.
      + **Amazon OpenSearch Service** - OpenSearch Service 도메인으로 컨테이너 로그를 전송하도록 작업을 구성합니다. 로그 드라이버 옵션이 제공되어야 합니다.
      + **Amazon S3** - Amazon S3 버킷으로 컨테이너 로그를 전송하도록 작업을 구성합니다. 기본 로그 드라이버 옵션이 제공되지만 유효한 Amazon S3 버킷 이름을 지정해야 합니다.

1. (선택 사항) 카나리 배포를 위한 **로드 밸런싱**을 구성하세요.    
[See the AWS documentation website for more details](http://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/deploy-canary-service.html)

1. (선택 사항) 서비스와 태스크를 식별하려면 **태그(Tags)** 섹션을 펼친 다음, 태그를 구성합니다.

   Amazon ECS에서 새로 시작된 모든 작업에 클러스터 이름과 작업 정의 태그를 자동으로 지정하도록 하려면 **Amazon ECS 관리형 태그 켜기**를 선택한 다음 **작업 전파 시작**에서 **작업 정의**를 선택합니다.

   Amazon ECS에서 새로 시작된 모든 작업에 클러스터 이름과 서비스 태그를 자동으로 지정하도록 하려면 **Amazon ECS 관리형 태그 켜기**를 선택한 다음 **작업 전파 시작**에서 **서비스**를 선택합니다.

   태그를 추가하거나 제거합니다.
   + [태그 추가] **새로운 태그(Add tag)**를 선택하고 다음을 수행합니다.
     + **키**에서 키 이름을 입력합니다.
     + **값**에 키 값을 입력합니다.
   + [태그 제거] 태그 옆에 있는 **태그 제거**를 선택합니다.

1. **생성(Create)**을 선택합니다.

------
#### [ AWS CLI ]

1. 다음 콘텐츠가 포함된 `canary-service-definition.json`이라는 파일을 생성합니다.

   모든 {{사용자 입력}}을 사용자의 값으로 바꿉니다.

   ```
   {
     "serviceName": "myCanaryService",
     "cluster": "arn:aws:ecs:us-west-2:123456789012:cluster/sample-fargate-cluster",
     "taskDefinition": "sample-fargate:1",
     "desiredCount": 5,
     "launchType": "FARGATE",
     "networkConfiguration": {
       "awsvpcConfiguration": {
         "subnets": [
           "subnet-09ce6e74c116a2299",
           "subnet-00bb3bd7a73526788",
           "subnet-0048a611aaec65477"
         ],
         "securityGroups": [
           "sg-09d45005497daa123"
         ],
         "assignPublicIp": "ENABLED"
       }
     },
     "deploymentController": {
       "type": "ECS"
     },
     "deploymentConfiguration": {
       "strategy": "CANARY",
       "maximumPercent": 200,
       "minimumHealthyPercent": 100,
       "canaryConfiguration" : {
           "canaryPercent" : 5.0,
           "canaryBakeTime" : 10
       },
       "bakeTimeInMinutes": 10,
       "alarms": {
         "alarmNames": [
           "myAlarm"
         ],
         "rollback": true,
         "enable": true
       }
     },
     "loadBalancers": [
       {
         "targetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/blue-target-group/54402ff563af1197",
         "containerName": "fargate-app",
         "containerPort": 80,
         "advancedConfiguration": {
           "alternateTargetGroupArn": "arn:aws:elasticloadbalancing:us-west-2:123456789012:targetgroup/green-target-group/cad10a56f5843199",
           "productionListenerRule": "arn:aws:elasticloadbalancing:us-west-2:123456789012:listener-rule/app/my-canary-demo/32e0e4f946c3c05b/9cfa8c482e204f7d/831dbaf72edb911",
           "roleArn": "arn:aws:iam::123456789012:role/LoadBalancerManagementforECS"
         }
       }
     ]
   }
   ```

1. `create-service`를 실행합니다.

   ```
   aws ecs create-service --cli-input-json file://canary-service-definition.json
   ```

------

## 다음 단계
<a name="deploy-canary-service-next-steps"></a>

카나리 배포를 구성한 후 다음 단계를 완료합니다.
+ 배포를 시작하도록 서비스를 업데이트합니다. 자세한 내용은 [Amazon ECS 서비스 업데이트](update-service-console-v2.md) 섹션을 참조하세요.
+ 배포 프로세스를 모니터링하여 카나리 패턴을 따르는지 확인합니다.
  + 그린 서비스 개정이 생성되고 스케일 업됨
  + 소량의 트래픽(카나리)이 그린 개정으로 이전됩니다.
  + 시스템이 지정된 카나리 간격을 기다립니다.
  + 나머지 트래픽은 모두 한 번에 그린 개정으로 이전합니다.
  + 베이크 소요 시간이 지나면 블루 개정이 종료됨