코딩기록

9. Github Action을 통한 최종 배포 진행 본문

인프라/리눅스, AWS

9. Github Action을 통한 최종 배포 진행

빌럽스 2024. 1. 2. 20:21

지난번 단계에서 RDS, 엘라스틱빈스톡 환경을 구축했다. 이번에 Github Action을 통한 최종 배포를 진행한다.

 

Github Action은 테스트, 배포, 필요한 스크립트 실행 등을 진행하여 ci/cd를 자동화 해주는 Github의 서비스이다.

Github Action에게 일을 시키기 위해, Spring 프로젝트에  deploy.yml / 00-makeFiles.config / Procfile 3개의 파일을 적절한 경로에 만들어 주어야 한다.

 

 

deploy.yml

.github/workflows/*.yml 파일에 배포에 필요한 액션이 작성되는 스크립트이다.

제공되는 라이브러리 활용이 가능하다.

name: lessonReserve
on:
  push:
    branches:
      - prod

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout  # 깃허브의 코드 저장소에 올려둔 코드를 CI 서버로 내려받은 후에 특정 브랜치로 전환하는 행위
        uses: actions/checkout@v3 # 라이브러리 사용

      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: 17
          distribution: zulu

      - name: Permission
        run: chmod +x ./gradlew

      - name: Build with Gradle
        run: ./gradlew clean build

      - name: Get current time  # 한국시간으로 시간 변경
        uses: 1466587594/get-current-time@v2
        id: current-time  # current-time을 아래에서 사용할 수 있도록 id 지정
        with:
          format: YYYY-MM-DDTHH-mm-ss
          utcOffset: "+09:00"

      - name: Show Current time
        run: echo "CurrentTime=${{steps.current-time.outputs.formattedTime}}"

      - name: Generate deployment package
        run: |  # | 여러가지 명령어를 적을 수 있음
          mkdir 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 }} #환경변수
          aws_secret_key: ${{ secrets.AWS_SECRET_KEY }} #환경변수
          application_name: lessonReserve # 엘리스틱 빈스톡 애플리케이션 이름
          environment_name: lessonReserve-env # 엘리스틱 빈스톡 환경 이름
          version_label: lessonReserve-${{steps.current-time.outputs.formattedTime}} # 버전 시간
          region: ap-northeast-2
          deployment_package: deploy/deploy.zip # Generate deployment package에서 압축한 deploy.zip 파일을 배포하겠다.




 00-makeFiles.config 및 Procfile의 사용순서 및 용도

 

<원래 엘라스틱빈스톡에 사용자가 jar 파일 직접 업로드 할 시 절차>

1. lessonReserve-0.0.1-SNAPSHOT.jar 을 업로드

2. 엘라스틱빈스톡에서 위 jar 파일을 var/app/current/applicatione.jar 로 수정해서 업로드

3. procfile 만들어 내서 실행

 

<Github Action을 통해 엘라스틱빈스톡에 배포하는 절차>

1. 00-makeFiles.config  -> /sbin/appstart 라는 파일을 가장 먼저 만들어 냄 / 해당 파일은 jar 파일을 실행하는 스크립트 

(참고, 리눅스 bin 폴더, sbin 폴더 내부의 파일은 -> 어느 폴더에서든지 실행할 수 있다.)

2. procfile 파일 실행 (= appstart를 실행시키는 스크립트) (appstart = /var/app/current/application.jar 실행하는 스크립트)



00-makeFiles.config

files:

    "/sbin/appstart":   이 파일을 만들어 낸다

        mode: "000755"     755권한 (4 2 1)

        owner: webapp

        group: webapp

        content: |

            #!/usr/bin/env bash

            JAR_PATH=/var/app/current/application.jar  // 해당 경로는 엘라스틱빈스톡에 zip 파일을 배포하면 jar 파일이 생성되는 경로

            # run app

            java -Dspring.profiles.active=prod -Dfile.encoding=UTF-8 -jar $JAR_PATH  //  nohup을 안쓰는 이유? 도커로 실행되기 때문



Procfile

springapp: appstart  // appstart 파일을 실행한다.



IAM 생성

: Github Action이 aws s3에 접근하기 위한 권한

 

사용자 생성

직접 정책 연결 : AdministratorAccess-AWSElasticBeanstalk 추가

액세스키 생성 (설명 태그 값: metacoding)

AWS_ACCESS_KEY: AKIARD6RABEEJZLK4R6S

AWS_SECRET_KEY: 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

 

위 코드는 실제로는 노출되면 안된다!

따라서 아래 경로의 깃허브 환경변수에 해당 코드를 설정하고, deploy.yml에 ${{ secrets.AWS_ACCESS_KEY }}와 같이 작성하는 것이다.

깃허브 aws-v5- Settings - Secrets and variables - Actions - New repository secret 에 AWS_ACCESS_KEY, AWS_SECRET_KEY 설정



RDS에 한글로 데이터 저장이 안되는 문제 해결

적용하는 파라미터의 character_set ~~ 모든 항목의 값을 utf8mb4로 지정 필요

그후 RDS 재부팅

 

/var/app/currrent/procfile 파일 및 /var/log/springapp.stdout.log 파일 확인해 보았으나 특이사항 없다.

 

진짜 이유는 Book 테이블이 utf8 반영되기 전에 만들어졌다. 테이블은 utf8 설정한 후에 만들어야 함

-> 테이블 삭제 후 다시 만들기 필요



nlb (고정 IP를 할당하기 위해 필요)

로드밸런서 생성 -> Network Load Balancer 생성

ec2가서 탄력적 ip 발급

네트워크 매핑 p-northeast-2a (apne2-az1) , ipv4 주소는 탄력적 ip로 설정

리스너 및 라우팅 -> 대상그룹생성

-> Application Load Balancer 체크

이름 aws-v5-alb

 

최종 배포 완료.