티스토리 뷰
AWS CodeDeploy를 사용하여 블루/그린 배포 방식을 적용하기로 했습니다.
* 블루/그린 배포
: ECS 에서는 서비스를 생성할때 rolling update 또는 blue/green 방식으로 update 방식을 결정할 수 있다. (서비스 생성 이후에는 수정 불가)
rolling update는 신규 버전의 health check 가 통과하면 이전 버전을 바로 내리기 때문에, rollback 이 필요한 경우 다시한번 서비스 업데이트 과정을 거쳐야하는 문제가 있다. (만약 이전버전의 이미지가 없다면 code build부터 다시해야 한다.)
반면 블루/그린 업데이트 방식은 이전 버전의 어플리케이션이 구동되어 있는 상태에서 신규버전의 어플리케이션을 함께 구동시킬수 있기 때문에, 트래픽을 신규 버전으로 라우팅 하기전, 새로운 버전으로 테스트할 수 있다. 또한 배포 프로세스를 모니터링 하다가 문제가 발생하면 이전 버전으로 신속하게 롤백이 가능하다.
아래에서는 rolling update 와 다른 점만 설명합니다.
1. 준비
- ECR에 올릴 도커 이미지
- ECS 클러스터
- ALB 설정 (이름 : sample-website-alb 로 가정)
- 보안그룹 설정
* 모두 동일 리전에 있다고 가정함.
2. IAM 서비스 역할 설정
배포 과정 중 codedeploy는 ECS API 호출, 로드밸런서 수정, lambda 함수 호출, cloudwatch 경보 기술 등의 권한이 필요합니다. 따라서 블루/그린 배포를 설정하기 전 IAM 역할 부터 생성합니다.
- IAM 콘솔 이동
- 왼쪽 네비게이션에서 [역할] 선택 후 [역할 만들기] 클릭
- 이 역할을 사용할 서비스 선택에서 CodeDeploy 선택
- 사용사례 선택에서 CodeDeploy-ECS 선택, 다음: 권한 클릭
- 다음: 태그 클릭
- 필요한 경우 태그 추가 후 다음: 검토 클릭
- 역할이름에 ecsCodeDeployRole을 입력하고 설명 입력 후, 역할 생성을 클릭
- 좀 더 자세한 설정이 필요한 경우 다음 링크를 참고합니다.
https://docs.aws.amazon.com/ko_kr/AmazonECS/latest/developerguide/codedeploy_IAM_role.html
3. application load balancer 에 대상그룹 과 보안그룹 수정
- ALB를 위한 보안그룹 설정에서 inbound에 테스트용 포트를 하나더 추가합니다.
여기서는 80이 서비스 포트, 8080이 테스트 포트라고 가정
- 마찬가지로 대상 그룹도 하나더 추가합니다.
* 서비스용 대상그룹 : sample-website-tg-1, 테스트 대상그룹: sample-website-tg-2 (주의: 대상 그룹 생성시 ip를 사용하도록 선택해야 합니다.)
- ALB 라우팅 설정에서 테스트용 리스너를 하나더 추가합니다. (포트는 8080, 대상그룹은 prod-web-tg2)
4. ECS 신규 서비스 생성
- 기존 작업정의 선택 후 작업 -> 서비스 생성 클릭
- [Configure service] 구성하기
- [Launch type]으로 [FARGATE]를 선택합니다.
- 애플리케이션 작업을 실행할 클러스터를 선택합니다.
- [Service Name]에 [Sample-Website]를 입력합니다.
- [Number of tasks]에 서비스를 실행할 작업의 수를 지정합니다. (여기서는 2개)
- [Deployments] 구성하기
- [Deployment type]에서 [Blue/green deployment (powered by AWS CodeDeploy)]를 선택합니다. 그러면 기본 설정을 사용하여 CodeDeploy 애플리케이션 및 배포 그룹이 생성됩니다. 나중에 CodeDeploy 콘솔에서 설정을 확인하고 편집할 수 있습니다.
- 서비스 역할은 이전에 생성한 CodeDeploy 서비스 역할을 선택합니다.
- [Next step]을 클릭합니다.
- [VPC and security groups] 구성하기
- [Subnets]에서 서비스에 사용할 서브넷을 선택합니다.
- [Security groups]에서 [Edit]를 선택합니다.
- [Assigned security groups]에 대해 [Select existing security group]을 선택합니다.
- [Existing security groups]에서 이전에 생성한 sample-website-sg 그룹을 선택합니다.
- [Save]를 클릭합니다.
- [Load Balancing] 구성하기
- [Application Load Balancer]를 선택합니다.
- [Load balancer name]에 대해 [sample-website-alb]를 선택합니다.
- [Container to load balance] 구성하기
- [Add to load balancer]를 선택합니다.
- [Production listener port]의 첫 번째 드롭다운 목록에서 [80:HTTP]를 선택합니다.
- [Test listener port]의 [Enter a listener port]에 [8080]을 입력합니다.
- [Additional configuration] 구성
- [Target group 1 name]에서 [sample-website-tg-1]을 선택합니다.
- [Target group 2 name]에 [sample-website-tg-2]를 입력합니다.
- [Service discovery (optional)]에서 [Enable service discovery integration]의 선택을 취소한 후 [Next step]을 선택합니다.
- Auto Scaling을 구성하지 마세요. [Next step]을 클릭합니다.
- 서비스의 정확도를 검토한 다음 [Create service]를 클릭합니다.
- 모든 항목이 성공적으로 생성되면 [View service]를 클릭합니다.
이제 새로 생성된 서비스에서 하나 이상의 작업이 실행 중인 것을 확인할 수 있습니다.
작업그룹이 잘 배포되고 있는지 확인하기 위해서는 EC2로 이동하여 대상그룹을 선택하면 알수 있습니다.
AWS CodeDeploy 콘솔에서는 Amazon ECS [Configure service] 마법사가 CodeDeploy 애플리케이션을 생성했음을 확인할 수 있습니다. 생성된 배포 그룹을 포함한 기타 세부 정보를 보려면 해당 애플리케이션을 클릭하세요.
배포 그룹 이름을 클릭하면 배포에 대한 세부 정보를 볼 수 있습니다. [Deployment type] 아래에 [Blue/green]이 표시됩니다. [Deployment configuration] 아래에는 CodeDeployDefault.ECSAllAtOnce가 표시됩니다. 이는 상태 검사에 통과하면 CodeDeploy가 Application Load Balancer의 리스너를 업데이트하여 트래픽의 100%를 타겟 환경(녹색)으로 전송한다는 것을 나타냅니다.
이제 기본 설정을 끝났고 서비스 업데이트를 적용하여 CodeDeploy가 제대로 작동하는지 확인합니다.
5. 작업 정의 수정본 생성 및 서비스 업데이트
- 설명 생략
6. Code Deploy 확인
아래와 같이 나온다면 모두 정상적으로 끝난 상태입니다.
- 우선 3단계까지 통과한 뒤라면 배포는 성공한 것이며, ALB에서 라우팅이 sample-website-tg-1 에서sample-website-tg-2로 변경된 것을 확인 할 수 있습니다.
- 4단계는 기존버전과 신규버전의 어플리케이션이 동시에 유지되는 단계로 1시간 후에 기존 작업 세트를 종료합니다. AWS CodeDeploy 콘솔에서 대기 시간을 줄일 수 있습니다. 작업 세트가 종료되면 CodeDeploy가 배포 완료를 표시합니다.
'dev > aws' 카테고리의 다른 글
EC2에 proxy 서버 설정하기 (0) | 2019.12.11 |
---|---|
AWS S3와 CloudFront로 정적 파일 배포하기 (0) | 2019.12.09 |
AWS EC2 FTP 설정 (0) | 2019.11.26 |
RDS maria db 생성시 추가해야할 설정 (0) | 2019.03.19 |
AWS 에서 non-www 를 www 로 리다이렉트 (0) | 2019.03.19 |
- Total
- Today
- Yesterday
- Galaxy Emulator
- nativescript-vue
- session stroage
- 긴급재난지원금
- AVD
- 다국어
- vuex-persistedstate
- MariaDB
- Vue 다국어
- Add AVD
- vs code flutter
- 경로 초기화
- ag grid
- 한글 like
- dynamic component
- Android Studio Emulator
- vue android
- i18n
- ag-grid
- 플러터 디버그
- 에뮬레이터
- ec2
- vue mobile
- vue
- vs code fultter debug
- 갤럭시 에뮬레이터
- aws
- vue ios
- 로그
- v-iterator
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |