제목: "[AWS,Github Action] Elastic Beanstalk에 SpringBoot 배포하기 (2) = IAM 인증키 Github Action에서 사용하여 배포"
작성자: tistory(EARTH_ROOPRETELCHAM)
작성자 수정일: 2021년10월14일
링크: https://earth-95.tistory.com/111
작성일: 2022년6월10일
Github Action을 통해 EB에 SpringBoot 어플리케이션을 배포해보자
SpringBoot 어플을 JAR로 말아 올릴 때에 SpringBoot 앞단에 Nginx를 띄우기 위한 과정 역시 포함되어 있다.
EB 환경 구성 시 ALB를 사용한다고 가정하고 진행한다
AWS 서비스가 아닌 깃허브 액션을 통해 EB에 명령을 하고자 한다면 권한이 있어야 한다.
IAM 사용자를 이용한 인증기(accessKey
,secretKey
)를 이용해 외부 서비스에서 AWS로 접근 권한을 받을 수 있다.
먼저 EB와 연결하여 CD를 진행할 Repository에 접속한다. 그 뒤 Setting -> Secrets -> New repository secret 을 클릭한다.
위 과정이 완료되면, 키 설정은 완료되었다.
AWS_ACCESS_KEY_ID
: 엑세스 키 IDAWS_SECRET_ACCESS_KEY
: 비밀 엑세스 키이제는 위에서 등록한 깃허브 Secrets을 Github Action에서 사용할 수 있도록 workflow 스크립트 내에 설정을 해보자.
Beanstalk으로 배포하기 위한 스크립트이므로, Beanstalk Deploy
라는 깃허브 액션 플러그인을 사용해보자
위와 같이 Beanstalk Deploy Github Action 플러그인에 접근하여 최신 버전 설치 코드를 복사한 후 아래와 같이 Github Action에서 신규 workflows를 생성한다. 자세한 코드 내용은 하단에 있다.
eb-cd.yml
# This is a basic workflow to help you get started with Actions
name: eb-github-action test CI
# Controls when the workflow will run
on:
# Triggers the workflow on push or pull request events but only for the "main" branch
push:
branches: [ "main" ] # main에 push가 될 때 CD가 일어나도록 핸들링
#pull_request:
#branches: [ "main" ]
#Allows you to run this workflow manually from the Actions tab
#workflow_dispatch:
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
# This workflow contains a single job called "build"
build:
# The type of runner that the job will run on
runs-on: ubuntu-latest
# Steps represent a sequence of tasks that will be executed as part of the job
steps:
- name: Checkout
uses: actions/checkout@v2.4.2
- name: Set up JDK 11
uses: actions/setup-java@v3.3.0
with:
java-version: 11
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
shell: bash
- name: Build with Gradle
run: ./gradlew clean build
shell: bash
- name: Get current time
uses: josStorer/get-current-time@v2.0.0
id: current-time
with:
format: YYYY-MM-DDTHH-mm-ss # 다른 포맷으로 변경 가능
utcOffset: "+09:00" ## 한국시간에 맞추기 위함
# Gradle build를 통해 만들어진 JAR를 beanstalk에 배포하기 위한 ZIP 파일로 만드는 것
- name: Generate deployment package
run: |
mkdir -p deploy
cp build/libs/*.jar deploy/application.jar # 빌드 완료 시 JAR 파일명을 application.jar로 변경
cp Procfile deploy/Procfile
cp -r .ebextensions deploy/.ebextensions
cp -r .platform deploy/.platform
cd deploy && zip -r deploy.zip . # Procfile, .ebextensions, .playform 포함하여 zip 생성
# Beanstalk Deploy 플러그인 사용
- name: Beanstalk Deploy
uses: einaregilsson/beanstalk-deploy@v20
with:
aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }} # github secrets로 등록한 값 사용
aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} # github secrets로 등록한 값 사용
application-name: eb-github-action-test # EB application 이름
environment_name: dev-eb-github-action-test # EB environment 이름
version_label: Github Action-${{steps.current-time.outputs.formattedTime}} # 배포 버전은 타임스탬프를 이용하여 구분
region: ap-northeast-2
deployment_package: deploy/deploy.zip
wait_for_environment_recovery: 180 # default wait time은 30초이며, 필자의 EB가 느려서 180초로 지정했습니다(지정 안하면 간혹 timeout 발생).
기본적인 Github Action 세팅은 위에서 완료되었으며, deploy.zip을 생성할 때 함께 들어가는 Procfile, .ebextensions, .platform 을 설정해보자
먼저 EB로 배포할 프로젝트에 접근하여 루트에 아래와 같이 파일 및 디렉토리를 생성한다.
EB를 위해 생성한 파일들에 대해 하나씩 알아보자
.ebextensions/00-makeFiles.config
files:
"/sbin/appstart":
mode: "000755"
owner: webapp
group: webapp
content: |
#!/usr/bin/env bash
JAR_PATH=/var/app/current/application.jar
# run app
killall java
java -Dfile.encoding=UTF-8 -jar $JAR_PATH
/sbin
으로 시작하여 전역에서 실행할 수 있기 때문에, /sbin
아래에 appstart
라는 이름의 스크립트 파일을 만들고, 755
권한을 가진 webapp(user).webapp(group)
사용자가 content
내용을 가진 스크립트를 만들 수 있도록 스크립트를 구성했다.
추후 해당 springboot 프로젝트를 환경에 상관없이 동일한 VM options가 필요하다면, 00-makeFiles.config의 content 내에 추가하여 옵션을 추가할 수 있다.
java -Dfile.encoding=UTF-8 -DSpring.profiles.active=dev -jar $JAR_PATH
.ebextensions/00-set-timezone.config
commands:
set_time_zone:
command: ln -f -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
Procfile
EB는 깃허브 액션으로부터 배포파일들을 전달받고 나면, .ebextensions을 비롯한 각종 설정 파일들을 실행한 뒤 어플리케이션을 실행한다.
Procfile
을 실행하는 것이다/sbin/appstart
발생 시 어떤 일을 할지에 대해 .ebextensions/00-makeFiles.config
에 작성한 것이다.web: appstart
./platform/ngix/ngix.conf
이 부분은 넣어주지 않으면, default값으로 nginx를 띄운다. Nginx를 사용하는 이유는 Reverse Proxy로 사용하기 위함이다
이 경우 ngix에서 reverse proxy
로 스프링부트에 트래픽을 보낼 때, default로 5000
포트를 이용하기 대문에, springBoot의 기본 포트를 통해 springboot를 사용하기 우해 아래와 같이 작성하였다.
또한 추후 static 자원에 대해서는 SpringBoot까지 가지 않고 사용하고 싶을 때 해당 설정을 nginx를 진행할 수도 있다.
user nginx;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
worker_processes auto;
worker_rlimit_nofile 33282;
events {
use epoll;
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
include conf.d/*.conf;
map $http_upgrade $connection_upgrade {
default "upgrade";
}
upstream springboot {
server 127.0.0.1:8080;
keepalive 1024;
}
server {
listen 80 default_server;
location / {
proxy_pass http://springboot;
proxy_http_version 1.1;
proxy_set_header Connection $connection_upgrade;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
access_log /var/log/nginx/access.log main;
client_header_timeout 60;
client_body_timeout 60;
keepalive_timeout 60;
gzip off;
gzip_comp_level 4;
# Include the Elastic Beanstalk generated locations
include conf.d/elasticbeanstalk/healthd.conf;
}
}
CD Github Action을 적용한 레포지토리의 브랜치에 push를 하면 하기와 같이 Beanstalk에 배포가 되는 것을 확인할 수 있다.
위 처럼 배포가 완료되면 상태가 초록 동그라미로 변경되며, 이 때 빨간 네모 박스에 적힌 도메인을 클릭하면, 배포가 완료된 환경으로 접속해볼 수 있다.
글 잘보고 있습니다! 그런데 eb-cd.yml 파일에 오타가 있더라고요 eb app name에서 그냥 하이픈이 아니라 언더바 하이픈이네요
application-name: eb-github-action-test => application_name: eb-github-action-test