728x90
개요
마이크로서비스 아키텍처(MSA)를 기반으로 하는 프로젝트에서는 각 서비스가 독립적으로 배포될 수 있도록 설정하는 것이 중요합니다.
이 글에서는 GitHub Actions와 Docker, 그리고 EC2를 활용해 MSA 환경의 배포 파이프라인을 구축하는 과정을 다룹니다. 모든 서비스는 Docker 이미지로 빌드되고, 최신 버전이 Docker Hub에 자동으로 푸시된 후 EC2 인스턴스에 배포됩니다.
먼저 저희 프로젝트는 다음과 같은 마이크로 서비스로 구성되어있습니다.
- Eureka (서비스 디스커버리)
- Gateway
- Auth
- User
- Payment
- Notification
- Post
- Promotion
- Reservation
이러한 여러 서비스들을 효율적으로 배포하기 위해 GitHub Actions와 dockerTagAndPush.sh 스크립트를 활용하고 있습니다.
배포 자동화의 장점
배포 파이프라인을 자동화하면 다음과 같은 장점을 얻을 수 있습니다.
- 시간 절약: 코드 푸시 후
수작업이 필요 없어 개발에만 집중할 수 있습니다. - 신뢰성 증가: 일정한 배포 프로세스를 통해 오류 발생 가능성이 줄어듭니다.
- 추적 가능성 향상: 이미지 버전에 commit hash를 포함하여, 특정 버전의 이미지로 롤백이 가능해 디버깅과 유지 보수가 용이합니다.
CI/CD 자동화 배포 파이프라인
1단계: GitHub Actions 워크플로우 설정
name: CD with Gradle
on:
push:
branches: [ "main" ]
env:
DOCKER_HUB_NAMESPACE: @@@@@@
jobs:
build:
name: Build
runs-on: ubuntu-latest
strategy:
matrix:
service: [eureka, auth, gateway, GlowGrow-users, notification, payment, post, promotion, reservation]
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up JDK 17
uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Build with Gradle
run: ./gradlew :${{matrix.service}}:clean :${{matrix.service}}:build -x test --no-daemon
먼저 GitHub Actions 워크플로우를 정의해 줍니다. 이 워크플로우는 main 브랜치에 새로운 커밋이 푸쉬될 때마다 실행되도록 설정했습니다.
브랜치 전략은 Git Hub Flow 전략을 사용했습니다.
- 서비스별 빌드 전략
- matrix.strategy를 사용해 서비스 목록을 지정하여, 각 서비스별로 빌드가 독립적으로 수행됩니다.
- 이를 통해 여러 마이크로서비스가 병렬로 빌드되므로 빌드 시간이 단축됩니다.
- JDK 설정
- 각 서비스는 JDK 17을 사용해 빌드됩니다.
- Gradle 빌드
- 서비스별 Gradle 빌드를 수행합니다. 이 단계에서는 테스트는 제외(-x test 옵션)하고, 빌드 과정에서
대기하지 않도록 설정(--no-daemon)을 사용해 불필요한 리소스를 절약합니다.
- 서비스별 Gradle 빌드를 수행합니다. 이 단계에서는 테스트는 제외(-x test 옵션)하고, 빌드 과정에서
2단계: Docker 이미지를 빌드하고 Docker Hub에 푸시
Docker:
name: Build docker image and Push to registry
needs: build
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
- name: web docker build and push
run: |
docker login -u ${{ secrets.DOCKER_USERNAME }} -p ${{ secrets.DOCKER_PASSWORD }}
- name: Give execution permission
run: chmod +x ./dockerTagAndPush.sh
- name: Build, Tag and Push docker image to Hub
run: |
docker compose build
./dockerTagAndPush.sh
env:
DOCKER_HUB_NAMESPACE: ${{ secrets.DOCKER_HUB_NAMESPACE }}
docker-compose.yml 파일을 사용해 모든 이미지를 한 번에 빌드합니다. 이후, dockerTagAndPush.sh 스크립트를 사용해 Docker Hub로 이미지를 업로드합니다.
- AWS 자격 증명 설정
- EC2 서버에 배포할 수 있도록 필요한 AWS 자격 증명을 설정합니다.
- Docker Hub 로그인
- Docker Hub에 이미지를 업로드하기 위해 인증합니다.
- Docker 이미지 빌드 및 푸시 스크립트
- docker-compose.yml 파일을 사용해 모든 이미지를 한 번에 빌드합니다.
- 이후, dockerTagAndPush.sh 스크립트를 사용해 Docker Hub로 이미지를 업로드합니다.
dockerTagAndPsuh.sh 파일에 대해서는 다음 포스팅에서 정리하겠습니다.
3단계: AWS EC2로 배포 및 Docker Compose를 이용한 컨테이너 실행
Deploy:
name: Deploy
needs: Docker
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Copy Docker compose file to EC2
uses: appleboy/scp-action@v0.1.7
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_KEY }}
source: "docker-compose.yml"
target: "/home/ubuntu"
- name: Deploy to EC2
uses: appleboy/ssh-action@v1.0.3
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
AWS_REGION: ${{ secrets.AWS_REGION }}
DOCKER_HUB_NAMESPACE: ${{ secrets.DOCKER_HUB_NAMESPACE }}
with:
host: ${{ secrets.EC2_HOST }}
username: ubuntu
key: ${{ secrets.EC2_KEY }}
port: 22
envs: AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_REGION, DOCKER_HUB_NAMESPACE
script: |
sudo docker-compose down
sudo docker-compose pull
SPRING_PROFILES_ACTIVE=prod sudo docker-compose --env-file /home/ubuntu/.env up -d
이 단계에서는 EC2에 Docker Compose 파일을 복사하고, 해당 파일을 사용해 배포합니다. 먼저 기존 컨테이너를 중단한 후 최신 이미지를 풀하고, prod 프로파일로 컨테이너를 실행합니다.
이러한 과정을 통해 MSA 환경의 배포 파이프라인을 자동화할 수 있습니다.
'TIL,일일 회고' 카테고리의 다른 글
[TIL, 일일 회고] 2024.10.31 - 효율적인 MSA 배포를 위한 GitHub Actions의 Matrix Strategy 활용 (0) | 2024.10.31 |
---|---|
[TIL, 일일 회고] 2024.10.30 - MSA 배포 자동화를 위한 Docker 이미지 태깅 전략 (0) | 2024.10.31 |
[TIL, 일일 회고] 2024.10.28 - 안전한 결제를 위한 보안 강화 방안 생각해보기 (0) | 2024.10.28 |
[TIL, 일일 회고] 2024.10.27 - 고객과 디자이너의 매칭을 위한 게시글 정렬 시스템 개선 방안 고민해보기 (0) | 2024.10.27 |
[TIL, 일일 회고] 2024.10.26 - 로컬 개발 환경과 운영 환경을 위한 Logback 설정 (0) | 2024.10.26 |