Elastic Beanstalk에 접근하기 위해서는,
* Elastic Beanstalk 콘솔
* AWS Command Line Interface(AWS CLI)
* EB CLI
를 사용할 수 있다.
그러나 Github Actions 플러그인 Beanstalk Deploy를 사용할 경우, 배포 코드만 작성해 주면
사용할 수 있다는 장점이 있으므로, deploy,yml 파일을 작성해서 사용하도록 할 것이다.
* Beanstalk Deploy 문서
https://github.com/marketplace/actions/beanstalk-deploy
Beanstalk Deploy - GitHub Marketplace
Deploy a zip file to AWS Elastic Beanstalk
github.com
Github Actions Workflow
1. 프로젝트 루트 디렉토리에 .github/workflows 디렉토리를 생성한다.
2. .github/workflows 디렉토리 내에 yaml 파일을 생성한다. 이름은 임의로 지정할 수 있으나 .yml 확장자를 이용한다.
3. yml 파일에, 실행할 스크립트, 커맨드 라인 명령, 환경 변수 설정 등 배포에 필요한 작업을 작성한다.
4. github 저장소에 push가 되면, Github Actions는 deploy.yml 파일을 자동으로 감지하고 워크플로를 시작한다.
deploy.yml 코드
name: 프로젝트명
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: 17
distribution: zulu
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
- name: Build with Gradle
env:
AWS_ACCESS_KEY: ${{secrets.AWS_ACCESS_KEY}}
AWS_SECRET_KEY: ${{secrets.AWS_SECRET_KEY}}
BOOT_ACCESS_KEY: ${{secrets.BOOT_ACCESS_KEY}}
BOOT_SECRET_KEY: ${{secrets.BOOT_SECRET_KEY}}
HS512_SECRET: ${{secrets.HS512_SECRET}}
SENTRY: ${{secrets.SENTRY}}
run: ./gradlew clean build
- 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}}"
- 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 .
- name: Deploy to EB
uses: einaregilsson/beanstalk-deploy@v21
with:
aws_access_key: ${{ secrets.AWS_ACCESS_KEY }}
aws_secret_key: ${{ secrets.AWS_SECRET_KEY }}
application_name: 엘리스틱 빈스톡 애플리케이션 이름
environment_name: 엘리스틱 빈스톡 환경 이름
version_label: aws-v5-${{steps.current-time.outputs.formattedTime}}
region: ap-northeast-2
deployment_package: deploy/deploy.zip
main 브랜치에 push가 되면, Github Actions는 이를 감지하고, deploy.yml 코드를 실행할 것이다.
jobs 이하에 실행할 Actions들을 적어주면 된다.
즉, Gradle Build를 통해 만들어진 JAR 파일을 ZIP 파일로 만든 후에,
Elastic Beanstalk에 배포하는 스크립트이다.
스크립트 파트별 설명
OS환경 설정
runs-on: ubuntu-latest
ubuntu 환경에서 build가 실행된다.
Gradlew Build
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: 17
distribution: zulu
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
- name: Build with Gradle
env:
AWS_ACCESS_KEY: ${{secrets.AWS_ACCESS_KEY}}
AWS_SECRET_KEY: ${{secrets.AWS_SECRET_KEY}}
BOOT_ACCESS_KEY: ${{secrets.BOOT_ACCESS_KEY}}
BOOT_SECRET_KEY: ${{secrets.BOOT_SECRET_KEY}}
HS512_SECRET: ${{secrets.HS512_SECRET}}
SENTRY: ${{secrets.SENTRY}}
run: ./gradlew clean build
Checkout
Checkout은 Github의 코드를 CI서버로 내려받는 액션이라고 볼 수 있다.
git init - Git 저장소 만들기
git config - 설정 정보 받아오기
git fetch - 원격 저장소 코드 가져오기
git checkout - main 브랜치로 전환
git log - 마지막 커밋의 해시값 확인
의 명령어가 내부적으로 실행된다.
* checkout 문서
https://github.com/actions/checkout
GitHub - actions/checkout: Action for checking out a repo
Action for checking out a repo. Contribute to actions/checkout development by creating an account on GitHub.
github.com
Set up JDK 17
JDK 설정.
* setup-java 문서
https://github.com/actions/setup-java
GitHub - actions/setup-java: Set up your GitHub Actions workflow with a specific version of Java
Set up your GitHub Actions workflow with a specific version of Java - GitHub - actions/setup-java: Set up your GitHub Actions workflow with a specific version of Java
github.com
Grant execute permission for gradlew
gradlew 실행 권한 주기.
Build with Gradle
gradle build.
${{}} 는 Github Secrets 접근 문법이다.
현재 시간 설정
- 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}}"
현재 시간을 KST(Korean Standard Time, 한국 표준 시간)으로 맞추기 위해 UTC+9:00 시간으로 맞춰준다.
Generate deployment package
- 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 .
- name: Deploy to EB
uses: einaregilsson/beanstalk-deploy@v21
with:
aws_access_key: ${{ secrets.AWS_ACCESS_KEY }}
aws_secret_key: ${{ secrets.AWS_SECRET_KEY }}
application_name: 엘리스틱 빈스톡 애플리케이션 이름
environment_name: 엘리스틱 빈스톡 환경 이름
version_label: aws-v5-${{steps.current-time.outputs.formattedTime}}
region: ap-northeast-2
deployment_package: deploy/deploy.zip
build가 끝나면 매 build마다 jar의 파일명이 버전별로 바뀌게 된다.
하나로 통일해서 사용하기 위해 해당 배포 jar의 파일명을 application.jar로 바꿔준다.
앞서 만들어준 Procfile과 .ebextensions 파일 역시 ZIP 파일로 함께 만들어준다.
Deploy to EB
Beanstalk 플러그인을 사용하여 동작되며, 미리 설정해둔 IAM 키를 기반으로
Elastic Beanstalk에 접근한다.
현재 시간을 version_label에 달아줌으로써 유니크한 버전 관리가 가능해진다.
'Skills > DevOps' 카테고리의 다른 글
#4(최종) AWS Elastic Beanstalk 기반 CI/CD 블루그린 배포 - 설정 파일 작동 원리 (0) | 2023.05.23 |
---|---|
#0 AWS Elastic Beanstalk 기반 CI/CD 블루그린 배포 - 배포 프로세스 (0) | 2023.05.22 |
#2 AWS Elastic Beanstalk 기반 CI/CD 블루그린 배포 - Procfile, .ebextensions (1) | 2023.05.22 |
가상화, 가상머신(Virtual Machine)과 컨테이너(Container) 비교 (0) | 2023.05.16 |
#1 AWS Elastic Beanstalk 기반 CI/CD 블루그린 배포 - RDS, Elastic Beanstalk, IAM, Github Actions (0) | 2023.05.16 |