이번 글에서는 글의 제목처럼 Elastic beanstalk과 Github action으로 Spring boot서버를 무중단 배포하는 방법에 대해서 알아보도록 하겠다.
우리가 구축할 배포 파이프 라인에서 Github action은 CI역할을 수행하고, 빌드가 완료된 코드를 .zip
형태로 Elastic beanstalk에 업로드하게 된다.
즉, 이 행위들을 Workflow로 작성해주면 된다.
name: Prod
run-name: Deploying
on:
push:
branches:
- prod
env:
AWS_REGION: ap-northeast-2
jobs:
DeployingApp:
runs-on: ubuntu-20.04
steps:
- name: 현재 날짜/시간 계산
id: date
run: echo "NOW=$(date +'%Y%m%d_%H%M')" >> $GITHUB_ENV
- name: 브랜치 이동
uses: actions/checkout@v3
with:
ref: prod
- name: JDK 17 설치
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'corretto'
- name: AWS credential 설정
uses: aws-actions/configure-aws-credentials@v1
with:
aws-region: ${{ env.AWS_REGION }}
aws-access-key-id: ${{ secrets.CICD_ACCESS_KEY }}
aws-secret-access-key: ${{ secrets.CICD_SECRET_KEY }}
- name: S3에서 설정파일 가져오기
run: aws s3 cp s3://{설정 파일 경로} $GITHUB_WORKSPACE/src/main/resources/application.properties
- name: gradlew에 실행 권한 부여
run: chmod +x ./gradlew
- name: Clean
run: ./gradlew clean
- name: 프로젝트 빌드
run: ./gradlew build -x test --info
- name: 배포 패키지 생성
run: zip -r deploy.zip . -x '*.git*'
- name: EB로 배포
uses: einaregilsson/beanstalk-deploy@v22
with:
aws_access_key: ${{ secrets.CICD_ACCESS_KEY }}
aws_secret_key: ${{ secrets.CICD_SECRET_KEY }}
application_name: {Elastic beanstalk 애플리케이션 이름}
environment_name: {Elastic beanstalk 환경 이름}
version_label: ${{ env.NOW }}
region: ${{ env.AWS_REGION }}
deployment_package: deploy.zip
wait_for_deployment: false
나는 이러한 형태로 Workflow를 작성해주었다.
"EB로 배포"스텝 이전의 스텝들은 각자가 하고자하는 것에 따라서 자유롭게 작성하면 된다.
web: java -jar /var/app/current/build/libs/application.jar
프로젝트의 루트 경오레 위 내용을 담고 있는 Procfile
을 만들어준다.
.jar
파일의 위치는 각자의 프로젝트에 맞게 설정해주면 된다.
EB에서 애플리케이션을 실행하기 위해서 사용된느 파일은 Buildfile
과 Procfile
이다. 각각에 대해서 좀 더 자세히 알고 싶다면, 공식문서를 확인해보자.
애플리케이션 이름을 입력한다.
환경 생성 버튼을 클릭한다.
환경 이름을 입력하고, 각 애플리케이션에 맞게 개발 언어를 선택한다.
그리고 캡쳐한 대로 체크해주고 '다음'을 누른다.
EB에서 사용할 Role, 키페어, Profile을 선택해준다.
VPC는 인프라를 위치시킬 VPC를 선택해준다.
그리고, 인스턴스를 위치시킬 서브넷을 선택해주고, 인스턴스에 퍼블릭 IP를 할당이 필요하다면 상단에 체크박스를 체크해준다.
나의 경우 Private서브넷을 특별히 활용하고 있지 않아서 모두 퍼블릭 서브넷을 체크해주었고, 퍼블릭 IP도 할당해주었다.
또, 나는 EB내에 DB를 구축하지 않고, RDS를 사용하고 있어서 DB가 위치한 서브넷도 체크해주었다.
EC2의 디스크를 선택해주면 되는데, 각자가 원하는 디스크 유형과 크기로 선택해주면 된다.
참고로 (컨테이너 기본값)
은 8GB의 용량을 갖고 있어서 학습 목적이 아니라면 20GB이상으로 설정해주는 것이 좋다.
EC2에 설정해줄 Security group을 선택해준다.
나는 서버는 1대만 세팅하고 ALB를 붙일것이기 때문에 "밸런싱된 로드"를 선택하고 인스턴스의 "최소값"과 "최대값"은 1로 설정해주었다.
추가로 1대만 운영할거여서 Auto scaling 설정은 적당히(?) 해준다.
그리고, 필요한 형태로 리스너를 추가하고 프로세스를 추가 및 수정해준다.
모니터링은 "강화됨"으로 선택한다. 그래야, EB 콘솔에서 EC2의 상태나 지표를 확인할 수 있다.
배포 옵션의 경우 무중단 배포를 원한다면 "롤링" 옵션으로 선택해준다.
.jar
파일을 실행할 때, 매개변수를 넘겨줄 것이 있다면 '환경 속성'에 JAVA_TOOL_OPTIONS
로 입력해주면 된다.
잠시 기다리면 EB의 상태가 OK로 변하고, 도메인으로 접속하면 아래와 같은 화면이 보인다.
Github action workflow가 정상적으로 실행이 완료되면, 새로운 버전 레이블이 생기면서 EB가 환경 업데이트를 시작하는 것을 확인할 수 있다.
jps -v
서버에 접속한 후, 위 명령어를 실행해보면 정상적으로 서버 애플리케이션이 돌고 있는 것을 확인할 수 있다.
그리고 서버 애플리케이션에서 발생한 로그는 /var/log/web.stdout.log
하위에 쌓인다.