AWS 서비스를 이용하여 BlueGreen 무중단 배포를 구현하는 실습 과정을 본 글로 마무리하려고 한다.
따라서 이번 글에서는 EC2 인스턴스 생성부터 최종 CodeDeploy 활용하여 배포까지 다뤄보려 한다.
Step 1. IAM 역할 설정
IAM 역할 설정 알아보기
본격적으로 IAM 역할 설정을 진행하기에 앞서 해당 서비스가 무엇인지 간단하게 개념을 알아보자.
먼저 IAM은 사용자의 접근 권한을 관리하는 서비스로, 회사에서 AWS를 사용하는 경우 사용하는 리소스에 대한 서비스 엑세스 권한을 지정할 수 있는 것을 의미한다. IAM 구성요소로는 IAM User, Groups, Policy, Role로 나눌 수 있다.
그 중 본 실습에서 필요로 하는 IAM Role (역할)에 대해 알아보려고 한다.
IAM 역할을 간단하게 설명하면 리소스에 대한 액세스 권한이 없는 사용자나 서비스에게 일시적으로 권한을 위임 하는 것이다. 예를 들어 권한이 없는 EC2 인스턴스가 S3 버킷에 접근하려면 정책을 설정해줄 수 있지만, 이제 더이상 해당 서비스를 이용하지 않는 경우 이 정책에 대한 설정을 하나하나 수정하고 업데이트 해주어야 하는 번거로움이 있다.
이를 더욱 편리하게 할 수 있는 방법이 바로 IAM 역할 설정이다. 역할을 통해 '임시적인 자격 증명서'를 EC2 인스턴스에게 부여함으로써 역할에 연결된 권한을 사용할 수 있게 된다. 따라서, 역할(Role)이란, AWS 리소스가 무엇을 할 수 있는지를 정의하는 자격증명서라고 볼 수 있다.
✅ IAM 역할(Role) 장점
- 보안 자격증명을 공유할 필요가 없음 (보안 향상)
- 언제든지 접근 권한 회수 가능 (강력한 권한 제어)
- 각 사용자에게 매번 필요한 권한을 일일이 부여할 필요 없음
📂 출처
[AWS] 📚 IAM 개념 원리 & IAM 계정 · 정책 생성하기
EC2 Role 설정
먼저 EC2 인스턴스가 S3 버킷 내의 데이터를 읽어올 수 있도록 정책을 추가한 역할을 생성해보자.
IAM 서비스 내의 '역할' 카테고리로 이동하여 '역할 생성' 버튼을 눌러준다
신뢰할 수 있는 엔터티 유형으로 'AWS 서비스'를 선택하고 사용 서비스로는 'EC2'로 선택한 후 '다음' 버튼을 누른다.
추가할 정책으로는 'AmazonEC2RoleforAWSCodeDeploy'를 검색 후 추가해주고 다음으로 넘어가자
다음 페이지에서 설정할 역할의 이름을 임의로 지정한 후 '역할 생성' 버튼을 누르면 위 이미지와 같이 역할이 생성된 것을 확인할 수 있다.
CodeDeployService Role 생성
마찬가지로 IAM Role 탭에서 '역할 생성'을 클릭한 후 이번에는 사용 서비스를 'CodeDeploy'로 선택한 후 다음으로 넘어간다
그럼 하나의 권한이 자동으로 추가될 것이다. 다음으로 넘어가고 임의로 이름 지정 후 역할 생성 버튼을 누르면 역할이 생성된 것을 볼 수 있다.
우리는 CodeDeploy의 배포 유형을 블루/그린으로 할 것이기 때문에 해당 역할에 정책을 하나 더 추가해주어야 한다.
앞서 생성한 역할에서 '권한 추가'를 선택하여 인라인 정책을 생성해주자.
권한 지정의 정책 편집기에서 '시각적'이 아닌 'JSON'을 선택하면 직접 정책을 작성할 수 있다. 해당 부분에 아래 JSON 정책을 작성하여 추가해보자.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"iam:PassRole",
"ec2:CreateTags",
"ec2:RunInstances"
],
"Resource": "*"
}
]
}
위 정책은 다음 3가지의 권한을 가지고 있다.
- IAM: EC2 인스턴스가 시작될 때 특정 IAM 역할을 해당 인스턴스에 할당할 수 있는 권한을 부여한다.
- EC2: 인스턴스나 관련 리소스에 태그를 추가할 수 있는 권한이다.
- EC2: 새로운 EC2 인스턴스를 시작할 수 있는 권한이다.
최종적으로 위와 같이 해당 CodeDeployService와 관련된 역할에 총 2개의 정책이 추가된 것을 확인할 수 있다.
Step 2. 로드밸런서 설정
로드밸런서 알아보기
본격적인 로드밸런서 설정에 앞서, 로드밸런서가 무엇인지 알아보자.
로드밸런서는 서버에 가해지는 부하(= 로드)를 분산(= 밸런싱) 해주는 장치 또는 기술을 말한다. 로드밸런서를 활용하여 쏟아지는 트래픽에 대해 여러 대의 서버로 분산해주는 즉, 하나의 서버에 모든 트래픽이 몰리지 않도록 하는 것을 바로 로드밸런싱이라고 한다.
AWS에서는 이 서비스를 어떻게 사용하고 있을까?
바로 ELB (Elastic Load Balancing)으로 로드밸런싱 기능을 제공하고 있다. ELB는 하나 이상의 가용 영역에 있는 애플리케이션에 들어오는 트래픽을 자동으로 분산하는 기능이다.
AWS에서 제공하는 로드밸런서의 종류는 총 CLB (Classic Load Balancer), ALB (Application Load Balancer), NLB (Network Load Balancer), GWLB (Gatway Load Balancer)로 4개이며 ELB는 AWS의 로드밸런스 종류 전체를 통틀어 칭하는 말이라고 한다. 우리는 이 4가지 로드밸런서 중 ALB를 사용하려 한다.
ALB는 가장 많이 사용되는 로드밸런서로 다음과 같은 특징을 갖고 있다.
✅ ALB 특징
- HTTP/HTTPS을 지원한다.
- Layer 7에서 동작 (Application 계층에서 동작)
- 고급 라우팅 기능을 지원한다.
- Path-Based Routing(경로 기반 라우팅), Host-Based Routing(호스트 기반 라우팅) ,URL 쿼리 문자열에 따른 라우팅
- (Docker) 컨테이너화된 애플리케이션과의 통합을 용이하게 한다.
- 고정 IP 주소(Elastic IP)를 사용할 수 없다.
- 고정 IP 주소를 사용할 수 있는 NLB를 앞에 놓아 고정 IP 주소가 있는 것처럼 사용 할 수는 있다.
📂 출처
- https://jibinary.tistory.com/196
- [Network] 로드밸런서(Load Balancer)란 ?
대상 그룹 생성
로드밸런서 생성에 앞서, 대상 그룹을 생성해주어야 한다.
EC2 서비스 내 '대상 그룹' 카테고리로 이동하여 '대상 그룹 생성' 버튼을 클릭하자
대상 유형으로는 '인스턴스'를 선택하고 희망하는 이름으로 대상 그룹 이름을 설정해준다.
프로토콜과 포트는 각각 HTTP, 8080 포트로 설정해준다 포트번호가 8080인 이유는 최종적으로 배포하고자 하는 애플리케이션인 WebGoat가 8080 포트를 지원하기 때문이다. VPC도 이전 게시글에서 생성한 VPC로 선택해준다.
상태 검사에 대한 부분은 프로토콜을 HTTP로 설정한 후 성공 코드를 200,404로 수정해주어야 한다. 성공 코드를 위와 같이 설정한 이유는 다음과 같다.
WebGoat에 일반적으로 접속할 때는 Webgoat/login 페이지로 리다이렉션 된다. 하지만 로그인 페이지로 리다이렉션에 실패할 경우 WebGoat에서는 404 에러를 표시할 수 있다. 이는 WebGoat에 접속이 실패한 것으로 보기 어렵기 때문에 404 코드도 함께 성공 코드로 포함시켜줄 수 있다.
만약 WebGoat가 아닌 다른 웹 애플리케이션을 배포할 예정이라면 해당 애플리케이션 내에 상태 검사를 수행하는 경로를 찾아 '상태 검사 경로'를 수정하고 성공 코드 또한 배포 환경에 맞추어 변경이 필요하다.
아직 등록한 대상을 따로 생성하지 않았기 때문에 우선 별도로 등록하지 않고 대상 그룹을 생성하면 위와 같이 대상 그룹 생성이 완료되었다.
로드밸런서 생성
로드밸런서 카테고리로 넘어와서 '로드밸런서 생성'을 클릭하여 로드밸런서를 생성해보자.
ALB를 사용할 것이기 때문에 로드밸런서의 유형으로 ALB를 선택한다.
로드밸런서의 이름을 임의로 설정하고 체계와 로드밸런서 IP 주소 유형의 경우 기본 설정 그대로 사용한다.
네트워크 매핑은 생성해둔 VPC와 연결해주고 가용영역 또한 생성한 가용영역을 모두 선택해준다.
보안 그룹은 앞서 로드밸런서를 위해 생성해둔 보안 그룹을 연결하고 리스너 또한 80 포트로 설정하고 요청을 라우팅할 대상 그룹으로는 앞서 생성한 대상 그룹을 선택하여 라우팅 요청의 기본 작업을 설정할 수 있다.
이후 '로드 밸런서 생성' 버튼을 누르면 위와 같이 로드밸런서가 정상적으로 생성된다.
Step 3. 인스턴스 & AMI 생성
AMI & 시작 템플릿 알아보기
CodeDeploy를 사용해서 블루/그린 배포를 하는 과정에서 왜 AMI와 시작 템플릿이 필요할까?
바로 CodeDeploy와 연결해줄 AutoScaling Group을 설정하는 과정에서 시작 템플릿을 사용하여 설정해주기 때문이다. 그럼 시작 템플릿 생성을 위해 필요한 AMI는 무엇이고 각각은 어떤 역할을 하는지 간단히 알아보자.
먼저 AMI는 인스턴스를 시작할 때 필요한 정보를 제공하는 것으로 동일한 구성의 인스턴스가 여러 개 필요할 때는 한 AMI를 활용하여 여러개의 인스턴스를 시작할 수 있다. AWS에서는 AMI를 위한 인스턴스를 생성하여 원하는 구성으로 설정을 마친 후 이를 'AMI화' 즉, 이미지로 생성하여 인스턴스 생성 및 시작템플릿 생성 등에 활용할 수 있다.
시작템플릿은 EC2 인스턴스 시작에 필요한 구성 정보를 모아둔 템플릿으로 이를 활용하여 인스턴스의 시작을 효율화, 간소화 및 표준화 등이 가능하다. 일반적으로 시작템플릿은 AMI를 활용하여 생성할 수 있다.
📂 참고자료
- https://kyounggu.tistory.com/49
- https://lannstark.tistory.com/115
- https://velog.io/@ghldjfldj/AWS-AMI%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80
인스턴스 생성
AMI 생성을 위해서 인스턴스를 하나 생성해보자.
EC2 대시보드에서 '인스턴스' 카테고리로 이동하여 '인스턴스 시작' 버튼을 선택한다.
인스턴스 이름은 임의로 설정한 후 AMI로 우분투 서버를 위 이미지와 같이 설정해줄 수 있다.
인스턴스 유형은 't3.medium'으로 하고 인스턴스에 접속하기 위해 생성해둔 키페어 또한 선택해주었다. WebGoat의 경우 가볍지만은 않은 서비스이기 때문에 원활한 동작을 위해 인스턴스를 t3.medium으로 설정해두었다.
VPC, 서브넷, 보안그룹도 기존에 생성해둔 것으로 설정해줄 수 있다.
네트워크 설정 하단에 있는 고급 네트워크 구성에서 보안 그룹이 잘 연결되어있는지 확인해준다.
마지막으로 하단에 있는 IAM 인스턴스 프로파일도 설정해주어야 한다. IAM 인스턴스 프로파일 설정까지 마치면 인스턴스 생성이 완료 된다.
📌 IAM 인스턴스 프로파일 설정 이유
인스턴스가 필요로 하는 AWS 리소스에 접근할 수 있는 권한을 안전하고 효과적으로 제공하기 위해 EC2 인스턴스를 생성할 수 있다. 인스턴스 프로파일은 IAM 역할에 연결되어 있으며, 이를 통해 EC2 인스턴스가 AWS 서비스와 상호작용할 수 있다.
인스턴스로 AMI화 하기전에 해당 인스턴스에 CodeDeploy Agent와 Java를 설치해주어야 한다. 생성된 인스턴스를 클릭하고 '연결' 버튼을 누르면
해당 인스턴스에 접속할 수 있는 ssh 명령어를 볼 수 있다.
로컬 환경에서 키페어가 들어있는 폴더에서 powershell을 열어 해당 명령어를 입력하면 위 이미지와 같이 생성한 인스턴스에 접속할 수 있다.
자바 설치는 다음 명령어를 활용하여 설치할 수 있다.
- sudo apt update
- sudo apt install openjdk-17-jdk
자바가 잘 설치되었는지 확인하기 위해 java -version 명령어를 입력하면 잘 설치된 것을 확인할 수 있다.
다음으로 CodeDeploy-Agent를 설치해보자. CodeDeploy Agent는 다음 명령어들로 설치할 수 있다.
- sudo apt install ruby-full
- sudo apt install wget
- wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
- chmod +x ./install
- sudo ./install auto
- sudo service codedeploy-agent status
- sudo service codedeploy-agent start
위 명령어로 설치가 완료되었다면 CodeDeploy Agent가 인스턴스에서 자동으로 설치 및 실행이 이루어질 수 있도록 자동화를 수행해주어야 한다.
- sudo systemctl enable codedeploy-agent
- sudo systemctl status codedeploy-agent
이는 위 두 명령어로 수행해주어야 한다.
AMI 생성
인스턴스 설정이 완료되었다면 이제 해당 인스턴스를 이미지화 해주어야 한다.
앞서 생성한 인스턴스를 클릭하고 작업 → 이미지 및 템플릿 → 이미지 생성 버튼을 눌러 이미지를 생성해보자
이미지 이름을 임의로 설정하고 '이미지 생성' 버튼을 누르면 AMI 카테고리에서 이미지가 생성된 것을 확인할 수 있다.
시작 템플릿 생성
시작 템플릿 카테고리로 이동하여 '시작 템플릿 생성' 버튼을 클릭해서 시작 템플릿을 만들어보자.
시작 템플릿 이름은 임의로 지정해준다
AMI는 앞서 생성한 이미지로 선택해줄 수 있다.
인스턴스 유형과 키 페어 또한 동일하게 t3.medium과 인스턴스 생성 시 연결한 키페어로 설정해주었다.
네트워크 설정의 경우 서브넷은 시작 템플릿에 포함하지 않고 기존 보안 그룹으로 애플리케이션 설정을 위해 생성해두었던 보안그룹으로 설정하고 고급 네트워크 구성에서 보안 그룹에 해당하는 퍼블릭 IP 자동 할당이 '활성화'로 설정될 수 있도록 변경해주어야 한다.
마지막으로 고급 세부 정보에서 IAM 인스턴스 프로파일만 앞서 만든 역할로 설정하고 '시작 템플릿 생성' 버튼을 눌러 시작 템플릿을 만들 수 있다.
Step 4. Auto Scaling 그룹 생성
다음으로 CodeDeploy를 위해 AutoScaling 그룹을 생성해보자. 우측 상단 'Auto Scaling Group 생성' 버튼을 눌러 생성해줄 수 있다.
1단계에서는 Auto Scaling Group의 이름과 시작 템플릿을 설정할 수 있다. 시작 템플릿의 경우 이전 단계에서 생성한 시작 템플릿을 선택하고 시작 템플릿이 최신 버전으로 업데이트 됨에 따라 업데이트 된 최신 버전의 시작 템플릿을 사용할 수 있도록 'Latest'로 버전을 선택해줄 수 있다.
2단계에서는 네트워크 설정을 해주어야 하는데 본 실습을 위해 생성했던 VPC와 서브넷으로 선택해준다.
3단계 로드 밸런싱 설정의 경우 앞서 생성해둔 로드밸런서와 연결해주어야 하기 때문에 '기존 로드 밸런서에 연결'을 선택하고 기존 로드 밸런서 대상 그룹으로 생성한 로드밸런서의 이름을 선택해줄 수 있다.
4단계 인스턴스 용량도 1로 설정하고 이 외 추가 설정 없이 'Auto Scaling 그룹 생성' 버튼을 누르면 ASG가 생성되는 것을 확인할 수 있다.
Step 5. CodeDeploy 생성
CodeDeploy로 이동하여 애플리케이션을 생성하고 배포까지 진행해보자. 애플리케이션 이름은 임의로 설정한 후 플랫폼으로 EC2를 선택하여 '애플리케이션 생성' 버튼을 눌러 애플리케이션을 생성해줄 수 있다.
다음으로 배포그룹을 만들어서 배포를 수행할 수 있다.
배포 그룹 이름은 임의로 설정하고 서비스 역할은 IAM 설정 당시 생성한 서비스 역할로 선택한다.
배포 유형으로는 블루/그린을 선택하고 환경 구성 부분에서 이전에 생성해둔 Auto Scaling 그룹을 선택한다.
우선 빠른 배포를 위해 배포 설정 대기시간은 0분으로 설정해주었고 로드밸런서 대상 그룹도 앞서 생성한 대상 그룹으로 선택이 완료되었다면 '배포 그룹 생성'을 선택하여 배포 그룹을 생성해줄 수 있다.
생성된 배포 그룹에서 우측 상단 배포 생성 버튼을 눌러 배포를 진행해보자.
배포 설정은 빌드 아티팩트가 저장된 S3 버킷의 URI를 넣고 파일의 형식을 zip으로 설정해준 후 '배포 만들기'를 선택하여 배포를 만들어줄 수 있다.
배포 그룹 생성을 완료하면 자동으로 배포가 시작되는데 배포가 성공적으로 완료된다면 위와 같은 화면을 확인할 수 있다.
AWS 활용 WebGoat BlueGreen 형태로 배포 완료!!
'Cloud > AWS' 카테고리의 다른 글
[CI/CD] Blue/Green 무중단 배포 - VPC (0) | 2024.09.17 |
---|---|
[CI/CD] Blue/Green 무중단 배포 - CodeBuild (3) | 2024.09.17 |
[Dreamhack] AWS의 보안 설정(2) (0) | 2024.09.09 |
[Dreamhack] AWS의 보안 설정(1) (0) | 2024.09.01 |
[Dreamhack] AWS Introduction (0) | 2024.08.26 |