본문 바로가기
DevOps

AWS Elastic Beanstalk (2) - github action을 연동한 배포

by byeongoo 2021. 12. 13.

이전 포스팅에서는 가장 기본적인 hello world 애플리케이션을 aws elastic beanstalk로 배포하는 방법에 대해서 알아봤다.

이번 포스팅에서는 github action을 연동하여 배포하는 방법에 대해서 살펴보겠다.

 

이전 포스팅을 보고 싶으면 여기를 참조한다.

 

여기서 작성한 hello-world 애플리케이션 깃허브는 여기를 참조하자. 

 

 

1. Github Action yml 빌드 파일 작성

프로젝트에 .github/workflows 디렉토리를 만들고 그 아래에 deploy.yml 파일을 생성한다.

 

github action에서 수행되는 build 스크립트를 작성한다.

name: helloworld-webapp

on:
  push:
    branches:
      - master
  workflow_dispatch: # 브랜치 push 뿐만 아니라 수동 실행도 가능하게 해줌

jobs:
  build:
    runs-on: ubuntu-latest # 깃허브 액션 스크립트가 작동될 OS 환경 지정

    steps:
      - name: Checkout
        uses: actions/checkout@v2 # 프로젝트 코드를 check out

      - name: Set up JDK 11
        uses: actions/setup-java@v2 # 깃허브 액션이 실행될 OS에 Java 설치
        with:
          java-version: '11'
          distribution: 'adopt'

      - name: Grant execute permission for gradlew
        run: chmod +x ./gradlew # gradle wrapper를 실행할 수 있도록 권한 부여
        shell: bash

      - name: Build with Gradle
        run: ./gradlew clean build # 프로젝트 빌드
        shell: bash

      - 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}}" # 빌드 완료 시간 출력하기
        shell: bash

 

깃허브 레포지토리에서 Actions 탭을 들어가보면 해당 내용을 확인할 수 있다.

 

클릭해서 들어가면 깃허브 액션 수행 내용을 자세히 볼 수 있다.

 

2. AWS IAM 인증키 발급

깃허브 액션에서 AWS 서비스를 사용하기 위해서는 AWS 서비스에 명령을 줄 수 있는 권한을 받아야한다. 이를 위해서 IAM 사용자를 이용한 인증키(accessKey, secretKey)가 있다.

 

AWS IAM메뉴에 접속하여 사용자를 클릭 후 사용자 추가 버튼을 클릭한다.

 

사용자 이름을 입력한다.

다음으로 기존 정책 직접 연결을 선택 후 "AdministratorAccess-AWSElasticBeanstalk" 를 선택한다. AWS Elastic Beanstalk에 관리자 권한을 주는 것 이다.

 

 

 다음을 누르면 입력한 내용을 검토하는 화면이 나온다. 이상이 없으면 사용자 만들기 버튼을 클릭한다.

 

이제 액세스 키를 만들면되는데 생성한 사용자에 들어가서 액세스키를 생성한다. 이 키를 github에 세팅해주면 된다.

 

사용자 뿐만 아니라 역할도 만들어준다.

IAM  -> 역할 -> 역할 생성

 

 

 

3. Github IAM 인증키 세팅

배포할 레포지토리의 Settings -> Secrets ->Actions -> New Repository secret 버튼을 클릭한다.

  • AWS_ACCESS_KEY_ID: IAM 엑세스키 ID
  • AWS_SECRET_ACCESS_KEY: IAM 비밀 엑세스 키

value에는 IAM에서 발급 받은 키를 입력해준다.

추가가 완료되면 키 2개가 추가된거를 볼 수 있다.

 

4. Github Action yml  파일 수정

AWS Elastic Beanstalk에 배포하기 위해서 deploy.yml 파일을 다시 수정한다. 마지막 "Generate deployment package" 부분과 "Beanstalk Deploy" 을 추가하였다.

name: helloworld-webapp

on:
  push:
    branches:
      - master
  workflow_dispatch: # 브랜치 push 뿐만 아니라 수동 실행도 가능하게 해줌

jobs:
  build:
    runs-on: ubuntu-latest # 깃허브 액션 스크립트가 작동될 OS 환경 지정

    steps:
      - name: Checkout
        uses: actions/checkout@v2 # 프로젝트 코드를 check out

      - name: Set up JDK 11
        uses: actions/setup-java@v2 # 깃허브 액션이 실행될 OS에 Java 설치
        with:
          java-version: '11'
          distribution: 'adopt'

      - name: Grant execute permission for gradlew
        run: chmod +x ./gradlew # gradle wrapper를 실행할 수 있도록 권한 부여
        shell: bash

      - name: Build with Gradle
        run: ./gradlew clean build # 프로젝트 빌드
        shell: bash

      - 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}}" # 빌드 완료 시간 출력하기
        shell: bash

        # gradle build를 통해 만들어진 jar 파일 beanstalk에 배포하기 위한 zip 파일로 만듬
      - 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 .

        # Beanstalk Deploy 플러그인 사용
      - name: Deploy to EB
        uses: einaregilsson/beanstalk-deploy@v19
        with:
          aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}     # github secrets로 등록한 값 사용
          aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} # github secrets로 등록한 값 사용
          application_name: helloworld-webapp         # EB application 이름
          environment_name: Helloworldwebapp-env-1    # EB environment 이름
          version_label: github-action-${{steps.current-time.outputs.formattedTime}}
          region: ap-northeast-2
          deployment_package: deploy/deploy.zip

 

