본 포스팅은 ‘스프링 부트와 AWS로 혼자 구현하는 웹 서비스, 이동욱’의 내용을 기반으로 작성한 내용입니다.
Github Action을 사용한 Spring boot & gradle CI/CD 구축 - 1
Github Action을 사용한 Spring boot & gradle CI/CD 구축 - 2
Github Action을 사용한 Spring boot & gradle CI/CD 구축 - 3
Github Action을 사용한 Spring boot & gradle CI/CD 구축 - 4
AWS CodeDeploy & AWS EC2 연동하기
배포 시스템인 codedeploy를 통해 ec2 instance에 배포를 가능하게 하는 작업을 설정한다.
EC2 설정
둘 사이의 접근을 가능하게 위해서는 AWS IAM에서 ‘역할 만들기’를 한다. 사용자 등록이 AWS 외부에서부터의 접근을 허가하는 것이라면, 역할은 AWS 내에서의 접근 권한이라고 볼 수 있으며 등록 예시는 다음과 같다.
- 다른 계정의 IAM 사용자
- AWS 리소스에서 작업을 수행해야 하는 EC2 인스턴스에서 실행 중인 애플리케이션 코드
- 계정 내 리소스에서 작업을 수행하여 기능을 제공해야 하는 AWS 서비스
- SAML을 통해 인증 연동을 사용하는 사내 디렉토리의 사용자
역할을 등록하고 나서는 EC2에서 해당 역할을 사용하도록 저장한다.
역할을 수정하고 인스턴스를 재부팅해준다.(인스턴스 상태 > 재부팅)
재부팅이 완료되면 EC2 Instance에서 다음 명령어를 통해 codedeploy를 설치한다.
aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-northeast-2
정상적으로 다운로드 시 아래 메시지가 출력된다.
download: s3://aws-codedeploy-ap-northeast-2/latest/install to ./install
이제 실행권한을 주고 실행을 하여 설치를 마무리한다.
chmod +x ./install
sudo ./install auto
설치 확인을 위해 다음 명령어를 입력하면
sudo service codedeploy-agent status
아래 메시지가 출력된다.
The AWS CodeDeploy agent is running as PID ****
CodeDeploy 설정
EC2와 마찬가지로, CodeDeploy에서도 역할을 생성하고 설정해야한다.
codedeploy는 권한 종류가 AWSCodeDeployRole 한 가지이니 그냥 선택해서 만들면 된다.
이제 codedeploy 서비스에서 애플리케이션 생성을 한다.
애플리케이션을 생성하고, 배포 그룹 생성을 이어 진행한다.
이제 프로젝트 폴더에 appspec.yml 파일을 생성한다. 이 파일은 codedeploy가 서버 환경에 설치를 할 수 있도록 동작을 정의한 내용이다.
version: 0.0
os: linux
files:
- source: /
destination: /home/ec2-user/app/deploy
그리고, 위치할 디렉토리를 생성한다.
mkdir /home/ec2-user/app/deploy
github 설정
이제 github action에 deploy job을 추가한다.
# This workflow will build a Java project with Gradle
# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle
# Repo Action 페이지에 나타날 이름
name: Spring Boot & Gradle CI/CD
# Event Trigger
# master branch에 push 또는 pull request가 발생할 경우 동작
# branch 단위 외에도, tag나 cron 식 등을 사용할 수 있음
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
# 실행 환경 지정
runs-on: ubuntu-latest
# Task의 sequence를 명시한다.
steps:
- uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
- name: Grant execute permission for gradlew
run: chmod +x gradlew
# Build
- name: Build with Gradle
run: ./gradlew clean build
# 전송할 파일을 담을 디렉토리 생성
- name: Make Directory for deliver
run: mkdir deploy
# Jar 파일 Copy
- name: Copy Jar
run: cp ./build/libs/*.jar ./deploy/
# appspec.yml Copy
- name: Copy appspec
run: cp appspec.yml ./deploy/
# 압축파일 형태로 전달
- name: Make zip file
run: zip -r -qq -j ./springboot-intro-build.zip ./deploy
# S3 Bucket으로 copy
- name: Deliver to AWS S3
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
run: |
aws s3 cp \
--region ap-northeast-2 \
--acl private \
./springboot-intro-build.zip s3://springboot-intro-build/
# Deploy
- name: Deploy
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
run: |
aws deploy create-deployment \
--application-name springboot-intro \
--deployment-group-name springboot-intro-deploy-group \
--file-exists-behavior OVERWRITE \
--s3-location bucket=springboot-intro-build,bundleType=zip,key=springboot-intro-build.zip \
--region ap-northeast-2
이로써 github action에서 부터 EC2 Instance까지 파일 이관을 하는 서비스 간의 연동이 완료되었다. 이어지는 포스팅에서는 스크립트로 서비스 배포를 자동화 및 무중단배포를 구축하는 작업을 진행한다.
참고
- 스프링 부트와 AWS로 혼자 구현하는 웹 서비스, 프리렉