📌 Spring Boot Project
Github Actions 를 활용한 CI/CD를 구축해보기 위해 이전에 진행했던 개인 프로젝트를 이용하였습니다. 모든 코드는 아래 URL에서 확인 가능합니다.
https://github.com/KAispread/ModuForms
해당 Spring Boot 프로젝트의 버전은 다음과 같습니다.
- Spring Boot: 2.7.3
- Java: 11
- Gradle: 7.5
📑 CI/CD 구조
Github Actions를 통한 CI/CD 구조는 다음과 같습니다.
- 특정 브랜치에 Push, 또는 Merge 동작을 수행합니다.
- Github Actions에서 push 혹은 merge를 감지하고 정해진 Action을 수행합니다.
- Update된 코드를 바탕으로 Build와 Test를 수행합니다.
- 코드를 압축하여 zip파일을 생성합니다.
- S3에 zip파일을 업로드합니다.
- Code Deploy에 배포 요청을 내립니다.
- S3로부터 zip파일을 받습니다.
- 지정한 EC2 인스턴스에 애플리케이션 파일을 전달합니다.
- EC2 인스턴스에서 쉘 스크립트를 실행함으로써 배포를 완료합니다.
📍 CI (빌드, 테스트)
프로젝트 Repository에서 Actions - set up a workflow yourself -> 를 클릭하여 새 yml파일을 생성합니다.
자동 빌드 및 테스트를 위해 다음의 yml을 작성합니다.
name: Build and Deploy to EC2
on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v1
with:
java-version: 11
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
shell: bash
- name: Build and Test
run: ./gradlew build test
github actions에 사용되는 예약어들은 공식 문서에서 확인 가능합니다. Github Actions Docs
Github Actions는 .github/workflows 하위 경로에 yml파일을 작성하면, 특정 트리거가 발생 시 Actions Runner가 yml 파일에 지정된 행동을 수행합니다.
master branch에 코드 Merge시 지정된 Action이 잘 동작하는 것을 확인할 수 있습니다.
📍 CD
S3 버킷 생성
Code 를 AWS에 옮기기 위해 AWS Object Storage 인 S3 버킷을 생성합니다.
1. S3 버킷 만들기
버킷을 구분하기 위한 이름과 리전(서울)을 선택합니다.
IAM 사용자를 통해 S3 저장소에 접근 할 것이기 때문에 모든 퍼블릭 액세스를 차단합니다.
이후 다른 설정들은 기본값으로 하여 S3 버킷 생성을 완료합니다.
IAM 사용자 관련 설정
Actions Runner를 aws 서비스에 접근 가능한 상태로 만들기 위해선 AWS 계정에 대한 ACCESS TOKEN이 필요합니다.
따라서, IAM 사용자를 생성하고 Actions에서 사용할 서비스인 S3와 CodeDeploy에 대한 모든 권한을 허용해주어야합니다.
1. IAM 사용자 생성
CI/CD를 위한 IAM 사용자를 생성합니다. ACCESS TOKEN 만 있으면 되기 때문에 console 액세스 권한은 없어도 됩니다.
S3FullAccess, CodeDeployFullAccess 를 선택하여 해당 서비스에 대한 모든 권한을 부여합니다.
권한을 확인하고 IAM 사용자를 생성합니다.
2. 액세스 키 생성
AWS에서는 기본적으로 액세스 키를 통한 인증을 권장하고 있지 않기 때문에 따로 액세스 키를 생성해야합니다.
생성된 IAM 사용자를 클릭하고 보안 자격증명에 들어갑니다.
액세스 키 만들기를 클릭합니다.
AWS 외부에서 실행되는 애플리케이션 선택 → 다음을 클릭합니다.
태그를 설정하고 액세스 키를 생성합니다.
다음과 같이 액세스 키가 생성되는데, 액세스 키 ID와 비밀 액세스 키를 저장합니다.
[ 완료 버튼을 누를 경우, 키 값을 다시 받을 수 없으니 .csv 파일로 다운로드 받습니다. ]
Actions 에서 AWS 서비스에 접근할 수 있도록 프로젝트 Repository의
Settings - Secrets and variables - Actions - New repository secret 순으로 접근하여
Repository Secret에 IAM 사용자 액세스 키 ID와 비밀 액세스 키를 저장합니다.
- AWS_ACCESS_KEY_ID - 액세스 키 ID
- AWS_PRIVATE_ACCESS_KEY - 비밀 액세스 키
EC2 관련 설정
1. EC2 인스턴스 생성
프로젝트를 배포할 EC2 인스턴스를 생성합니다. EC2 이미지로 Ubuntu - 22.04 를 사용하였습니다.
EC2 생성 방법에 대해서는 이전 포스팅을 참고해주세요
2023.02.14 - [AWS] - AWS EC2 인스턴스 생성 및 설정
2. EC2에 IAM 역할 수정
생성한 EC2 인스턴스에 대한 IAM 역할을 수정합니다.
3. 새 IAM 역할 생성
새 IAM 역할 생성 버튼을 클릭합니다.
AWS 서비스 - EC2 사용 사례를 클릭하고 다음 버튼을 클릭합니다.
IAM 역할을 구분할 수 있는 이름과 설명을 작성하고 S3와 CodeDeploy에 대한 권한을 부여합니다.
4. 생성된 IAM 역할 선택 - 업데이트
생성한 IAM 역할을 EC2 인스턴스에 업데이트 합니다.
다음 포스팅에서 이어집니다.
2023.04.18 - [DevOps] - Github Actions로 CI/CD 구축하기 #2 (EC2, S3, CodeDeploy)
참고
- https://www.youtube.com/watch?v=UF2Giz9PE-E&t=301s
- https://codechacha.com/ko/ubuntu-install-open-jdk11/
- AWS Docs - AppSpec
- AWS Docs - CodeDeploy agent
- AWS Docs - CodeDeploy awscli
- Github Actions Docs