3. 도커를 이용한 beanstalk 배포하기 with Github Actions

woohobi·2022년 6월 30일
0
post-thumbnail

이번 포스팅에서는 지금까지 docker이미지 생성, aws Elastic Beanstalk에 이미지를 업로드한 과정 등을 Github Actions를 이용해 자동화시켜보겠습니다.

Github Actions 란?

기존에 Jenkins, Circle ci에서 ci/cd를 제공하는 것과 동일하게 github에서 제공하는 ci/cd 툴입니다. 제가 느낀 장점은 다음과 같습니다.

먼저, github에서 제공되고 있는 기능이어서 따로 설치할 필요가 없고, github action marketplace에서 수많은 기능들을 손쉽게 사용할 수 있을 때면 행보캅니다,,, (감덩) 따로 jenkins를 docker 설정하지 않고 yml 파일만 업로드해주면 된다는 점도 너무 매력적입니다

이번 포스팅에서 2개의 yml 파일을 작성해서 actions들을 만들건데, 먼저 첫번째는 빌드 입니다. Github actions 를 자세히 설명하는 포스팅은 아니기 때문에 간단히 알아보고 넘어가겠습니다.

Github Actions 흐름도

두 가지의 actions을 정의해볼 건데, 첫번째는 build 액션과 두번째는 deploy 액션입니다. 먼저 살펴볼 action은 빌드 과정에 문제가 없는지 체크하는 액션입니다. 모든 테스트 코드와 빌드에 오류가 없을때만 정상적으로 동작합니다.

build 액션

name: build CI

on:
  pull_request:
    branches: [main] 

jobs: #jobs 는 여러개의 step들로 이루어집니다.
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3 # workflow가 repository를 접근할 수 있게 checkout합니다.
      - name: Set up JDK 11
        uses: actions/setup-java@v3 # java 환경 설정
        with:
          java-version: '11'
          distribution: 'temurin'
      - name: Build with Gradle # gradle을 이용한 java 빌드
        uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
        with:
          arguments: build

스크립트에 대해서 간단히 설명하면,

  • on:
    • main branches에 pull request가 오면 정의된 job이 실행됩니다.
  • jobs:
    • workflow는 여러 개의 job으로 이루어져 있고, job은 각각의 스텝을 가집니다.
  • runs-on:
    • 실행되는 환경에 대해서 정의합니다. 여기에서는 최신의 ubuntu 환경을 사용합니다.
  • uses:
    • Github Actions은 앞서 언급했듯이 actions들을 공유할 수 있는데 누군가 공유해놓은 action들을 사용할 수 있습니다. 여기에서는 java 세팅을 위한 action과, gradle build 액션을 사용하였습니다. 각각의 자세한 사용방법은 action marketplace들을 참조하시면 됩니다.

위의 정의된 action 을 통해, 빌드에 아무 문제가 없는지 확인합니다. 만약 테스트코드 오류나 빌드과정에 문제가 있다면 오류를 발생시킵니다.

branch를 새로 만들고 변경사항을 push 하고, main branch에서 pull request를 요청하면 아래와 같이 정의한 github action이 잘 동작하는 것을 볼 수 있습니다.!!


deploy 액션

다음은 deploy 자동화를 위한 script를 작성해보겠습니다.


name: deploy

on: # main branch에 push를 할 때 동작합니다!
  push:
    branches: [ main ]

  workflow_dispatch:

env:
  # Java
  JAVA_VERSION: 1.15
  # DockerHub
  DOCKER_HUB_USERNAME: woohobi
  # AWS & Elastic Bean Stalk
  AWS_REGION: eu-central-1
  EB_ENVIRONMENT_NAME: Deployment-env
  EB_APPLICATION_NAME: deployment
  EB_DEPLOYMENT_PACKAGE: elasticbeanstalk/docker-compose.yml

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - name: Setup Java JDK
        uses: actions/setup-java@v1.4.3
        with:
          java-version: ${{ env.JAVA_VERSION }}

      - name: Build Number
        id: build-number
        run: echo "::set-output name=BUILD_NUMBER::$(date '+%-d.%-m.%Y.%-H.%-M.%-S')"

      - name: Docker Login
        uses: docker/login-action@f3364599c6aa293cdc2b8391b1b56d0c30e45c8a
        with:
          username: ${{ env.DOCKER_HUB_USERNAME }}
          password: ${{ secrets.DOCKER_HUB_PASSWORD }}

      - name: Push to Dockerhub
        run: ./gradlew jib

      - name: Beanstalk Deploy
        uses: einaregilsson/beanstalk-deploy@ebe3476a4ce991d54336935e75e78dd9d86f9408
        with:
          aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          region: ${{ env.AWS_REGION }}
          environment_name: ${{ env.EB_ENVIRONMENT_NAME }}
          application_name: ${{ env.EB_APPLICATION_NAME }}
          deployment_package: ${{ env.EB_DEPLOYMENT_PACKAGE }}
          version_label: ${{ steps.build-number.outputs.BUILD_NUMBER }}
          version_description: Version ${{steps.build-number.outputs.BUILD_NUMBER}} deployed via github actions ${{ github.sha }}
          wait_for_deployment: 60

deploy 액션에서는 docker login, aws 배포를 위해 env 변수 설정 해줍니다. 각각의 변수들은 docker hub, aws 페이지에서 확인할 수 있습니다. 한국에 계시다면 aws-region을 ap-northeast-2로 설정해주시면 됩니다.

docker image를 업로드하고, aws Elastic Beanstalk에 자동 배포를 하기 위해서는 몇가지의 추가 과정이 필요합니다. 한 가지씩 살펴보겠습니다.

1. AWS IAM 계정 생성

AWS Identity and Access Management(IAM)은 AWS 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹 서비스입니다. IAM을 사용하여 beanstalk에 배포를 할 수 있는 권한을 부여해줍니다.

IAM - 엑세스 관리 - 사용자 - 사용자 추가 경로로 사용자를 추가하고 권한을 부여해야 합니다. 우리는 github actions 에서 CLI 방식으로 배포를 할 것이기에 프로그래밍 방식 엑세스 를 체크해줍니다.

권한 설정 파트에서는 기존 정책 직접 연결 - AWS ElasticBeanstalk Administrator Access 를 체크해줍니다. (기존에 AWS ElasticBeanstalk FullAccess 에서 변경되었습니다.)

다음 페이지에서 권한 설정을 해줍니다.

다른 부분은 default 상태로 넘어가면 성공적으로 IAM 사용자를 만든 것을 볼 수 있습니다. 엑세스 키와 비밀 엑세스 키는 일종의 아이디 - 비밀번호 라고 생각해주시면 됩니다.

2. github secrets 추가

또 한 가지 주의할 점은 yml 파일은 github에 업로드하는 파일이어서 password 같은 중요한 정보는 절대 외부에 노출하면 안 됩니다. github secrets을 통해 key-value의 암호화 된 형태로 변수들을 사용할 수 있습니다.
AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, DOCKER_HUB_PASSWORDNew Repository secret 을 통해 추가해줍니다.

배포

배포하기 전

새로운 버전을 배포하기 전, ("/hello") 경로로 접속하면 404 에러가 뜨는 모습을 확인할 수 있습니다.

간단한 api를 작성하고 자동화가 잘 동작하는지 확인해보겠습니다.

@RestController
public class helloController {

    @GetMapping("/hello")
    public String hello() {
        return "hello Changwan!";
    }

}

🔥 자동화 배포

변경 사항을 새로운 branch에 commit - push 하면 pull request를 생성할 수 있는 창을 볼 수 있습니다

pull request 를 누르면 처음에 build.yml에 작성한 스크립트대로 동작하겠죠??!

build가 문제 없이 동작한 것을 확인할 수 있고, pull request를 main branch로 merge 해줍니다!

merge를 해주면 우리가 작성한 controller 대로 값을 리턴해주는 것을 확인할 수 있습니다 🙌🙌

이번 시리즈를 통해 도커 이미지를 beanstalk에 배포하였고, github actions 를 통해 이미지 배포를 자동화하는 것까지 해보았습니다. 이 시리즈는 여기까지고 많은 도움이 되었으면 바랍니다 ㅎㅎㅎ!!!

profile
CDD - Coffee Driven Development

0개의 댓글