Amazon Web Services 한국 블로그

AWS CodeDeploy기반 AWS Fargate와 Amazon ECS 서비스 블루/그린 방식 배포 하기

AWS Fargate 및 Amazon ECS(Amazon Elastic Container Service)에서 호스팅되는 서비스에 대한 블루/그린 배포 지원을 위한 기능 추가 소식을 알려드립니다.

AWS CodeDeploy에서 블루/그린 배포를 사용하면 애플리케이션 업데이트로 인한 다운타임을 최소화할 수 있습니다. 블루/그린 배포 방식을 사용하면 이전 버전 어플리케이션이 구동되어 있는 상태에서 신규 버전의 어플리케이션을 함께 런칭할 수 있습니다. 이로 인해 트래픽을 신규 버전으로 라우팅하기 전, 새로운 어플리케이션을 테스트할 수 있습니다. 또한 배포 프로세스를 모니터링하다 문제가 발생하면 이전 버전으로 신속하게 롤백할 수 있습니다.

새로 추가된 블루/그린 배포 지원 기능을 활용하면 AWS Fargate 또는 Amazon ECS에서 CodeDeploy를 사용하여 배포, 테스트 및 트래픽 전환을 자동으로 관리하는 새 서비스를 생성할 수 있습니다. 사용자가 서비스를 업데이트하면 CodeDeploy가 배포를 트리거합니다. 이 배포는 Amazon ECS와 함께 작동하여 대상 그룹(녹색)에 새 버전의 서비스를 배포하고, 신규 버전을 테스트할 수 있도록 로드 밸런서의 리스너를 업데이트하고, 상태 검사에 통과할 경우 전환을 수행합니다.

이 게시물에서는 AWS CodeDeploy를 사용하여 AWS Fargate 및 Amazon ECS에 대한 블루/그린 배포를 구성하는 방법을 설명합니다. AWS CodePipeline 및 Amazon ECR에서 지속적 전달 (Continuous Delivery) 파이프라인을 사용하여 end-to-end 자동화를 구성하는 방법에 대한 내용은 Build a Continuous Delivery Pipeline for Your Container Images with Amazon ECR as Source를 참조하십시오.

이제 좀 더 구체적으로 살펴보겠습니다.

사전 준비

이 글에서 소개될 방법을 실습하기 위해서는 다음 리소스가 필요합니다.

  • Dockerfile 및 애플리케이션 원본에서 작성한 이미지를 포함하는 도커 이미지 리포지토리. 이 실습에서는 Amazon ECR를 사용합니다. 자세한 내용은 Amazon Elastic Container Registry 사용 설명서리포지토리 생성이미지 푸시를 참조하시기 바랍니다.
  • Amazon ECS 클러스터. Amazon ECS를 처음 사용할 때 생성된 기본 클러스터를 사용하거나, Amazon ECS 콘솔의 [Clusters] 페이지에서 [Networking only] 클러스터를 선택할 수 있습니다. 자세한 내용은 Amazon Elastic Container Service 사용 설명서클러스터 생성을 참조하시기 바랍니다.

참고: 이미지 리포지토리와 클러스터를 동일한 AWS 리전에 생성해야 합니다.

IAM 서비스 역할 설정

Amazon ECS에 대한 애플리케이션 배포에 AWS CodeDeploy를 사용하므로 Amazon ECS API를 호출하고, 로드 밸런서를 수정하고, Lambda 함수를 호출하고, CloudWatch 경보를 기술할 수 있는 권한이 AWS CodeDeploy에 필요합니다. 블루/그린 배포를 사용할 Amazon EC2 서비스를 생성하려면 먼저 AWS CodeDeploy IAM 역할(ecsCodeDeployRole)을 생성해야 합니다. 자세한 지침은 Amazon ECS 개발자 안내서Amazon ECS CodeDeploy IAM 역할을 참조하세요.

Application Load Balancer 생성

AWS CodeDeploy와 Amazon ECS가 여러 버전의 Amazon ECS 서비스에 대한 트래픽 흐름을 제어할 수 있도록 Application Load Balancer를 생성합니다.

Application Load Balancer 생성의 단계에 따라 아래 네 가지 수정 사항을 적용하세요.

  1. 로드 밸런서 정의 섹션의 6a 단계에서 로드 밸런서 이름을 sample-website-alb로 지정합니다.
  2. 보안 그룹 구성 섹션의 2단계에서 다음을 수행합니다.
    1. [Security group name]에 sample-website-sg를 입력합니다.
    2. 모든 위치(0.0.0.0/0)에서 TCP 포트 8080을 허용하는 규칙을 추가합니다.
  3. 라우팅 구성 섹션에서 다음을 수행합니다.
    1. [Name]에 sample-website-tg-1을 입력합니다.
    2. [Target type]에서 IP 주소를 사용하여 대상을 등록하도록 선택합니다.
  4. 컨테이너 인스턴스에 대한 보안 그룹 규칙 만들기 섹션의 단계를 건너뜁니다.