5. Procfile, .ebextensions 파일 추가

deploy.zip 파일에 같이 포함되는 Procfile과 .ebextensions/00-makeFiles.config 파일을 작성한다.

 

.ebextensions/00-makeFiles.config

files:
    "/sbin/appstart" :
        mode: "000755"
        owner: webapp
        group: webapp
        content: |
            #!/usr/bin/env bash
            JAR_PATH=/var/app/current/application.jar

            # run app
            killall java
            java -Dfile.encoding=UTF-8 -jar $JAR_PATH
  • Beanstalk은 시스템의 대부분을 AWS에서 자동으로 구성해주기 때문에 기존 EC2에 직접 설치할때처럼 사용할 순 없다.
    그래서 직접 Custom 하게 사용할 수 있도록 설정할 수 있는 방법이 바로 .ebextensions 디렉토리이다. 이번에 우리가 사용할 Custom 기능은 애플리케이션 실행 스크립트 생성입니다.
    Beanstalk이 Github Action으로 전달 받은 zip파일 (배포 파일)이 압축이 풀리고 나서 어느 파일을 어떤 파라미터로 실행할지를 설정하는 스크립트라고 보면된다.
  • java -jar application.jar 하는 코드를 스크립트로 만든다고 보면된다.
files:
    "/sbin/appstart" :
        mode: "000755"
        owner: webapp
        group: webapp
        content: |
            #!/usr/bin/env bash
            JAR_PATH=/var/app/current/application.jar

            # run app
            killall java
            java -Dfile.encoding=UTF-8 -jar $JAR_PATH
  • /sbin 아래에 스크립트 파일을 두면 전역에서 실행 가능하다.
  • /sbin 아래에 appstart란 이름의 스크립트 파일을 만들고, 권한은 755, 사용자는 webapp으로 하여 content 내용을 가진 스크립트 파일이 생성된다고 보면 된다.
  • 여기서 만들어진 /sbin/appstart 스크립트 파일이 Procfile에서 실행된다.

 

Procfile

web: appstart

 

코드를 push 하면 deploy가 잘 되고 변경된 소스가 잘 적용된 것을 확인할 수 있다.

 

이 과정중에 삽질했던 부분이 있는데 스프링 부트 2.5부터는 gradle 로 빌드 하고 나서 build/lib 안에 "plain" 이 붙은 .jar 파일이 하나 더 생성되어 deploy.yml 에서 Generate deployment package를 수행하는 도중 에러가 났었다.

 

build.gradle 에 다음 설정을 추가해주면 plain이 붙은 .jar이 생성되지 않는다.

jar {
    enabled = false
}

REFERENCE

https://jojoldu.tistory.com/549

 

2. Github Action & AWS Beanstalk 배포하기 - profile=local로 배포하기

지난 시간에 만들어둔 Github Action을 통해 profile=local로 Beanstalk에 배포를 진행해보겠습니다. profile=local, 즉, 운영 DB와 구글&네이버 OAuth 를 사용하지 않는 간단한 테스트 용도로만 배포할 예정입니.

jojoldu.tistory.com

https://earth-95.tistory.com/m/111

 

[AWS, Github Action] Elastic Beanstalk에 SpringBoot 배포하기(2) - IAM 인증키 Github Action에서 사용하여 배포

들어가기 전에 해당 글은 Elastic Beanstalk의 기본 세팅이 되어 있다는 가정하에 진행합니다. 만약, Elastic Beanstalk의 어플리케이션 및 환경 구성이 되어 있지 않다면 하기 글을 클릭하여 먼저 구성하

earth-95.tistory.com

https://earth-95.tistory.com/m/111

 

[AWS, Github Action] Elastic Beanstalk에 SpringBoot 배포하기(2) - IAM 인증키 Github Action에서 사용하여 배포

들어가기 전에 해당 글은 Elastic Beanstalk의 기본 세팅이 되어 있다는 가정하에 진행합니다. 만약, Elastic Beanstalk의 어플리케이션 및 환경 구성이 되어 있지 않다면 하기 글을 클릭하여 먼저 구성하

earth-95.tistory.com