[AWS/Spring] Auto Scalable Spring 서버 구축하기

Kai·2023년 7월 5일
0

💻 시작


이번 글에서는 Auto scaling이 적용된 EC2 서버에 Spring 애플리케이션을 구동하는 환경을 구축해보도록 하겠다.

Github Action을 이용한 배포 자동화

이 글에서는 Github Action과 AWS CodeDeploy를 이용해서 CICD 자동화를 구축할 것이고, 자세히 설명하지 않을 것이다.
Github action과 CodeDeploy롤 CICD 자동화를 알고 싶다면, 이 시리즈를 참고하도록 하자.


스프링 앱 소개

이번 글에서 사용될 스프링 애플리케이션은 아~~주 간단한 애플리케이션이다. ㅎㅎ
현재 스프링 애플리케이션이 구동중인 서버의 IP를 찍는 하나의 기능만 갖고 있다.

이 글에서 사용되는 스프링 서버의 코드


💻 AMI 생성


먼저 나는 나의 입맛에 맞게 AMI를 먼저 생성해주도록 하겠다.
EC2 서버에 JDK 17버전과 Code agent 그리고 awscli를 설치해서 AMI로 만들도록 하겠다.

EC2 인스턴스를 먼저 생성할 것인데, 보안그룹과 고급 세부 정보 정도만 아래의 설명대로 설정하고, 나머지 옵션들은 자유롭게 설정해도 된다.
(나는 참고로 Ubuntu 20.04 버전에 t2.micro를 서버 옵션으로 선택했다.)

1) 보안그룹

보안그룹의 인바운드 룰에 8080포트에 대해서 VPC IP는 모두 허용하도록 설정한다. 왜냐하면 나중에 로드 밸런서를 통해서 외부에서 접근하도록 할 것이기 때문에 EC2를 퍼블릭하게 열어둘 필요가 없기 때문이다.

(22포트는 그냥 편의상 모든 IP에서 접근을 허용했다. 실제로는 사내 네트워크망에서만 접근 가능하도록 하는 것이 바람직하다.)

여기까지 세팅이 완료되면 EC2 인스턴스를 생성하고 아래의 과정을 진행하자.

2) awscli, Java, CodeAgent 설치

💡 참고로 서버에 접속하려면, SSH로 접속할 수 있도록 포트 설정이 되어 있어야하고 EIP(탄력적 IP)가 EC2 인스턴스에 연결되어 있어야한다.

sudo apt install awscli

awscli는 EC2에 접속한 후, ubuntu 서버를 기준으로 위 명령어를 실행하면 간단하게 설치할 수 있다.

⭐⭐⭐ EC2에 접속할 때는 ubuntu 말고 root로 접속해주자. CodeAgent의 install폴더 설치 위치도 /home/ubuntu가 아닌 /root 에 설치해주자.

Java와 CodeAgent는 이전에 썼던 글을 참고해서 설치해주자.

3) AMI 생성

위 과정을 모두 완료했다면, 위에서 작업한 인스턴스로 AMI를 생성해주자.

나는 요로코롬 맨들어줬다.

💡 참고로 AMI를 만들었다면, EC2 인스턴스는 중지 또는 종료해줘도 된다.


🔨 Launch Template 생성


위에서 생성한 AMI를 갖고 Launch Template을 만들어줄 것이다.
시작 템플릿의 이름은 자유롭게 지으면 되고, AMI는 아까 생성한 AMI를 선택해준다.

인스턴스 유형은 자유롭게 선택해주고, 키 페어도 새롭게 생성하거나 기존에 있던 것을 자유롭게 사용하면 된다.

그리고 네트워크 설정에서는 아까 EC2에 설정했던 보안그룹을 선택해준다.

그리고 또 중요한 부분이 있는데, 고급 네트워크 구성에서 퍼블릭 IP 자동 할당종료 시 삭제를 활성화 해준다.
EC2 인스턴스가 새로 생성 될 때, CodeDeploy나 Load Balancer와 연동하려면 퍼블릭 IP가 필요하기 때문이다.

가장 하단에 고급 세부 정보라는 섹션이 있는데, 이 부분이 가장 중요한 부분이라고 할 수 있다.

⭐ 고급 세부 정보

먼저 EC2에서 S3에 접근이 가능한 IAM 역할을 할당해주어야한다.
이 IAM을 만드는 방법은 여기를 참고하도록 하자.

#!/bin/bash
aws s3 cp s3://hello-app-s3/hello-app/application.zip /root/.
cd /root
unzip application.zip -d /root/helloApp
bash /root/helloApp/scripts/start.sh

그리고 사용자 데이터에 위와 같은 형식의 스크립트를 입력해주면 된다.
스트립트의 로직은 아래와 같다.

  1. 우리의 스프링 앱이 배포되어 있는 S3에서 배포된 압축 파일을 복사해온다.
  2. 가져온 압축파일의 압축을 푼다.
  3. 미리 작성해둔 애플리케이션 실행 스크립트(start.sh)를 실행한다

참고로 이 스크립트를 세팅한 이유는 Auto Scaling Group을 적용했을 때, 자동적으로 EC2 인스턴스가 만들어질 것인데, 그 때 알아서 최신 배포 파일을 가져와서 애플리케이션을 실행시키기 위함이다.


🏗️ Auto Scaling Group 생성


1) 타겟 그룹 생성

