Amazon ECS 카나리아(canary) 배포 만들기

Amazon ECS 카나리아(canary) 배포 만들기

Amazon ECS 카나리아 배포를 사용하면 새 서비스 리비전("카나리아")에 트래픽의 작은 백분율을 이동시켜 배포를 검증한 뒤, 지정된 간격 후 나머지 트래픽을 한 번에 이동할 수 있어요. 이 접근 방식은 전체 배포 전에 최소한의 위험으로 새 기능을 테스트할 수 있게 해줍니다.

출처: 문서

본문

사전 요구 사항

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

  • 적절한 권한을 구성합니다. Elastic Load Balancing 권한은 로드 밸런서용 Amazon ECS 인프라 IAM 역할(Amazon ECS infrastructure IAM role for load balancers)을, Lambda 권한은 Amazon ECS blue/green 배포의 Lambda 함수에 필요한 권한(Permissions required for Lambda functions in Amazon ECS blue/green deployments)을 참고하세요.
  • Amazon ECS 카나리아 배포는 서비스가 다음 기능 중 하나를 사용해야 합니다. 적절한 리소스를 구성합니다:
    • Application Load Balancer – Application Load Balancer 리소스(blue/green, linear, canary 배포용) 참고.
    • Network Load Balancer – Network Load Balancer 리소스(Amazon ECS blue/green, linear, canary 배포용) 참고.
    • Service Connect – Service Connect 리소스(Amazon ECS blue/green, linear, canary 배포용) 참고.

절차

콘솔이나 AWS CLI로 Amazon ECS 카나리아 배포 서비스를 만들 수 있습니다.

콘솔

  1. https://console.aws.amazon.com/ecs/v2 에서 콘솔을 엽니다.
  2. 서비스를 시작할 리소스를 결정합니다.
시작 위치 단계
Clusters Clusters 페이지에서 서비스를 만들 클러스터를 선택합니다. 클러스터 세부 정보 페이지가 표시됩니다. Services 탭에서 Create을 선택합니다.
Task definition Task definitions 페이지에서 태스크 정의를 선택합니다. Deploy 메뉴에서 Create service을 선택합니다.
  1. Create service 페이지가 표시됩니다.
  2. Service details 아래에서 다음을 수행합니다:
    • Task definition family에서 사용할 태스크 정의를 선택하고, Task definition revision에서 사용할 리비전을 입력합니다.
    • Service name에 서비스 이름을 입력합니다.
    • 기존 클러스터에서 서비스를 실행하려면 Existing cluster에서 클러스터를, 새 클러스터에서 실행하려면 Create cluster를 선택합니다.
  3. 태스크가 클러스터 인프라에 분산되는 방식을 선택합니다. Compute configuration에서 옵션을 선택합니다.
