이 포스팅은 AWS CodePipeline + ECR + Auto Scaling Group + EC2를 사용하여 Blue Green 배포를 해보는 과정을 담은 글입니다.
아키텍처
이 포스팅에서 구축할 아키텍처 구조는 위 그림과 같습니다.
IAM Role 생성
- EC2가 사용할 IAM 역할 생성
사용 사례에 EC2를 선택하고 배포를 위한 AmazonEC2RoleforAWSCodeDeploy, ECR, 파라미터 스토어 접근을 위한 AmazonEC2ContainerRegistryReadOnly, AmazonSSMReadOnlyAccess 정책을 연결한 다음 역할을 만들어 준다.
- CodeDeploy가 사용할 IAM 역할 생성
먼저 정책을 만들어 줘야 한다. 이 블로그에 설명되어 있듯, AWS Managed Policy에 Blue / Green 배포에 필요한 Action들이 추가가 안 돼 있어 사용자가 직접 정책을 만든 후 역할에 붙여줘야 한다. 정책 생성 -> JSON 탭으로 이동 후 밑 코드를 붙여넣기 한다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"iam:PassRole",
"ec2:CreateTags",
"ec2:RunInstances"
],
"Resource": "*"
}
]
}
적당히 이름을 붙이고 만들어 준다.
이제 역할을 만들어 준다. 역할 만들기 -> 사용 사례에서 CodeDeploy를 검색하고 선택한 다음 역할을 만든다. 그리고 위에서 만든 정책을 연결해준다.
ECR 레포지토리 생성
빌드한 도커 이미지를 업로드할 ECR 레포지토리를 생성해준다. ECR -> 레포지토리 -> 레포지토리 생성을 누른다.
- 표시 여부 설정: 프라이빗을 선택한다.
- 레포지토리 이름: ECR 레포지토리 이름이다. 적절히 입력한다.
Parameter Store 파라미터 생성
CodeBuild, CodeDeploy에서 ECR에 접근하기 위한 리전, 계정 정보, ECR 레포지토리 정보 등을 접근하기 위한 파라미터를 생성해야 한다. 코드에 직접 하드코딩할 수도 있지만, 보안을 위해 Parameter Store를 사용하는 것을 권장한다. 생성할 파라미터는 다음과 같다.
/CodePipeline/AWS_DEFAULT_REGION //AWS 리전
/CodePipeline/AWS_ACCOUNT_ID //AWS 계정ID (숫자 12자리)
/CodePipeline/IMAGE_REPO_NAME //ECR 레포지토리 이름 (URI가 아니다)
/CodePipeline/IMAGE_TAG //도커 태그 이름. latest를 입력한다.
System Manager -> 파라미터 스토어 -> 파라미터 생성을 누른 후, 이름과 값에 위 내용을 따라 적절히 입력한다.
시작 템플릿 생성
ASG를 만들기 전에 시작 템플릿이란 것을 만들어야 한다. 시작 템플릿이란 AMI, 키페어, 인스턴스 유형 등 인스턴스를 시작하는데 필요한 정보가 포함된 템플릿이다. ASG는 이 템플릿을 참조해 확장(Scale out)이벤트가 발생할 때 새로운 인스턴스를 만든다.
EC2 메뉴 -> 시작 템플릿 -> 시작 템플릿 생성을 누르자
- 시작 템플릿 이름: 말 그대로 템플릿 이름이다. 대충 지어준다.
- AMI: Quick Start에서 Amazon Linux 2를 선택한다.
- 인스턴스 유형, 키페어: 알맞게 선택해준다.
- 네트워크 설정: 서브넷은 시작 템플릿에 포함하지 않음을 선택한다.
- 보안 그룹: 새로운 보안그룹을 만들고 SSH와 HTTP를 열어준다. (나중에 접속하기 위함)
- 고급 네트워크 구성: 네트워크 인터페이스를 추가해주고 퍼블릭 IP 자동 할당을 활성화 해준다. 이걸 활성화 해줘야 EC2에 외부에서 접근할 수 있다.
- IAM 인스턴스 프로파일: 고급 세부정보를 열고 위에서 만든 IAM Role을 선택한다.
- 사용자 데이터: 아래 명령을 입력한다 EC2가 실행될 때 Docker와 CodeDeploy를 자동으로 설치하게 하기 위함이다.
#!/bin/bash
sudo yum install docker -y
sudo service docker start
sudo usermod -a -G docker ec2-user
sudo chmod 666 /var/run/docker.sock
yum install -y ruby
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
sudo systemctl start codedeploy-agent
생성 후 ASG 생성 창으로 이동한다.
ASG 생성
ASG(오토스케일링 그룹)은 트래픽 혹은 하드웨어 사용량에 따라 인스턴스의 개수를 조정해주는 서비스이다. EC2 -> Auto Scaling 그룹 -> Auto Scaling 그룹 생성을 누르자.
- Auto Scaling 그룹 이름: ASG의 이름이다. 대충 지어준다.
- 시작 템플릿: 위에서 만든 템플릿을 선택해 준다.
- 가용 영역 및 서브넷: 여러 가용영역에 걸쳐 public 서브넷을 선택한다. 여러 가용영역을 지정해야 ASG에서 확장(Scale out)할 때 여러 가용영역에 걸쳐 고르게 인스턴스를 생성한다.
- 로드밸런싱: 새 로드밸런서에 연결을 선택한다.
- 로드밸런서 유형: Applicaiton Load Balancer를 선택한다.
- 로드 밸런서 체계: 외부에서 접근하기 위해 Internal-Facing을 선택한다.
- 대상 그룹: 새 대상 그룹 생성을 누른다.
- 원하는 용량: 처음 실행될 인스턴스의 개수이다.
- 최소 용량: 인스턴스가 최대로 축소됐을 때의 개수이다.
- 최대 용량: 인스턴스가 최대로 확장됐을 때의 개수이다.
- 크기 조정 정책: 대상 추적 크기 조정 정책을 선택한다.
CodePipeline 생성
CodePipeline -> 파이프라인 -> 파이프라인 생성을 누른다.
- 파이프라인 이름: 파이프라인 이름이다. 대충 지어준다.
- 서비스 역할: 새 서비스 역할을 선택한다.
- 아티팩트 스토어: 빌드 후 코드 파일인 아티팩트를 저장할 곳을 지정할 수 있다. 기본 위치로 지정한다.
- 암호화 키: 아티팩트를 암호화할 키를 지정할 수 있다. AWS에서 제공해 주는 것과 KMS를 통해 직접 관리할 수 있다. AWS 관리형 키를 선택한다.
Source Stage
이 포스팅에선 이 레포지토리의 소스를 사용한다.
- 소스 공급자: Github(버전 2)를 선택한다. 버전1은 AWS에서 권장하지 않는다고 한다.
- 연결: Github에서 데이터를 가져오기 위해 연결을 생성해야 한다. 이 블로그에 자세히 설명되어 있다.
- 브랜치: 브랜치를 선택한다.
Build Stage
- 빌드 공급자: CodeBuild를 선택한다.
아직 CodeBuild 프로젝트를 만들지 않았기 때문에 프로젝트 생성을 통해 생성 창으로 이동한다.
- 프로젝트 이름: CodeBuild 프로젝트 이름이다. 대충 지어준다.
- 환경 이미지: CodeBuild가 돌아갈 환경을 선택할 수 있다. 자신이 따로 도커 이미지를 만들거나 AWS에서 제공하는 Amazon Linux 2, Ubuntu 중 선택할 수 있다. Amazon Linux 2 를 선택한다.
- 런타임, 이미지, 이미지 버전: 모두 최신 버전을 선택한다.
- 권한이 있음: 도커 이미지를 빌드 후 ECR에 업로드하기 위해 활성화해준다.
그리고 빌드 시에 Parameter Store에 접근하고, ECR 레포지토리에 이미지를 푸시하기 위해 생성된 CodeBuild Role에 AmazonSSMReadOnlyAccess, AmazonEC2ContainerRegistryFullAccess 정책을 붙여준다.
Deploy Stage
- 배포 공급자: CodeDeploy를 선택한다.
아직 CodeDeploy 애플리케이션을 만들지 않았기 때문에 CodeDeploy -> 애플리케이션 -> 애플리케이션 생성을 통해 생성 창으로 이동한다.
- 이름: CodeDeploy 애플리케이션 이름이다. 적당히 지어준다.
- 컴퓨팅 플랫폼: EC2/온프레미스 를 선택한다
애플리케이션 생성후엔 배포 그룹을 만들어야 한다. 사실 이게 배포를 어떤식으로 할지 설정하는 본체라고 할 수 있다. 배포 그룹 생성 을 누른다.
- 배포 그룹 이름: 배포 그룹 이름이다. 적당히 지어준다.
- 서비스 역할: 위에서 만든 역할을 붙여준다.
- 배포 유형: 블루/그린 을 선택한다.
- 환경 구성: Amazon EC2 Auto Scaling 그룹 자동 복사를 선택한 후, 위에서 만든 ASG를 선택한다.
- 배포에 성공한 다음 원본 환경의 인스턴스를 종료할지 여부와 종료 전 대기 시간 선택: 원본 인스턴스 종료를 선택한 후, 시간을 0분으로 설정한다.
- 로드 밸런서: Application Load Balancer를 선택하고 ASG를 생성할 때 만든 대상그룹을 선택한다.
이제 CodePipeline으로 넘어와서 애플리케이션과 배포 그룹을 선택한 뒤 생성한다.
배포 성공
이렇게 모두 초록색이 뜬다면 성공이다. 이제 로드밸런서로 접근해 보자.
이렇게 배포된 ASG에 잘 로드밸런싱 되고 있는 모습이다.
Ghost