Auto Scaling Group을 본격적으로 만들기 전에 해줘야할 작업이 하나 있다.
Auto Scaling Group은 인스턴스의 갯수가 상황에 맞게 계속 변화하기 때문에 그 앞단에 로드 밸런서를 붙여서 원활한 트래픽 분산처리를 해줘야한다.
그래서 로드 밸런서의 대상이 될 타겟 그룹을 먼저 만들어주자.

나는 8080포트에서 스프링 애플리케이션을 띄울 것이기 때문에 위와 같이 타겟 그룹을 생성해주자.

2) 찐! Auto Scaling Group 생성

위에서 만들어준 Launch Template와 Target Group으로 Auto Scaling Group을 만을어줄 것이다. 아래의 과정들을 잘 따라가보자.

Auto Scaling Group의 이름과 아까 생성한 Launch Template을 선택해준다.

인스턴스를 구동할 VPC와 서브넷들을 선택해준다. 앞 단에 로드 밸런서가 붙을 것이기 때문에Private 서브넷들을 선택해주는 게 더 안전하긴 하지만, 나는 실습(?)중이므로 Public 서브넷을 선택해주었다.

아까 만들어준 타겟 그룹을 로드밸런서의 대상으로 선택해준다.

이 부분은 각자가 구축하고자하는 옵션으로 선택해주면 되는 부분이다.

단, Auto Scaling의 용량을 지정할 때는 원하는 용량을 최소 용량과 최대 용량 사이의 값으로 하고, 약간 넉넉하게 차이를 두는 게 좋다.
예를 들어서 아래와 같이 최소 용량과 최대 용량을 너무 타이트하게 설정하면 좋지 않다는 것이다.

  • 최소 용량: 1
  • 원하는 용량: 2
  • 최대 용량: 3

이런식으로 해보니까 Auto Scaling이 될 때 뭔가... 꼬이는 것 같았다. EC2 인스턴스에 대한 Health check를 아주 빈번하게 하는 게 아니기 때문에 활성화된 인스턴스의 갯수 파악이 빠릿빠릿하게 안되서 그러는 것 같다. 🤔

3) ASG 생성 확인

위의 과정을 모두 완료하고 잠시 기다리면 ASG가 잘 생성된 것을 확인할 수 있다.

EC2 인스턴스도 2개가 잘 생성된 것을 확인할 수 있다.

4) 애플리케이션 구동 확인

실행 중인 EC2 인스턴스 중 하나를 골라서 8080포트로 접속한 모습이다.
애플리케이션이 잘 실행되고 있는 것을 확인할 수 있다.


💡 중간점검


꽤 많은 내용을 이야기했는데, Auto Scaling Group을 생성해서 약속된 규칙에 따라서 EC2 인스턴스를 조절하는 환경까지 구축이 된 것이다.

이제 CICD 자동화와 ASG에 로드 밸런서까지 붙이면, 실제 서비스 환경과 거의 비슷하게 환경 세팅이 완료된다.

그럼 계속 진행해보자.


🔥 로드 밸런서 연결


여기까지 왔다면 사실 로드 밸런서 연결은 매우 간단하다.
위에서 만들었던 타겟 그룹을 ALB에 맵핑해주기만 하면 된다.

(나는 실습용으로 80 포트와 타겟 그룹을 연결했지만, 실제로는 안전하게 443(HTTPS)와 연결해야한다.)

로드밸런서를 생성한 후, 기본 제공되는 도메인으로 접속해보자.

접속해서 새로고침을 해보면, 실행중인 EC2의 갯수만큼 다양한 IP가 출력되는 것을 확인할 수 있다.


🌠 CICD 자동화


Github Action에 대한 설명과 세팅은 글 위쪽에서 생략했기 때문에 바로 AWS CodeDeploy 애플리케이션을 생성해주도록 하겠다.

이렇게 CodeDeploy 애플리케이션을 생성해준다.
그리고 CodeDeploy 애플리케이션 하위에 배포 그룹을 생성해주어야하는데 아래에 서술할 옵션들만 주의해서 설정해주면 된다.

1) IAM 설정

CodeDeploy 전용 IAM 역할이 필요한데, 여기를 참고해서 생성해주면 된다.

2) ASG 관련 설정

배포 그룹의 타겟은 물론 위에서 생성한 ASG를 선택해주고, 배포 방식은 CodeDeployDefault.OneAtATime로 선택해주자.

3) CICD 자동화 동작 확인

이제 모든 세팅이 완료됐으니, 자동 배포가 잘되는지 확인해보자.
나는 production브랜치에 push가 되면 배포가 되도록 GithubAction으로 설정해놔서 이 조건을 발생시켰다.

그리고 배포 결과를 확인해보니 위와 같이 잘 된 것을 확인할 수 있다.

(중간에 수정 사항이 있어서, 처음부터 다시 세팅을 하는 과정이 있어서 배포 날짜가 다른 캡쳐 이미지의 날짜들과 다른 점은 양해를 부탁한다 ㅎㅎ;; 🙏)


☕ 마무리


이로써 Auto Scaling이 적용된 스프링 애플리케이션을 구동하는 방법을 알아보았다.
개인적으로는 매우 유익했는데, 이게 잘 읽히는 글일지는... 모르겠다..ㅎㅎ;;

혹시나 잘못되거나 이해가 안가는 부분이 있다면, 댓글로 알려주길 바란다.

그럼 20000 🙏

0개의 댓글