본문 바로가기
Coding/Python

ECS Blue/Green CodeDeploy 연동 배포 자동화 스크립트

by Hide­ 2019. 6. 21.
반응형


이전에 AWS ECS를 사용할 때 Deployment Type을 Blue/Green Deployment로 지정하여 배포하는 방법에 대해 포스팅했었다. (https://hides.tistory.com/1013) 해당 포스팅을 통해 서비스를 생성하면 CodeDeploy의 애플리케이션쪽에 자동으로 연관된 애플리케이션과 배포 그룹이 생성된다.


ECS콘솔에서 서비스를 선택하고 직접 업데이트 버튼을 눌러서 배포를 진행할수도 있지만 명령어를 한번 실행시키는 형태로 배포를 자동화시키고 싶었다. 그래서 awscli쪽을 알아보던 중 CodeDeploy관련 create-deployment를 이용하면 쉽게 가능할 것이라고 생각했다. 자세한 문서는 https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment.html를 참고하면 된다.


먼저 appspec.yml파일을 하나 생성하고 아래의 내용대로 채워넣는다.


{
"version": 1,
"Resources": [
{
"TargetService": {
"Type": "AWS::ECS::Service",
"Properties": {
"TaskDefinition": "TASK_DEFINITION_ARN_HERE",
"LoadBalancerInfo": {
"ContainerName": "CONTAINER_NAME_HERE",
"ContainerPort": 80
}
}
}
}
]
}


TASK_DEFINITION_ARN_HERE 부분에 작업 정의의 ARN을 채워넣는다. CONTAINER_NAME_HERE 에는 로드 밸런서와 연결시킬 컨테이너의 이름을 적고 아래에 포트를 같이 적어준다. 다음으로 deploy.sh파일을 하나 생성하고 아래의 내용으로 채워넣는다.


#!/bin/bash
echo "[*] Deploy Start"
aws s3 cp test_appspec.yaml s3://BUCKET_NAME_HERE/appspec.yaml
echo "[*] Upload appspec.yaml to S3 Done"
sleep 3
aws deploy \
create-deployment \
--application-name CODEDEPLOY_APPLICATION_NAME_HERE \
--deployment-group-name CODEDEPLOY_DEPLOYMENT_GROUP_NAME_HERE \
--s3-location bucket=BUCKET_NAME_HERE,bundleType=yaml,key=appspec.yaml
echo "[*] Deploy Done"


BUCKET_NAME_HERE에 S3 버킷의 이름을 적어준다. 그리고 deploy.sh파일에 실행 권한을 준다음 실행하면 CodeDeploy를 자동으로 트리거하고 배포를 진행한다. 전체적인 흐름을 대략적으로 설명하자면 다음과 같다.


1. appspec.yml s3 버킷에 업로드

2. 업로드 한 appspec.yml파일을 참조하여 새로운 배포 생성


참고로 위 스크립트에는 appspec.yml을 삭제하는 명령은 따로 넣지 않았다. 그 이유는, s3 cp를 사용하여 파일을 업로드하면 기존에 이미 파일이 존재해도 새로 덮어쓰기 때문이다. 풀 소스는 아래 깃허브를 참고.


https://github.com/teamhide/ecs_codedeploy_script