Github Action으로 Spring boot 배포하기(2)

김우진·2022년 9월 9일
0

들어가기 전...

배포는 EC2에다가 할 예정이라 같은 AWS Service인 CodeDeploy를 통해서 진행할 것입니다.

CodeDeploy는 배포를 다른 AWS Service인 S3에 배포할 프로젝트를 zip으로 압축 후 올린 뒤 이 파일 경로를 이용해 배포 대상(EC2 Server)에 소스를 옮기는 방식을 사용합니다.

그러므로 배포용 S3가 필요합니다.

배포에 들어가기 전 S3용 IAM 사용자 생성

  1. AWS의 IAM 페이지로 들어가 왼쪽 tab에서 '사용자'를 누른 뒤 '사용자 추가' 버튼을 누릅니다.

  2. 사용자 이름을 작성하고 아래의 AWS 액세스 유형에서 '액세스 키 ID와 secret 액세스 키'를 이용한 액세스 키 방식을 선택합니다.

  3. 기존 정책 직접 연결을 누르고 권한을 추가해줍니다. 우리는 S3를 동해서 Ec2에 배포를 할 것이므로
    'AmazonEC2FullAccess', 'AmazonS3FullAccess', AWSCodeDeployFullAccess' 3가지 권한을 추가해줍니다.
    검색할 때 아래와 같이 키워드로 검색하시면 조금 더 빠르게 찾을 수 있습니다.

  1. 태그 페이지와 검토 페이지는 따로 설정할 것이 없으므로 넘겨줍니다.

  2. 그러면 아래와 같이 액세스 키 ID와 비밀 액세스 키를 발급받을 수 있습니다. 이 두 키는 앞으로 사용해야 하므로 잘 저장해둡니다.
    (github의 commit, push 등을 통해서 유출되지 않도록 하는 것이 중요합니다.
    생각보다 application.properties 등을 통해서 변수로 설정한 secret key 유출이 자주 일어납니다.)

github repository에 Action에 필요한 secret 변수 추가

github에서는 위에서 말한 중요한 변수들을 위해 Secret 변수를 설정할 수 있습니다.

  1. github repository에서 Settings tab의 Secrets-Actions를 누른 뒤 New repository secret을 누릅니다.

  2. Name에는 변수 이름, value에는 변수의 값을 적어주면 됩니다. 우리는 위 IAM의 유저의 Key ID 와 Key Secret를 만들어줍니다.

  3. 2번의 방법으로 AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY가 변수로 만들어 진 것을 확인할 수 있습니다.

S3 생성 및 Action 연결

  1. AWS의 S3 페이지에서 버킷 tab을 통해 새로운 버킷을 만듭니다.

  2. 버킷 이름을 적고 리전은 서울로 설정합니다. 추가로 객체 소유권을 ACL 비할성화됨(권장)으로 설정합니다.
    (우리는 IAM에서 만든 사용자로 접속할 것이므로 권한 없는 다른 사용자의 접근을 막아 줍니다.)
    ACL 비활성으로 설정을 하면 기본값으로 모든 퍼블릭 액세스를 차단합니다.
    다른 것은 설정할 필요 없으므로 버킷을 만들면 됩니다.

  3. github action의 설정 파일에 아래와 같이 S3와 관련된 내용을 추가합니다.
    env: S3_BUCKET_NAME:에는 자신의 bucket 이름을 적어주면 되고, Make zip file과 Upload to S3 부분에는 경로로 ./올라갈 파일 이름.zip을 적어주면 됩니다. 자세한 내용은 아래에 코드 부분으로 적어주었으니 확인하길 바랍니다.

name: Java CI with Gradle

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

permissions:
  contents: read
  
env:
  S3_BUCKET_NAME: {자신의 BUCKET NAME}

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - name: Checkout
      uses: actions/checkout@v3
    
    - name: Set up JDK 11
      uses: actions/setup-java@v3
      with:
        java-version: '11'
        distribution: 'temurin'
        
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
        
    - name: Build with Gradle
      uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
      with:
        arguments: build

    - name: Make Directory
      run: mkdir -p deploy
      
    - name: Copy Jar
      run: cp ./build/libs/*.jar ./deploy
      
    - name: Make zip file
      run: zip -r ./{ 올라갈 zip 파일 이름 }.zip ./deploy
      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: ap-northeast-2
        
    - name: Upload to S3
      run: aws s3 cp --region ap-northeast-2 ./{ 올라갈 zip 파일 이름 }.zip s3://$S3_BUCKET_NAME/

이렇게 설정해주고 commit을 하면 build 후에 S3에 .zip 파일이 생성되는 것을 확인할 수 있습니다.
다음 게시글에서는 EC2 서버를 만들고 배포를 위한 CodeDeploy agent 설치 및 jdk 설치를 진행하겠습니다.

0개의 댓글