Amazon ECS용 CodeDeploy 블루/그린 배포

Amazon ECS용 CodeDeploy 블루/그린 배포

Amazon ECS 블루/그린 배포를 사용하는 것을 권장해요. 자세한 내용은 Creating an Amazon ECS blue/green deployment를 참고하세요. 블루/그린 배포 유형은 CodeDeploy가 제어하는 블루/그린 배포 모델을 사용해요. 이 배포 유형을 사용해 프로덕션 트래픽을 보내기 전에 서비스의 새 배포를 검증하세요. 자세한 내용은 AWS CodeDeploy User Guide의 What Is CodeDeploy를 참고하세요.

출처: 문서

본문

배포 전에 Amazon ECS 서비스 상태 검증

블루/그린 배포 중 트래픽이 이동하는 방법은 세 가지가 있어요.

  • Canary – 트래픽이 두 번에 나누어 이동돼요. 첫 번째 증분에서 업데이트된 태스크 세트로 이동되는 트래픽 비율과, 나머지 트래픽이 두 번째 증분에서 이동되기 전의 간격(분)을 지정하는 사전 정의된 canary 옵션을 선택할 수 있어요.
  • Linear – 트래픽이 각 증분 사이에 동일한 간격(분)으로 균등한 증분으로 이동돼요. 각 증분에서 이동되는 트래픽 비율과 각 증분 사이의 분 수를 지정하는 사전 정의된 linear 옵션을 선택할 수 있어요.
  • All-at-once – 모든 트래픽이 원래 태스크 세트에서 업데이트된 태스크 세트로 한 번에 이동돼요.

서비스가 블루/그린 배포 유형을 사용할 때 Amazon ECS가 사용하는 CodeDeploy 구성 요소는 다음과 같아요.

CodeDeploy 애플리케이션 (CodeDeploy application) – CodeDeploy 리소스의 모음. 하나 이상의 배포 그룹으로 구성돼요.

CodeDeploy 배포 그룹 (CodeDeploy deployment group) – 배포 설정. 다음으로 구성돼요.

  • Amazon ECS 클러스터와 서비스
  • 로드 밸런서 대상 그룹과 리스너 정보
  • 배포 롤백 전략
  • 트래픽 재라우팅 설정
  • 원래 개정 종료 설정
  • 배포 구성
  • 배포를 중지하도록 설정할 수 있는 CloudWatch 알람 구성
  • 알림용 SNS 또는 CloudWatch Events 설정

자세한 내용은 AWS CodeDeploy User Guide의 Working with Deployment Groups를 참고하세요.

CodeDeploy 배포 구성 (CodeDeploy deployment configuration) – 배포 중 CodeDeploy가 프로덕션 트래픽을 교체 태스크 세트로 라우팅하는 방법을 지정해요. 다음 사전 정의된 linear 및 canary 배포 구성이 사용 가능해요. 사용자 지정으로 정의한 linear 및 canary 배포를 만들 수도 있어요. 자세한 내용은 AWS CodeDeploy User Guide의 Working with Deployment Configurations를 참고하세요.

  • CodeDeployDefault.ECSAllAtOnce : 모든 트래픽을 업데이트된 Amazon ECS 컨테이너로 한 번에 이동해요.
  • CodeDeployDefault.ECSLinear10PercentEvery1Minutes : 모든 트래픽이 이동될 때까지 매분 트래픽의 10%씩 이동해요.
  • CodeDeployDefault.ECSLinear10PercentEvery3Minutes : 모든 트래픽이 이동될 때까지 3분마다 트래픽의 10%씩 이동해요.
  • CodeDeployDefault.ECSCanary10Percent5Minutes : 첫 번째 증분에서 트래픽의 10%를 이동해요. 나머지 90%는 5분 후에 배포돼요.
  • CodeDeployDefault.ECSCanary10Percent15Minutes : 첫 번째 증분에서 트래픽의 10%를 이동해요. 나머지 90%는 15분 후에 배포돼요.

개정 (Revision) – 개정은 CodeDeploy 애플리케이션 사양 파일(AppSpec 파일)이에요. AppSpec 파일에서 태스크 정의의 전체 ARN과 새 배포가 생성될 때 트래픽이 라우팅될 교체 태스크 세트의 컨테이너와 포트를 지정해요. 컨테이너 이름은 태스크 정의에서 참조되는 컨테이너 이름 중 하나여야 해요. 서비스 정의에서 네트워크 구성이나 플랫폼 버전이 업데이트되었다면 AppSpec 파일에서도 해당 세부 정보를 지정해야 해요. 배포 수명 주기 이벤트 중에 실행할 Lambda 함수도 지정할 수 있어요. Lambda 함수를 사용하면 배포 중 테스트를 실행하고 메트릭을 반환할 수 있어요. 자세한 내용은 AWS CodeDeploy User Guide의 AppSpec File Reference를 참고하세요.

고려 사항 (Considerations)

