[AWS] CI/CD 무중단 배포 연습

merci·2023년 5월 4일
0

AWS

목록 보기
6/6

CI/CD 개념

지속적인 통합(Continuous Integration)

프로젝트를 깃에 머지하는 과정으로 자동화된 빌드와 테스트로 에러사항을 파악해 해결할 수 있다.

지속적인 전달 (Continuous Delivery) /지속적인 배포(Continuous Deployment)

지속적 전달 : 테스트와 빌드 과정을 자동화하고 새로운 버전을 스테이징 환경에 배포하여 실제 배포를 준비
지속적 배포 : 커밋을 하면 자동적으로 테스트, 빌드, 배포의 과정을 진행한다.



1. 예산 설정 하기

AWS로 가서 예산을 설정한다.

예산설정 ( 제로, 월별등이 존재 )

생성된 예산

2. 예제 git fork

완성된 프로젝트 예제를 fork한 후 프로젝트를 연다.
https://github.com/codingspecialist/aws-v5

배포시 필요한 파일들

build.gradle 에 다음 추가해서 라이브러리가 없는 plane.jar 생성 하지 않도록 한다.

  • 이유 - *.jar 를 실행하는 코드를 이용할 예정 ( 하나만 생성되어 있어야 함 )
# 2. plain 파일 생성하지 않는 설정
jar {
	enabled = false
}

아래 코드로 빌드시 테스트를 먼저하고 빌드를 진행

./gradlew clean build

빌드 폴더가 생성된다.
aws-v5-0.0.1.jar

생성된 jar 파일 실행 테스트

yml 버전 차이 - dev / prod

지금은 dev 버전으로 실행되었다.
( 3개의 yml 파일로 실행 버전을 선택한다 )

# application.yml
spring:
  profiles:
    active:
    - dev

실행되면 dev 프로파일을 활성화
( 배포시에는 prod 프로파일을 활성화 한다 )

실제 배포시에는 아래 코드에 의해서 prod 버전이 실행된다.

dev / prod 버전 - db 차이

개발시 h2 개발 ( dev 버전 )

배포시 마리아 ( prod 버전 )

배포 전 테스트 통과 ( 중요 !!!! )

3. CD - git actions

자기 깃으로 가서 actions 생성


git actions 를 이용하는 이유 ?

  • actions를 생성해 테스트 할 수 있는 환경을 만든다.
  • actions는 AWS 와 동일한 환경을 제공해준다.
  • 내부적으로 가상의 docker를 제공한다.
    즉, git actions 에서 먼저 테스트를 한 후 AWS 에 배포하기 위함

git actions 는 어떤 일을 할까 ?

  1. 지정된 브랜치에 push가 되면 자기가 내려받는다. -> 깃 내부의 트리거 설정으로 actions에 hook을 날려 다운 받게함

  2. actios가 다운 받은 프로젝트를 build 한다. -> actions는 jar를 실행할 환경이 없으므로 환경 설정을 해줘야한다.

.github 폴더

프로젝트의 .github폴더 는 GitHub에서 프로젝트를 관리하는 데 사용되는 설정 파일들을 저장하는 곳이다.
GitHub Actions 워크플로우를 이용하기 위해서 .github/workflows 디렉토리를 이용한다.
내부에 CI/CD 및 자동화 작업을 수행할 수 있게 만들어주는 워크플로우 설정파일을 넣어야 한다. -> deploy.yml

deploy.yml 이 수행하는 작업

  1. ubuntu 환경 설치
  2. java 설치
  3. timezone 설정
  4. git down 받기
  5. build -> jar 파일

이후 GitHub Actions 에서 jar 파일을 zip 파일로 압축한 뒤에 AWS S3로 보내고 엘라스틱빈스톡에 zip 파일을 보낸다.
( 이 포스팅에서는 S3 생략 )

워크플로우 설정 - deploy.yml

프로젝트에서 아래 위치에 스크립트를 작성한다.

main 브랜치에 푸쉬되면 실행

name: aws-v5
on:
  push:
    branches:
      - main

