본문 바로가기
활동/크래프톤 정글 2기

01 | 무중단 배포환경 구축(Blue/Green) - 1

by lucid_07 2023. 9. 8.
반응형

프로젝트에서 적용한 Blue/Green 배포 환경

버전 관리: Github
CI/CD: Github Actions, Code Deploy, S3
정적 분석: Sonar Cloud (+ Peer inspection)
서버 / 클라우드: AWS
구현: Spring framework
빌드: Gradle
배포시 서버 보조(리버스 프록시): NginX
DB: MySQL, Redis

 

Tools

직접 구축해 나가면서 아래의 설명들을 더 잘 이해할 수 있었다. 자세한 개념과 설명은 출처 글들을 읽어보기 바란다. 이 글에서는 각각에 대해 자세하게 파고들지는 않았다.

 

Github Actions

출처 1 출처 2

Github Actions는 Github 저장소를 기반으로 소프트웨어 개발 워크플로우를 자동화, 사용자의 설정에 맞추어 지정, 실행할 수 있는 도구이다. Build, test, packaging, release, deploy등 다양한 이벤트를 기반으로 원하는 워크플로를 만들 수 있다. 이 워크플로는 Runners라고 불리는 Github에서 호스팅하는 Linux/macOS/Windows환경에서 실행된다. 또한, 원하는 작업을 위한 워크플로를 검색, 생성, 공유하여 여러 작업들을 결합할 수 있다. 퍼블릭 레포지터리의 경우 무료로 사용할 수 있다.

👉  Github Actions를 통해 deploy 버튼을 누를 때마다(main 브랜치에 pull되는 경우에도 자동으로 실행되도록 할 수 있다) 레포지토리의 어플리케이션을 빌드, 압축하여 S3로 복사하고, 이를 Codedeploy가 배포하고 NginX가 막힘없이 실행되게 하는 등 전체적인 workflow를 관리할 것이다.

 

Code Deploy

출처1

운영 환경에의 애플리케이션 배포를 자동화하는 AWS의 지속적 배포(CD, Continuous Deploy) 서비스. EC2, ECS, Lambda 등 플랫폼에 대한 제약 없이 배포할 수 있다. 오류가 있는 경우 자동/수동으로 배포를 중지하거나 AWS CLI를 통해 배포 시작 및 과정 추적을 할 수 있다.

👉  EC2에 자동 배포하는 기능을 사용할 것이다.

 

NginX 

출처 1 출처 2

  최신 앱의 증가하는 요구를 지원하기 위해 개발된 고성능 웹서버이며, 높은 성능, 높은 동시성 그리고 낮은 자원 사용에 중점을 두고 있다. 웹서버, 리버스 프록시 및 메일 프록시의 기능을 가지고 있다. 리버스 프록시로 작동하여 로드 밸런싱, 공격으로부터의 보호, 캐싱의 기능을 수행할 수 있다.

👉  배포가 진행될 때마다 최신 버전의 애플리케이션을 8080, 8081포트에 실행하면 그 포트에 리디렉션 해 주는 리버스 프록시의 역할을 할 것이다.

✨리버스 프록시
클라이언트의 요청을 받아 웹 서버로 전달하여 응답을 받은 후 다시 클라이언트에 전달하는 역할을 수행하는 서버. 클라이언트와 웹서버 사이에 존재한다.

 

Sonar Cloud

출처

Sonar Cloud는 클라우드 기반의 코드 분석 서비스로, 코딩 이슈를 감지하는 데 사용된다.

 

구축

크게 몇 가지 과정으로 나누어 볼 수 있다.

 

1. Github Actions 기본 flow 설정

name: Now Deploying

on:
  workflow_dispatch:

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: 'temurin'

      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
        shell: bash

      - name: Build with Gradle
        run: ./gradlew build
        shell: bash