Amazon ECS 작업 정의 생성

이미지 리포지토리에 호스팅된 도커 이미지를 참조하는 Amazon ECS 작업 정의를 생성합니다. 이 실습에서는 Fargate 시작 유형과 아래의 작업 정의를 사용합니다.

{
  "executionRoleArn": "arn:aws:iam::account_ID:role/ecsTaskExecutionRole",
  "containerDefinitions": [{
    "name": "sample-website",
    "image": "<YOUR ECR REPOSITORY URI>",
    "essential": true,
    "portMappings": [{
      "hostPort": 80,
      "protocol": "tcp",
      "containerPort": 80
    }]
  }],
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "networkMode": "awsvpc",
  "cpu": "256",
  "memory": "512",
  "family": "sample-website"
}

참고: “image” 값을 사전 준비 단계에서 생성하여 Amazon ECR에 업로드한 이미지의 Amazon ECR 리포지토리 URI로 변경해야 합니다.

블루/그린 배포를 사용한 Amazon ECS 서비스 생성

사전 조건 및 설정 단계를 완료했으므로 이제 AWS CodeDeploy의 블루/그린 배포 지원을 통해 Amazon ECS 서비스를 생성할 수 있습니다.

Amazon ECS 서비스 생성

  1. https://console.thinkwithwp.com/ecs/에서 Amazon ECS 콘솔을 엽니다.
  2. 클러스터 목록에서 작업을 실행하기 위해 이전에 생성한 Amazon ECS 클러스터를 선택합니다.
  3. [Services] 탭에서 [Create]를 선택합니다.

그러면 [Configure service] 마법사가 열립니다. 여기에서 AWS Fargate와 AWS CodeDeploy를 활용한 애플리케이션의 배포와 실행 및 업데이트에 필요한 모든 항목을 구성할 수 있습니다.

  1. [Configure service] 구성하기
    1. [Launch type]으로 [FARGATE]를 선택합니다.
    2. [Task Definition]은 이전에 생성한 sample-website 작업 정의를 선택합니다.
    3. 애플리케이션 작업을 실행할 클러스터를 선택합니다.
    4. [Service Name]에 [Sample-Website]를 입력합니다.
    5. [Number of tasks]에 서비스를 실행할 작업의 수를 지정합니다.
  2. [Deployments] 구성하기
    1. [Deployment type]에서 [Blue/green deployment (powered by AWS CodeDeploy)]를 선택합니다. 그러면 기본 설정을 사용하여 CodeDeploy 애플리케이션 및 배포 그룹이 생성됩니다. 나중에 CodeDeploy 콘솔에서 설정을 확인하고 편집할 수 있습니다.
    2. 서비스 역할은 이전에 생성한 CodeDeploy 서비스 역할을 선택합니다.
  3. [Next step]을 클릭합니다.
  4. [VPC and security groups] 구성하기
    1. [Subnets]에서 서비스에 사용할 서브넷을 선택합니다.
    2. [Security groups]에서 [Edit]를 선택합니다.
      1. [Assigned security groups]에 대해 [Select existing security group]을 선택합니다.
      2. [Existing security groups]에서 이전에 생성한 sample-website-sg 그룹을 선택합니다.
      3. [Save]를 클릭합니다.
  5. [Load Balancing] 구성하기
    1. [Application Load Balancer]를 선택합니다.
    2. [Load balancer name]에 대해 [sample-website-alb]를 선택합니다.
  6. [Container to load balance] 구성하기
    1. [Add to load balancer]를 선택합니다.
    2. [Production listener port]의 첫 번째 드롭다운 목록에서 [80:HTTP]를 선택합니다.
    3. [Test listener port]의 [Enter a listener port]에 [8080]을 입력합니다.
  7. [Additional configuration] 구성
    1. [Target group 1 name]에서 [sample-website-tg-1]을 선택합니다.
    2. [Target group 2 name]에 [sample-website-tg-2]를 입력합니다.
  8. [Service discovery (optional)]에서 [Enable service discovery integration]의 선택을 취소한 후 [Next step]을 선택합니다.
  9. Auto Scaling을 구성하지 마세요. [Next step]을 클릭합니다.
  10. 서비스의 정확도를 검토한 다음 [Create service]를 클릭합니다.
  11. 모든 항목이 성공적으로 생성되면 [View service]를 클릭합니다.

이제 새로 생성된 서비스에서 하나 이상의 작업이 실행 중인 것을 확인할 수 있습니다.

