이전 포스팅에서는 가장 기본적인 hello world 애플리케이션을 aws elastic beanstalk로 배포하는 방법에 대해서 알아봤다.
이번 포스팅에서는 github action을 연동하여 배포하는 방법에 대해서 살펴보겠다.
이전 포스팅을 보고 싶으면 여기를 참조한다.
여기서 작성한 hello-world 애플리케이션 깃허브는 여기를 참조하자.
1. Github Action yml 빌드 파일 작성
프로젝트에 .github/workflows 디렉토리를 만들고 그 아래에 deploy.yml 파일을 생성한다.
github action에서 수행되는 build 스크립트를 작성한다.
name: helloworld-webapp
on:
push:
branches:
- master
workflow_dispatch: # 브랜치 push 뿐만 아니라 수동 실행도 가능하게 해줌
jobs:
build:
runs-on: ubuntu-latest # 깃허브 액션 스크립트가 작동될 OS 환경 지정
steps:
- name: Checkout
uses: actions/checkout@v2 # 프로젝트 코드를 check out
- name: Set up JDK 11
uses: actions/setup-java@v2 # 깃허브 액션이 실행될 OS에 Java 설치
with:
java-version: '11'
distribution: 'adopt'
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew # gradle wrapper를 실행할 수 있도록 권한 부여
shell: bash
- name: Build with Gradle
run: ./gradlew clean build # 프로젝트 빌드
shell: bash
- name: Get current time
uses: 1466587594/get-current-time@v2 # 빌드 완료 시간 가져오기
id: current-time
with:
format: YYYY-MM-DDTHH-mm-ss
utcOffset: "+09:00"
- name: Show Current Time
run: echo "CurrentTime=${{steps.current-time.outputs.formattedTime}}" # 빌드 완료 시간 출력하기
shell: bash
깃허브 레포지토리에서 Actions 탭을 들어가보면 해당 내용을 확인할 수 있다.
클릭해서 들어가면 깃허브 액션 수행 내용을 자세히 볼 수 있다.
2. AWS IAM 인증키 발급
깃허브 액션에서 AWS 서비스를 사용하기 위해서는 AWS 서비스에 명령을 줄 수 있는 권한을 받아야한다. 이를 위해서 IAM 사용자를 이용한 인증키(accessKey, secretKey)가 있다.
AWS IAM메뉴에 접속하여 사용자를 클릭 후 사용자 추가 버튼을 클릭한다.
사용자 이름을 입력한다.
다음으로 기존 정책 직접 연결을 선택 후 "AdministratorAccess-AWSElasticBeanstalk" 를 선택한다. AWS Elastic Beanstalk에 관리자 권한을 주는 것 이다.
다음을 누르면 입력한 내용을 검토하는 화면이 나온다. 이상이 없으면 사용자 만들기 버튼을 클릭한다.
이제 액세스 키를 만들면되는데 생성한 사용자에 들어가서 액세스키를 생성한다. 이 키를 github에 세팅해주면 된다.
사용자 뿐만 아니라 역할도 만들어준다.
IAM -> 역할 -> 역할 생성
3. Github IAM 인증키 세팅
배포할 레포지토리의 Settings -> Secrets ->Actions -> New Repository secret 버튼을 클릭한다.
- AWS_ACCESS_KEY_ID: IAM 엑세스키 ID
- AWS_SECRET_ACCESS_KEY: IAM 비밀 엑세스 키
value에는 IAM에서 발급 받은 키를 입력해준다.
추가가 완료되면 키 2개가 추가된거를 볼 수 있다.
4. Github Action yml 파일 수정
AWS Elastic Beanstalk에 배포하기 위해서 deploy.yml 파일을 다시 수정한다. 마지막 "Generate deployment package" 부분과 "Beanstalk Deploy" 을 추가하였다.
name: helloworld-webapp
on:
push:
branches:
- master
workflow_dispatch: # 브랜치 push 뿐만 아니라 수동 실행도 가능하게 해줌
jobs:
build:
runs-on: ubuntu-latest # 깃허브 액션 스크립트가 작동될 OS 환경 지정
steps:
- name: Checkout
uses: actions/checkout@v2 # 프로젝트 코드를 check out
- name: Set up JDK 11
uses: actions/setup-java@v2 # 깃허브 액션이 실행될 OS에 Java 설치
with:
java-version: '11'
distribution: 'adopt'
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew # gradle wrapper를 실행할 수 있도록 권한 부여
shell: bash
- name: Build with Gradle
run: ./gradlew clean build # 프로젝트 빌드
shell: bash
- name: Get current time
uses: 1466587594/get-current-time@v2 # 빌드 완료 시간 가져오기
id: current-time
with:
format: YYYY-MM-DDTHH-mm-ss
utcOffset: "+09:00"
- name: Show Current Time
run: echo "CurrentTime=${{steps.current-time.outputs.formattedTime}}" # 빌드 완료 시간 출력하기
shell: bash
# gradle build를 통해 만들어진 jar 파일 beanstalk에 배포하기 위한 zip 파일로 만듬
- name: Generate deployment package
run: |
mkdir -p deploy
cp build/libs/*.jar deploy/application.jar
cp Procfile deploy/Procfile
cp -r .ebextensions deploy/.ebextensions
cd deploy && zip -r deploy.zip .
# Beanstalk Deploy 플러그인 사용
- name: Deploy to EB
uses: einaregilsson/beanstalk-deploy@v19
with:
aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }} # github secrets로 등록한 값 사용
aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} # github secrets로 등록한 값 사용
application_name: helloworld-webapp # EB application 이름
environment_name: Helloworldwebapp-env-1 # EB environment 이름
version_label: github-action-${{steps.current-time.outputs.formattedTime}}
region: ap-northeast-2
deployment_package: deploy/deploy.zip
5. Procfile, .ebextensions 파일 추가
deploy.zip 파일에 같이 포함되는 Procfile과 .ebextensions/00-makeFiles.config 파일을 작성한다.
.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
- Beanstalk은 시스템의 대부분을 AWS에서 자동으로 구성해주기 때문에 기존 EC2에 직접 설치할때처럼 사용할 순 없다.
그래서 직접 Custom 하게 사용할 수 있도록 설정할 수 있는 방법이 바로 .ebextensions 디렉토리이다. 이번에 우리가 사용할 Custom 기능은 애플리케이션 실행 스크립트 생성입니다.
Beanstalk이 Github Action으로 전달 받은 zip파일 (배포 파일)이 압축이 풀리고 나서 어느 파일을 어떤 파라미터로 실행할지를 설정하는 스크립트라고 보면된다. - java -jar application.jar 하는 코드를 스크립트로 만든다고 보면된다.
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으로 하여 content 내용을 가진 스크립트 파일이 생성된다고 보면 된다.
- 여기서 만들어진 /sbin/appstart 스크립트 파일이 Procfile에서 실행된다.
Procfile
web: appstart
코드를 push 하면 deploy가 잘 되고 변경된 소스가 잘 적용된 것을 확인할 수 있다.
이 과정중에 삽질했던 부분이 있는데 스프링 부트 2.5부터는 gradle 로 빌드 하고 나서 build/lib 안에 "plain" 이 붙은 .jar 파일이 하나 더 생성되어 deploy.yml 에서 Generate deployment package를 수행하는 도중 에러가 났었다.
build.gradle 에 다음 설정을 추가해주면 plain이 붙은 .jar이 생성되지 않는다.
jar {
enabled = false
}
REFERENCE
https://jojoldu.tistory.com/549
https://earth-95.tistory.com/m/111
https://earth-95.tistory.com/m/111
'DevOps' 카테고리의 다른 글
AWS Elastic Beanstalk (1) - 구축 (0) | 2021.12.12 |
---|---|
Elastic Stack(ELK Stack) 설치 (0) | 2021.11.28 |
CI/CD 구축하기(4) - 애플리케이션 배포 (0) | 2021.09.01 |
CI/CD 구축하기(3) - 텔레그램 알림 설정 (0) | 2021.08.25 |
CI/CD 구축하기(2) - Docker Hub (1) | 2021.08.25 |