Intro
AWS Code Deploy의 가장 강력한 기능 중 하나는 Traffic control 입니다. 실제 배포 대상을 설정하는 Deployment Group에 ELB를 선택하면 배포 대상으로 들어오는 트래픽을 차단하여 배포가 될때까지 Client의 유입 제어할 수 있습니다. 그렇게되면 서비스의 중단의 없이도 배포가 가능하게 되는것입니다.
하지만 Code Deploy의 한계가 분명히 존재합니다. Code Deploy는 모든 Use Case를 커버 하지 못합니다. 오늘은 Code Deploy가 커버 하지 못하는 대표적인 예를 하나 설명하고 이것을 커버할 수 있도록 구성 해보도록 하겠습니다.
code deploy 다중 ALB target 트래픽 제어하기
제목과 같이 Code Deploy가 커버하지 못하는 부분은 바로 다중 ALB target 트래픽 제어입니다. Deployment Group을 AWS콘솔에서 생성해보시면 아시겠지만 아래그림과 같이 target group을 한개만 선택할 수 있게 되어있습니다.
하지만 경우에 따라서 하나의 EC2에 여러 Application을 띄워서 사용하는 경우가 있는데 이 경우 ALB의 Target Group이 포트에 따라 여러개가 될 수 있습니다.
이 경우 Code Deploy를 통해 배포를 해야한다면 다중 ALB target group을 선택할 수 없기 때문에 다른 방법을 사용해야합니다.
어떻게 다중 ALB target group을 제어할지 설명드리기 전에 Code Deploy가 배포되는 프로세스를 알아 보도록 하겠습니다.
Code Deploy 배포 프로세스 (hook)
아래 그림은 code deploy가 배포되는 프로세스이며 각 단계를 hook이라고 부릅니다. 각 hook마다 특정 bash 스크립트를 동작할 수 있도록 하는 설정할 수 있는데요 이 설정 파일이 appspec.yml 입니다.
배포 하고자 하는 소스코드의 root 경로에 appspec.yml을 포함시키면 EC2에 설치된 Code deployement Agent가 이를 읽어들여서 hook에 설정되어있는 bash스크립트를 동작시키게 됩니다.
Code Deploy 의 Traffic 제어
code deploy의 배포프로세스에는 위 그림의 빨간색 체크와 같이 ELB를 설정하였을 경우 트래픽을 Block 해주고 다시 Allow 해주는 단계가 추가됩니다.
여기서 안타깝게도 실제 배포 설정을 하는 Deployment Group을 보면 ALB Target Group을 단일로만 등록할 수 있도록 되어있습니다. 그럼 어떻게 다중 ALB Target Group을 설정할 수 있을까요?
Code Deploy 다중 ALB Target Script 사용 하기
AWS에서 왜 다중 설정을 들어주지 않았는지는 모르겠습니다만 아래 AWS 공식 github에서는 이를 가능하게해주는 스크립트 소스를 제공해주고 있습니다.
https://github.com/aws-samples/aws-codedeploy-samples/tree/master/load-balancing/elb-v2
소스코드에는 아래와 같은 파일을 포함 합니다.
README 파일에 설명이 잘되어있지만 간단히 설명드리겠습니다.
- README.md
- appspec.yml : code deploy hook에 실행할 스크립트를 정의하는 파일
- common_functions.sh : 다중 alb target group을 설정 하는 파일
- deregister_from_elb.sh : alb target group에 대상을 deregister하는 파일 (block traffic)
- register_with_elb.sh : alb target group에 대상을 register하는 파일 (allow traffic)
- start_httpd.sh : application을 아파치라고 가정하여 httpd application을 시작하는 파일
- stop_httpd.sh : application을 아파치라고 가정하여 httpd application을 정지하는 파일
먼저 appspec.yml을 보면 ApplicationStop 와 ApplicationStart 각 hook에서 alb target group에 대상을 때었다(deregister_from_elb.sh) 붙혔다가(register_with_elb.sh) 하는 스크립트가 설정이 되어 있습니다.
version: 0.0
os: linux
files:
- source: /
destination: /tmp/elb-test
hooks:
ApplicationStop:
- location: deregister_from_elb.sh
- location: stop_httpd.sh
ApplicationStart:
- location: start_httpd.sh
- location: register_with_elb.sh
해당 예제를 사용하고자하는 분들은 아래와 같이 common_functions.sh 소스에 TARGET_GROUP_LIST
와 PORT
만 설정하여 사용하시면 됩니다. 참고로 Target group list는 스페이스바로 구분하여 여러 group을 설정할 수 있고, Port는 설정하지 않으면 Target group에 설정되어있는 port로 동작됩니다.
# TARGET_LIST defines which target groups behind Load Balancer this instance should be part of.
# The elements in TARGET_LIST should be seperated by space.
TARGET_GROUP_LIST=""
# PORT defines which port the application is running at.
# If PORT is not specified, the script will use the default port set in target groups
PORT=""
단점
하지만 아래 캡처와같이 커뮤니티에서는 위 스크립트를 권장하지 않는다고 합니다.
그 이유를 직접적으로 얘기해주지는 않지만 스크립트가 동작하지 않을 경우의 수가 존재하기 때문이지 않을까 싶습니다. 예를들어 OS에서 발생할 수 있는 이슈라 던지, 네트워크 이슈던지 Code Deployment Agent의 이슈라던지 다양한 케이스의 이슈 발생에 대해서 장애 트래킹이 어렵고 AWS에서 개런티 해주지 않기 때문에 왠만하면 다른 방법을 찾는 것이 건강에 좋다라는 것이 개인적인 의견입니다.
'IT > AWS' 카테고리의 다른 글
[AWS] EC2 Linux 인스턴스 재부팅시에도 UserData 실행하기 (0) | 2022.02.07 |
---|---|
[Terraform] local, variable, output, data 차이 (0) | 2022.02.06 |
[AWS] Code Deploy를 사용하기 전에 꼭 알아야할 것 (feat. Loosely Coupled) (0) | 2022.01.25 |
[트러블슈팅] AWS Nitro type EBS 마운트 안돼는 현상 (0) | 2022.01.24 |
[AWS] Image Builder Clean up작업 생략하기 (.ssh 초기화 생략) (0) | 2022.01.20 |