스크립트 이어서 작성 ( 1 ~ 5 단계를 수행 )

# https://github.com/actions/setup-java
# actions/setup-java@v2는 사용자 정의 배포를 지원하고 Zulu OpenJDK,
# Eclipse Temurin 및 Adopt OpenJDK를 기본적으로 지원합니다. v1은 Zulu OpenJDK만 지원합니다.
jobs:
  build:
    runs-on: ubuntu-latest # 최초 ubuntu를 설치
    steps:
      - name: Checkout
        uses: actions/checkout@v3 # 버전 3에 맞는 프로그램 설치 가능
      - name: Set up JDK 11
        uses: actions/setup-java@v3 # 자바 설치
        with:
          java-version: 11
          distribution: zulu # 지정해줘야 함
      - name: Grant execute permission for gradlew
        run: chmod +x ./gradlew # 빌드 할 수 있는 권한 설정
      - name: Build with Gradle
        run: ./gradlew clean build # 빌드

      # UTC가 기준이기 때문에 한국시간으로 맞추려면 +9시간 해야 한다.
      - 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}}" # 시간 표시

스크립트 이어서 작성

ebextension + procfile ( 실행 스크립트 ) 를 포함한 파일로 압축 -> 엘라스틱 빈스톡으로 전달 -> 빈스톡이 EC2로 전달한다.

      # EB에 CD 하기 위해 추가 작성
      # -r 옵션은 디렉토리 내의 모든 하위 파일과 디렉토리를 복사하는 데 사용
      - 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 }} # 중괄호 2개는 깃헙 환경변수 접근
          aws_secret_key: ${{ secrets.AWS_SECRET_KEY }}
          application_name: aws-v5-beanstalk # 엘리스틱 빈스톡 애플리케이션 이름!
          environment_name: Awsv5beanstalk-env # 엘리스틱 빈스톡 환경 이름!
          version_label: aws-v5-${{steps.current-time.outputs.formattedTime}}
          region: ap-northeast-2 # 서울 서버로 압축파일을 전달해줌
          deployment_package: deploy/deploy.zip

변경한 사항을 커밋하고 main 브랜치에 푸쉬하면 actions에 변화가 발생한다.
작성한 스크립트 deploy 설정대로 ubuntu 설치부터 진행이 된다.

여기까지가 CI의 과정이다.





4. Elastic Beanstalk

프로젝트만 업로드하면 Elastic Beanstalk이 운영 환경을 자동으로 생성하고 관리한다.
기본적으로 jdk 및 여러가지가 설치되어 있는 환경이다.
압축된 파일을 받아서 코드 디플로이 서버를 통해 ec2로 전달해준다.

Elastic Beanstalk의 구성

내부의 ec2 서버가 여러개 있고 앞에 로드밸런서가 존재한다.
로드밸런서가 트래픽에 따라서 라우팅을 자동으로 해준다.

procfile

빈스톡에 zip이 전달되면 자동으로 압축을 풀고 내부의 procfile을 실행시킨다.

springapp: appstart

.ebextensions

AWS Elastic Beanstalk의 환경 구성을 위한 설정 파일들을 가진 폴더
00- 으로 시작하면 가장 먼저 실행되는 설정 파일이다.

files:
    "/sbin/appstart": # 파일 생성 ( path 가 설정되어 있음 )
        mode: "000755"  # 권한 설정
        owner: webapp
        group: webapp
        content: |
            #!/usr/bin/env bash
            JAR_PATH=/var/app/current/application.jar # 환경변수 설정

            # run app
            java -Dspring.profiles.active=prod -Dfile.encoding=UTF-8 -jar $JAR_PATH

키 연동하기

빈스톡을 이용하기 위해 AWS에 접근가능한 키 설정을 한다.
GitHub Actions에 키 설정과 AWS의 키 설정이 일치해야 한다.

AWS IAM 으로 이동한다.

< 간단한 설명 >
권한들을 모으면 정책이 된다.
예를들어 관리자 권한이 할 수 있는 것들 -> 관리자 정책