컴퓨팅 옵션 단계
Capacity provider strategy Compute options에서 Capacity provider strategy을 선택합니다. 전략을 선택합니다: 클러스터의 기본 용량 공급자 전략을 사용하려면 Use cluster default를 선택합니다. 클러스터에 기본 용량 공급자 전략이 없거나 사용자 지정 전략을 사용하려면 Use custom, Add capacity provider strategy을 선택하고 Base, Capacity provider, Weight를 지정해 사용자 지정 전략을 정의합니다. 참고: 전략에서 용량 공급자를 사용하려면 용량 공급자가 클러스터와 연결되어 있어야 합니다.
Launch type Compute options 섹션에서 Launch type을 선택합니다. Launch type에서 런치 타입을 선택합니다. (선택 사항) Fargate가 지정되면 Platform version에서 사용할 플랫폼 버전을 지정합니다. 플랫폼 버전을 지정하지 않으면 LATEST 플랫폼 버전이 사용됩니다.
  1. Deployment configuration 아래에서 다음을 수행합니다:
    • Service type에서 Replica를 선택합니다.
    • Desired tasks에 서비스에서 시작하고 유지할 태스크 수를 입력합니다.
    • Amazon ECS가 가용 영역 간 태스크 분포를 모니터링하고 불균형 시 재분배하려면 Availability Zone service rebalancing에서 Availability Zone service rebalancing을 선택합니다.
    • Health check grace period에 태스크가 처음 시작된 후 서비스 스케줄러가 비정상 Elastic Load Balancing, VPC Lattice, 컨테이너 상태 확인을 무시하는 시간(초)을 입력합니다. 값이 지정되지 않으면 기본값 0이 사용됩니다.
  2. Deployment configuration 아래에서 카나리아 배포 설정을 구성합니다:
    • Deployment strategy에서 Canary을 선택합니다.
    • Canary percentage에 첫 단계에서 green 서비스 리비전으로 이동할 트래픽 백분율을 입력합니다(예: 초기 카나리아 트래픽 10%).
    • Canary bake time에 나머지 트래픽을 green 서비스 리비전으로 이동하기 전에 기다릴 시간(분)을 입력합니다.
    • Bake time에 최종 트래픽 전환 후 blue 리비전이 종료되기 전에 blue와 green 서비스 리비전이 동시에 실행될 시간(분)을 입력합니다.
  3. (선택 사항) 배포의 특정 단계에서 실행할 수명 주기 훅(lifecycle hooks)을 구성합니다. Deployment lifecycle hooks에서 Add을 선택합니다.
    • Lambda 훅: Target type에서 Lambda을 선택합니다. Lambda function에 함수 이름 또는 ARN을, Role에 Lambda 함수를 호출할 권한이 있는 IAM 역할을 입력합니다. Lifecycle stages에서 Lambda 함수가 실행되어야 하는 단계를 선택합니다.
    • Pause 훅: Target type에서 Pause을 선택합니다. Lifecycle stages에서 배포가 일시 중지되어야 하는 단계를 선택합니다. (선택 사항) Timeout에서 제한 시간과 동작을 구성합니다.
  4. Amazon ECS가 배포 실패를 감지하고 처리하는 방법을 구성하려면 Deployment failure detection을 확장하고 옵션을 선택합니다:
    • 태스크가 시작될 수 없을 때 배포를 중지하려면 Use the Amazon ECS deployment circuit breaker을 선택합니다. 배포 서킷 브레이커가 배포를 실패 상태로 설정할 때 소프트웨어가 배포를 마지막 완료된 배포 상태로 자동 롤백하게 하려면 Rollback on failures을 선택합니다.
    • 애플리케이션 지표를 기반으로 배포를 중지하려면 Use CloudWatch alarm(s)을 선택한 뒤, CloudWatch alarm name에서 알람을 선택합니다. 새 알람을 만들려면 CloudWatch 콘솔로 이동합니다. CloudWatch 알람이 배포를 실패 상태로 설정할 때 소프트웨어가 배포를 마지막 완료된 배포 상태로 자동 롤백하게 하려면 Rollback on failures을 선택합니다.
  5. (선택 사항) Service Connect로 서비스를 상호 연결하려면 Service Connect을 확장하고 다음을 지정합니다:
    • Turn on Service Connect을 선택합니다.
    • Service Connect configuration에서 클라이언트 모드를 지정합니다. 네트워크 클라이언트 애플리케이션만 실행해 네임스페이스의 다른 서비스에 연결하기만 하면 되는 서비스라면 Client side only을 선택합니다. 네트워크 또는 웹 서비스 애플리케이션을 실행하고 이 서비스의 엔드포인트를 제공하며 네임스페이스의 다른 서비스에도 연결해야 한다면 Client and server을 선택합니다.
    • 기본 클러스터 네임스페이스가 아닌 네임스페이스를 사용하려면 Namespace에서 서비스 네임스페이스를 선택합니다. 이는 AWS 계정의 같은 AWS 리전에서 별도로 만든 네임스페이스이거나, AWS Resource Access Manager(AWS RAM)로 계정에 공유된 같은 리전의 네임스페이스일 수 있습니다. 공유 AWS Cloud Map 네임스페이스에 대한 자세한 내용은 AWS Cloud Map 개발자 가이드의 크로스 계정 AWS Cloud Map 네임스페이스 공유를 참고하세요.
  6. (선택 사항) 카나리아 배포용 테스트 트래픽 헤더 규칙을 구성합니다. Test traffic routing에서 다음을 지정합니다:
    • 테스트 중 특정 요청을 green 서비스 리비전으로 라우팅하려면 Enable test traffic header rules을 선택합니다.
    • Header matching rules에서 테스트 트래픽 라우팅 기준을 구성합니다:
      • Header name: 일치시킬 HTTP 헤더 이름을 입력합니다(예: X-Test-Version 또는 User-Agent).
      • Match type: 일치 기준을 선택합니다: Exact match(헤더 값이 지정된 값과 정확히 일치하는 요청 라우팅), Header present(값과 관계없이 지정된 헤더를 포함하는 요청 라우팅), Pattern match(헤더 값이 지정된 패턴과 일치하는 요청 라우팅).
      • Header value(exact match 또는 pattern match 사용 시): 일치시킬 값 또는 패턴을 입력합니다.
    • 복잡한 라우팅 로직을 만들기 위해 여러 헤더 일치 규칙을 추가할 수 있습니다. 구성된 규칙 중 하나라도 일치하는 요청은 테스트를 위해 green 서비스 리비전으로 라우팅됩니다. 추가 헤더 일치 조건은 Add header rule을 선택해 구성합니다.
    • 참고: 테스트 트래픽 헤더 규칙을 사용하면 전체 배포를 완료하기 전에 통제된 트래픽으로 새 기능을 검증할 수 있어요. 이를 통해 blue 서비스 리비전으로의 정상 트래픽 흐름을 유지하면서 특정 요청(내부 테스트 도구나 베타 사용자의 요청 같은)으로 green 서비스 리비전을 테스트할 수 있습니다.
  7. (선택 사항) 로그 구성을 지정합니다. Use log collection을 선택합니다. 기본 옵션은 컨테이너 로그를 CloudWatch Logs로 보냅니다. 다른 로그 드라이버 옵션은 AWS FireLens로 구성됩니다. 자세한 내용은 Amazon ECS 로그를 AWS 서비스 또는 AWS 파트너에게 보내기(Send Amazon ECS logs to an AWS service or AWS Partner)를 참고하세요.
    • Amazon CloudWatch: 태스크가 컨테이너 로그를 CloudWatch Logs로 보내도록 구성합니다. 기본 로그 드라이버 옵션이 제공되며, 이를 통해 CloudWatch 로그 그룹이 대신 만들어집니다. 다른 로그 그룹 이름을 지정하려면 드라이버 옵션 값을 변경합니다.
    • Amazon Data Firehose: 태스크가 컨테이너 로그를 Firehose로 보내도록 구성합니다. 기본 로그 드라이버 옵션이 제공되며, 로그를 Firehose 전송 스트림으로 보냅니다.
    • Amazon Kinesis Data Streams: 태스크가 컨테이너 로그를 Kinesis Data Streams로 보내도록 구성합니다.
    • Amazon OpenSearch Service: 태스크가 컨테이너 로그를 OpenSearch Service 도메인으로 보내도록 구성합니다. 로그 드라이버 옵션을 제공해야 합니다.
    • Amazon S3: 태스크가 컨테이너 로그를 Amazon S3 버킷으로 보내도록 구성합니다. 기본 로그 드라이버 옵션이 기본값으로 설정되지만 유효한 Amazon S3 버킷 이름을 지정해야 합니다.
  8. (선택 사항) 카나리아 배포용 로드 밸런싱을 구성합니다.