[Events] 탭에 Amazon ECS가 sample-website-tg-1 대상 그룹에 작업을 배포했는지 확인할 수 있습니다. 새로 고침 후에는 서비스가 안정적 상태로 나타나야 합니다.

AWS CodeDeploy 콘솔에서는 Amazon ECS [Configure service] 마법사가 CodeDeploy 애플리케이션을 생성했음을 확인할 수 있습니다. 생성된 배포 그룹을 포함한 기타 세부 정보를 보려면 해당 애플리케이션을 클릭하세요.

배포 그룹 이름을 클릭하면 배포에 대한 세부 정보를 볼 수 있습니다.  [Deployment type] 아래에 [Blue/green]이 표시됩니다. [Deployment configuration] 아래에는 CodeDeployDefault.ECSAllAtOnce가 표시됩니다. 이는 상태 검사에 통과하면 CodeDeploy가 Application Load Balancer의 리스너를 업데이트하여 트래픽의 100%를 타겟 환경(녹색)으로 전송한다는 것을 나타냅니다.

[Load Balancing]에서 대상 그룹과 프로덕션 리스너 ARN 및 테스트 리스너 ARN에 대한 세부 정보를 확인할 수 있습니다.

이제 서비스에 업데이트를 적용하여 CodeDeploy 배포가 작동하는지 확인해 보겠습니다.

CodeDeploy 블루/그린 배포 트리거

작업 정의 수정본 생성

배포를 테스트하기 위해 애플리케이션에 대한 작업 정의를 수정합니다.

  1. https://console.thinkwithwp.com/ecs/에서 Amazon ECS 콘솔을 엽니다.
  2. 탐색 창에서 [Task Definitions]를 선택합니다.
  3. sample-website 작업 정의를 선택한 다음 [Create new revision]을 선택합니다.
  4. [Tags]에서 다음을 수행합니다.
    1. [Add key]에 [Name]을 입력합니다.
    2. [Add value]에 [Sample Website]를 입력합니다.
  5. [Create]를 선택합니다.

ECS 서비스 업데이트

이제 작업 정의의 최신 버전을 사용하도록 Amazon EC2 서비스를 업데이트해야 합니다.

  1. https://console.thinkwithwp.com/ecs/에서 Amazon ECS 콘솔을 엽니다.
  2. Amazon EC2 서비스를 배포한 Amazon ECS 클러스터를 선택합니다.
  3. sample-website 서비스 옆의 확인란을 선택합니다.
  4. [Update]를 선택하여 [Update Service] 마법사를 엽니다.
    1. [Configure service] 아래의 [Task Definition]에 대해 [Revision] 드롭다운 목록에서 2 (latest)를 선택합니다.
  5. [Next step]을 선택합니다.
  6. [Configure deployments]를 건너뜁니다. [Next step]을 선택합니다.
  7. [Configure network]를 건너뜁니다. [Next step]을 선택합니다.
  8. [Set Auto Scaling (optional)]을 건너뜁니다. [Next step]을 선택합니다.
  9. 변경 내용을 검토한 후 [Update Service]를 선택합니다.
  10. [View Service]를 선택합니다.

이제 서비스의 블루/그린 배포에 대한 세부 정보를 볼 수 있는 [Deployments] 탭으로 이동합니다.

배포 ID를 클릭하면 CodeDeploy 배포의 세부 정보 보기로 이동하는데 여기에서 배포 상태를 확인할 수 있습니다.

트래픽 이동 진행 상황도 확인할 수 있습니다.

문제가 발견되면 배포를 중지하고 롤백할 수 있습니다. 그러면 트래픽이 기존 작업 세트(파란색)로 다시 이동하고 배포가 중지됩니다.

기본적으로 CodeDeploy는 배포를 성공하고 1시간 후에 기존 작업 세트를 종료합니다. AWS CodeDeploy 콘솔에서 대기 시간을 줄일 수 있습니다. 작업 세트가 종료되면 CodeDeploy가 배포 완료를 표시합니다.

결론

이 포스팅에서는 AWS CodeDeploy를 활용한 블루/그린 배포를 통해 AWS Fargate 기반 Amazon ECS 서비스를 생성하는 방법을 설명했습니다. AWS Management Console에서 Application Load Balancer 및 관련 대상 그룹과 같은 필수 구성 요소를 구성하는 방법도 함께 소개했습니다.  이 글에서 소개한 내용이 실제 애플리케이션 구현 작업에 도움이 되었으면 합니다.

– 이 글은 AWS DevOps BlogUse AWS CodeDeploy to Implement Blue/Green Deployments for AWS Fargate and Amazon ECS의 번역본입니다.