블루/그린 배포 유형을 사용할 때 다음 사항을 고려하세요.

  • 블루/그린 배포 유형을 사용하는 Amazon ECS 서비스가 처음 생성될 때 Amazon ECS 태스크 세트가 생성돼요.
  • 서비스를 Application Load Balancer 또는 Network Load Balancer를 사용하도록 구성해야 해요. 다음은 로드 밸런서 요구 사항이에요.
    • 프로덕션 트래픽을 라우팅하는 데 사용되는 프로덕션 리스너를 로드 밸런서에 추가해야 해요.
    • 테스트 트래픽을 라우팅하는 데 사용되는 선택적 테스트 리스너를 로드 밸런서에 추가할 수 있어요. 테스트 리스너를 지정하면 CodeDeploy는 배포 중 테스트 트래픽을 교체 태스크 세트로 라우팅해요.
    • 프로덕션 리스너와 테스트 리스너 모두 같은 로드 밸런서에 속해야 해요.
    • 로드 밸런서의 대상 그룹을 정의해야 해요. 대상 그룹은 프로덕션 리스너를 통해 서비스의 원래 태스크 세트로 트래픽을 라우팅해요.
    • Network Load Balancer를 사용할 때는 CodeDeployDefault.ECSAllAtOnce 배포 구성만 지원돼요.
  • 서비스 자동 스케일링과 블루/그린 배포 유형을 사용하도록 구성된 서비스의 경우, 배포 중에 자동 스케일링이 차단되지는 않지만 일부 상황에서는 배포가 실패할 수 있어요. 다음은 이 동작을 자세히 설명해요.
    • 서비스가 스케일링 중이고 배포가 시작되면 green 태스크 세트가 생성되고 CodeDeploy는 green 태스크 세트가 안정 상태에 도달할 때까지 최대 한 시간을 기다리며, 그 전에는 트래픽을 이동하지 않아요.
    • 서비스가 블루/그린 배포를 진행 중이고 스케일링 이벤트가 발생하면 트래픽은 5분 동안 계속 이동돼요. 서비스가 5분 내에 안정 상태에 도달하지 않으면 CodeDeploy는 배포를 중지하고 실패로 표시해요.
  • Fargate 또는 CODE_DEPLOY 배포 컨트롤러 유형을 사용하는 태스크는 DAEMON 스케줄링 전략을 지원하지 않아요.
  • CodeDeploy 애플리케이션과 배포 그룹을 처음 만들 때 다음을 지정해야 해요.
    • 로드 밸런서에 대해 두 개의 대상 그룹을 정의해야 해요. 한 대상 그룹은 Amazon ECS 서비스가 생성될 때 로드 밸런서에 대해 정의된 초기 대상 그룹이어야 해요. 두 번째 대상 그룹의 유일한 요구 사항은 서비스가 사용하는 로드 밸런서와 다른 로드 밸런서에 연결될 수 없다는 것이에요.
  • Amazon ECS 서비스에 대해 CodeDeploy 배포를 만들면 CodeDeploy는 배포에 교체 태스크 세트(green 태스크 세트)를 만들어요. 로드 밸런서에 테스트 리스너를 추가했다면 CodeDeploy는 테스트 트래픽을 교체 태스크 세트로 라우팅해요. 이때 검증 테스트를 실행할 수 있어요. 그런 다음 CodeDeploy는 배포 그룹의 트래픽 재라우팅 설정에 따라 원래 태스크 세트에서 교체 태스크 세트로 프로덕션 트래픽을 재라우팅해요.

필수 IAM 권한 (Required IAM permissions)

블루/그린 배포는 Amazon ECS와 CodeDeploy API의 조합으로 가능해요. 사용자는 AWS Management Console, AWS CLI 또는 SDK에서 Amazon ECS 블루/그린 배포를 사용하기 전에 이러한 서비스에 대한 적절한 권한이 있어야 해요.

서비스를 만들고 업데이트하는 표준 IAM 권한 외에도 Amazon ECS에는 다음 권한이 필요해요. 이러한 권한은 AmazonECS_FullAccess IAM 정책에 추가되었어요. 자세한 내용은 AmazonECS_FullAccess를 참고하세요.

codedeploy:CreateApplication codedeploy:CreateDeployment codedeploy:CreateDeploymentGroup codedeploy:GetApplication codedeploy:GetDeployment codedeploy:GetDeploymentGroup codedeploy:ListApplications codedeploy:ListDeploymentGroups codedeploy:ListDeployments codedeploy:StopDeployment codedeploy:GetDeploymentTarget codedeploy:ListDeploymentTargets codedeploy:GetDeploymentConfig codedeploy:GetApplicationRevision codedeploy:RegisterApplicationRevision codedeploy:BatchGetApplicationRevisions codedeploy:BatchGetDeploymentGroups codedeploy:BatchGetDeployments codedeploy:BatchGetApplications codedeploy:ListApplicationRevisions codedeploy:ListDeploymentConfigs codedeploy:ContinueDeployment sns:ListTopics cloudwatch:DescribeAlarms lambda:ListFunctions

참고: 태스크와 서비스를 실행하는 데 필요한 표준 Amazon ECS 권한 외에도 사용자는 태스크용 IAM 역할을 사용하려면 iam:PassRole 권한이 필요해요.

CodeDeploy는 Amazon ECS API 호출, Elastic Load Balancing 수정, Lambda 함수 호출, CloudWatch 알람 설명을 위한 권한과 사용자를 대신해 서비스의 desired count를 수정할 권한이 필요해요. 블루/그린 배포 유형을 사용하는 Amazon ECS 서비스를 만들기 전에 IAM 역할(ecsCodeDeployRole)을 만들어야 해요. 자세한 내용은 Amazon ECS CodeDeploy IAM Role을 참고하세요.