사용자 그룹을 만들면 그룹에 정책을 부여해서 사용자를 그룹에 넣기만 하면 정책이 부여된다.
역할은 서비스가 할 수 있는 일을 지정


사용자 추가



elastic 검색후 정책 부여 -> 빈스톡 접근 권한 부여


사용자가 생성되었다.

키 생성

GitHub Actions가 엘라스틱 빈스톡에 접근하기 위해서 사용자의 key를 이용한다.
내부에서 엘라스틱 빈스톡이 ec2에 접근하기 위해서도 권한이 필요하다. (key)
여기서 엘라스틱 빈스톡 배포서버(서비스)는 ec2등에 접근할 역할이 부여되어야 한다.



체크 후 다음

.csv 파일을 다운 받는다.

발급받은 키 연동

깃헙으로 이동


이름은 deploy.yml 에 설정한대로 키를 설정한다.

AWS_ACCESS_KEY 키 생성
AWS_SECRET_KEY 키 생성

키를 생성한다.

역할 만들기

IAM 역할로 이동


검색 후 권한 추가 - 빈스톡 사용하는 권한

역할 이름 설정 후 생성

생성된 역할

엘라스틱빈스톡 생성

외부에서 80으로 요청을 하면 엘라스틱 빈스톡의 NGINX가 5000포트로 포트포워딩을 해준다.

아래 코드를 참고해서 생성한다.


환경이름은 자동으로 설정 된다.

생성된 환경에 맞게 수정


다음을 누른 후

외부에서 접근 허용(ssh)

서브넷 체크 후 다음

보안그룹 기본 설정

오토스케일링 설정

다른 설정 디폴트로 놔두고 리스너 설정

80 -> ec2로 포트포워딩

배포 후 / 주소에 200 응답을 못 받으면 롤백하는 설정 ( 디폴트 )

돈 들어가니 껏음

롤링 업데이트 정책

변경 불가로 설정한다.

  • 한번에 -> 무중단 배포가 안된다.
  • 롤링 -> 하나씩만 한가할 때 배포 ( 새벽 ) - 무중단 배포
    롤링 시 모든 배포가 성공하지 않으면 모든 서버를 롤백한다.
  • 변경불가 -> ec2를 복사한 서버에 배포 후 성공하면 로드 밸런서가 포트포워딩을 바꿈
    위 과정은 온디맨드이기 때문에 가능하다.
    ( 온디맨드 - 서비스를 클라우드에 두고 빌려쓰는 정책 )

환경변수 추가 ( 각종 key 를 넣는다. )

yml 참고해서 설정한다. - RDS 이용

이후 생성하면 검토 할수 있는 창이 나온다. 검토후 제출 !

제출 후 몇 분이 지나면 성공 !

환경으로 이동후 도메인 클릭

아래와 같은 화면이 나온다면 빈스톡이 실행되고 있다.

버튼을 눌러서 바로 업로드도 가능하다.

5. RDS 설정

이후 RDS 로 db 생성한다.






보안그룹 설정 변경
RDS 에 접근가능하도록 엘라스틱 빈스톡의 보안그룹을 RDS 에 연결시킨다.

해당 보안그룹의 인바운드 설정으로 내부의 포트는 열어둬야 한다. ( 3306, 80, + 사용자의 IP (다이렉트하게 접근))

보안그룹을 개발자가 직접 만들게 되면 엘라스틱빈스톡의 모든것들을 직접 연결시켜야 해서 불편하다.
엘라스틱빈스톡이 생성한 보안그룹을 사용하면 자동으로 연결되서 편하다.

6. 실제 배포하기

깃헙 액션이 먼저 테스트가 진행된다.

깃헙 액션에서 생성된 환경으로 테스트가 완료된 후 빈스톡으로 Deploy 중

빈스톡 상태 로그

배포 도중 인스턴스가 추가 된다 ( 블루 / 그린 배포 )

deploy 성공

정상 인스턴스만 남게 된다.

블루 / 그린에 의해 임시 ec2는 삭제된다.

profile
작은것부터

0개의 댓글