Now Deploying 작업을 수동으로 event 발생시킬 때 수행하도록 하며, 그 작업에 대한 기본적인 환경을 설정하고 빌드해 주는 workflow이다. 다양한 workflow를 marketplace에서 가져와 적용할 수 있으며, 각 작업에 대한 내용과 자세한 설정은 해당 action의 페이지에서 확인할 수 있다.

  • Checkout: Git repository를 체크
  • Set up JDK 17: 특정 버전(여기서는 17)의 JDK를 설정하고 PATH에 command line tools를 추가한다.
  • Grant execute permission for gradlew: gradlew에 권한 부여
  • Build with Gradle: Gradle을 사용해 build한다.

Github Actions는 Runners라는 Github가 제공하는 환경에서 작동하므로 Runners에서 레포지터리의 코드를 빌드하기 위한 설정을 해 준 것이다.

 

2. AWS 설정: S3에 Jar 파일 업로드

서버 역할을 할 EC2와 빌드 후 결과물인 jar 파일을 저장할 S3 저장소에 대한 설정이다.

CI/CD 배포에서 S3를 사용하는 경우, Build한 Jar는 S3에 업로드, 배포하는 쪽에서 다운로드하는 방식으로 배포한다.

  • S3 bucket을 생성할 때에는 모든 퍼블릭 액세스를 차단한다.
  • IAM 권한은 기존 정책에서 amazon S3 full access, aws codedeploy full access를 정책을 활성화하여 github actions가 S3 버킷에 접근할 수 있도록 해 줄 것이다.
    • 이 때, 프로그래밍 방식 액세스를 선택하며, (지금 적용할 방법은) Github Actions에서 AWS CLI 명령을 통해 액세스 할 것이기 때문이다.
    • 마지막에 액세스 ID, 비밀 액세스 키를 발급받을 수 있다. 이는 github repository의 secrets에 등록하여 관리한다.
✨IAM
AWS 서비스에 대한 액세스 권한을 최소한으로 부여하고 관리할 수 있게 해 주는 서비스. 외부 뿐 아니라 AWS 서비스 간 접근하고자 할 때에도 권한 부여를 해 줄 수 있다.
  • AWS에서 위 설정이 끝나면 github actions는 다음과 같이 설정해 줄 수 있다.
name: Now Deploying

on:
  workflow_dispatch:

# S3 추가된 부분: 환경 변수 설정======
env:
  S3_BUCKET_NAME: githubactionsdeploy
  PROJECT_NAME: roadmaker-deploy
#=======

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: 'temurin'

      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
        shell: bash

      - name: Build with Gradle
        run: ./gradlew build
        shell: bash
        
      # S3 추가된 부분: zip으로 압축 후 aws로 전송 ===
      - name: Make zip file
        run: zip -r ./$GITHUB_SHA.zip
        shell: bash
        
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        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: Upload to S3
        run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$PROJECT_NAME/$GITHUB_SHA.zip
      # =======

AWS_ACCESS_KEY_ID와 같은 민감한 내용은 github secret에 등록하여 관리하였다.

$GITHUB_SHA

  • Github Actions에서 제공하는 환경변수의 하나. 현재 workflow를 실행시키는 커밋의 해쉬값이다: 다른 환경 변수들

${{secrets.KEY이름}}

  • Github Actions에서는 ${{}}을 통해 여러 함수나 표현식, 값을 등록하고 가져와서 쓸 수 있다: 레퍼런스
  • Github actions에서 S3에 접근하기 위해 발급한 IAM 권한 정보를 Github Secret에 등록하여 ${{}}를 통해 값을 불러오도록 하였다.

aws s3 cp

  • AWS CLI 명령어 중 하나로, 현재 위치의 파일을 S3에 업로드하거나 S3의 파일을 현재 위치에 다운로드 할 수 있다: AWS CLI 레퍼런스

 

참고 자료 | 많은 도움이 되었다.

GithubAcctions + CodeDeploy + Nginx로 무중단 배포하기

Spring-Boot-AWS-CodeDeploy-GitHub-Actios-자동-배포-및-HTTPS-통신-EC2편

NginX 이해하기

블루/그린 무중단 배포

반응형

'활동 > 크래프톤 정글 2기' 카테고리의 다른 글

01 | 무중단 배포환경 구축(Blue/Green) - 2  (0) 2023.10.06
나만의 무기 : 회고  (0) 2023.09.06