Elastic Load Balancing 유형 단계
Application Load Balancer Load balancer type에서 Application Load Balancer을 선택합니다. 새 Application Load Balancer를 만들려면 Create a new load balancer을, 기존 Application Load Balancer를 선택하려면 Use an existing load balancer을 선택합니다. Container에서 서비스를 호스팅하는 컨테이너를 선택합니다. Load balancer name에 고유한 이름을 입력합니다. Listener에 Application Load Balancer가 연결 요청을 수신할 포트와 프로토콜을 입력합니다. 기본적으로 로드 밸런서는 포트 80과 HTTP를 사용하도록 구성됩니다. Production rule에서 규칙의 Evaluation order와 Path pattern을 입력합니다. 이 규칙은 프로덕션(blue) 서비스 리비전 트래픽용입니다. Test rule에서 규칙의 Evaluation order와 Path pattern을 입력합니다. 이 규칙은 테스트(green) 서비스 리비전 트래픽용입니다. Target group에서 다음을 구성합니다: Target group name에 Application Load Balancer가 요청을 라우팅하는 대상 그룹의 이름과 프로토콜을 입력합니다. Protocol에서 대상 그룹의 프로토콜을 선택합니다(기본적으로 태스크 정의에 정의된 첫 컨테이너로 요청을 라우팅). Deregistration delay에 로드 밸런서가 대상 상태를 UNUSED로 변경하는 시간(초)을 입력합니다. 기본값은 300초입니다. Health check path에 Application Load Balancer가 주기적으로 요청을 보내 연결 상태를 확인하는 컨테이너 내 기존 경로를 입력합니다. 기본값은 루트 디렉터리(/)입니다. Alternate group name에 테스트 서비스 리비전용 대상 그룹의 그룹 이름을 입력합니다.
Network Load Balancer Load balancer type에서 Network Load Balancer을 선택합니다. Load Balancer에서 기존 Network Load Balancer를 선택합니다. Choose container to load balance에서 서비스를 호스팅하는 컨테이너를 선택합니다. Production listener에서 Production listener port와 Production listener protocol을 선택합니다. 이는 프로덕션 서비스 리비전 트래픽용 리스너입니다. Test listener에서 Test listener port와 Test listener protocol을 선택합니다. 이는 테스트 서비스 리비전 트래픽용 리스너입니다. Target group에서 다음을 구성합니다(위와 유사).
  1. (선택 사항) 서비스와 태스크를 식별하는 데 도움이 되도록 Tags 섹션을 확장하고 태그를 구성합니다. Amazon ECS가 클러스터 이름과 태스크 정의 태그로 모든 새로 시작된 태스크를 자동으로 태그하려면 Turn on Amazon ECS managed tags을 선택한 다음 Propagate tags from에서 Task definitions을 선택합니다. 클러스터 이름과 서비스 태그로 자동 태그하려면 Propagate tags from에서 Service을 선택합니다. 태그를 추가 또는 제거합니다.
  2. Create을 선택합니다.

AWS CLI

canary-service-definition.json이라는 파일을 다음 내용으로 만듭니다. user-input을 자신의 값으로 바꾸세요:

{
  "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"
      }
    }
  ]
}

create-service를 실행합니다:

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

다음 단계

카나리아 배포를 구성한 후 다음 단계를 완료합니다:

  • 배포를 시작하려면 서비스를 업데이트합니다. 자세한 내용은 Amazon ECS 서비스 업데이트(Updating an Amazon ECS service)를 참고하세요.
  • 배포 프로세스가 카나리아 패턴을 따르는지 모니터링합니다:
    • green 서비스 리비전이 생성되고 확장됩니다
    • 트래픽의 작은 백분율(카나리아)이 green 리비전으로 이동됩니다
    • 시스템이 지정된 카나리아 간격을 기다립니다
    • 나머지 트래픽이 green 리비전으로 한 번에 이동됩니다
    • 베이크 시간 후 blue 리비전이 종료됩니다