본문 바로가기
AWS

[CI/CD] AWS Elastic Beanstalk + Docker + Github Action로 Kotlin SpringBoot 프로젝트 [4] - AWS IAM, Github Action

by kiwi_wiki 2022. 9. 19.

- [CI/CD] AWS Elastic Beanstalk + Docker + Github Action로 Kotlin SpringBoot 프로젝트 [1]
- [CI/CD] AWS Elastic Beanstalk + Docker + Github Action로 Kotlin SpringBoot 프로젝트 [2] - HTTPS
- [CI/CD] AWS Elastic Beanstalk + Docker + Github Action로 Kotlin SpringBoot 프로젝트 [3] - Multi Module + Docker

 

빌드 & 배포하기

 

AWS IAM

github action을 통해 빌드하기 위해 AWS Elastic Beanstalk에 접근할 수 있는 권한을 가진 사용자가 필요하다.

AWS IAM 콘솔에 가서 사용자 메뉴에 들어가 사용자 추가를 누르자

 

사용자 이름을 작성하고 권한설정에서

기존 정책 직접 연결에 Elastic Beanstalk을 검색하여

AdministratorAccess-AWSElasticBeanstalk을 체크해 다음으로 넘어가자

쭉쭉 넘어가서 사용자 만들기를 하면

AWS 액세스 키 아이디시크릿 엑세스키 가 발급된다. 해당 값을 잘 기록해두자.

 

Action Secret

Github Action에 사용하는 보안이 필요한 중요 정보를 등록해 둘 수 있다. 

대표적으로 AWS 접근 엑세스 키 정보나 DockerHub의 엑세스키 정도가 있다.

(잘 기록해뒀길 바란다. 아니면 다시 조회해오거나 다시 발급받자)

 

추가하는 방법은 간단하다

Repository > Settings > Secrets > Actions 메뉴에 들어가자

github repository settings

그리고 Nes repository secret 버튼을 눌러서 추가해주면 된다.

이 글의 경우 아래의 키들을 저장했다

 

DOCKERHUB_USERNAME : 도커 허브 사용자 이름
DOCKERHUB_TOKEN : 도커 허브에서 발급받은 accessToken
AWS_ACCESS_KEY_ID : IAM 사용자 추가 시 받은 AccessKey ID
AWS_SECRET_ACCESS_KEY : IAM 사용자 추가시 받은 Secret AccessKey
AWS_REGION : AWS 지역 정보

 

저장한 시크릿 정보들은 github action yml 파일에서

${{ secrets.DOCKERHUB_USERNAME }} 

식으로 사용할 수 있다.

 

Github Action yml 작성

프로젝트에

. github/workflows 경로를 만들고

그 아래에. yml 파일을 하나 생성한 뒤 작성하자.

 

먼저 전체 작성된 코드를 보여준 뒤 하나하나 설명해보려 한다.

name: API Server CI/CD

on:
  push:
    branches: [ "master" ]
    paths-ignore:
      - "test-admin/**"

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      -
        name: Checkout
        uses: actions/checkout@v3
      -
        name: Set up Docker buildx
        uses: docker/setup-buildx-action@v2
      -
        name: Login to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      -
        name: Docker meta
        id: meta
        uses: docker/metadata-action@v4
        with:
          images: ${{ secrets.DOCKERHUB_USERNAME }}/test-api-server
          tags: |
            type=ref,event=branch
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}.{{minor}}
          flavor: |
            latest=true
      -
        name: Build and Push
        uses: docker/build-push-action@v3
        with:
          context: .
          file: api.Dockerfile
          platforms: linux/amd64
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          # build Cache 적용
          cache-from: type=gha
          cache-to: type=gha,mode=max
      -
        name: Deploy to elastic beanstalk
        uses: einaregilsson/beanstalk-deploy@v20
        with:
          aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          application_name: test
          environment_name: Test-env
          version_label: ${{ github.sha }}
          version_description: ${{ github.event.head_commit.message }}
          region: ${{ secrets.AWS_REGION }}
          deployment_package: docker-compose.yml

 

액션 트리거

name: API Server CI/CD

on:
  push:
    branches: [ "master" ]
    paths-ignore:
      - "test-admin/**"

 

이 글의 경우 master 브랜치에 푸시 이벤트가 발생했을 때 아래 jobs에 작성한 로직이 실행되도록 작업했다.

paths-ignore 옵션은 작성한 경로의 파일이 수정된 경우에는 무시하겠다는 설정이다.

나의 경우 멀티 모듈이기 때문에 api 모듈에 작업한 내용이 있을 때 빌드/ 배포가 필요하므로 저렇게 설정했다.

 

Runs-on

jobs:
  build:
    runs-on: ubuntu-latest

빌드될 환경을 작성하는 옵션이다.

 

CheckOut & DockerHub Login

steps:
      -
        name: Checkout
        uses: actions/checkout@v3
      -
        name: Set up Docker buildx
        uses: docker/setup-buildx-action@v2
      -
        name: Login to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      -
        name: Docker meta
        id: meta
        uses: docker/metadata-action@v4
        with:
          images: ${{ secrets.DOCKERHUB_USERNAME }}/test-api-server
          tags: |
            type=ref,event=branch
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}.{{minor}}
          flavor: |
            latest=true

사실 어려운 내용이 없다.

해당 git repository의 소스를 checkout 하고

docker hub에 로그인 한 뒤

허브에 저장되는 이미지의 정보와 태그를 작성한다.

이 글의 경우 flavor 옵션을 통해 latest 태그를 무조건 생성되도록 설정했다.

 

buildx의 경우 필수는 아니고 캐시를 이용해서 빌드 속도를 빠르게 해 주기 위해 추가했다.

이 부분은 아래에 이어서 나온다.

 

Docker hub에 Build and Push

 -
        name: Build and Push
        uses: docker/build-push-action@v3
        with:
          context: .
          file: api.Dockerfile
          platforms: linux/amd64
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          # build Cache 적용
          cache-from: type=gha
          cache-to: type=gha,mode=max

여기서 살짝 삽질한 부분은 기본적으로 제일 최상위 경로에 Dockerfile을 읽어와 작업이 이루어지는데

나의 경우 모듈별로 Dockerfile 을 따로 작성했으므로 읽어와야 하는 파일을 찾아오지 못하는 경우가 발생했었다.

해결 방법으로는 context와 file 옵션을 통해 작성한 Dockerfile을 지정해 줄 수 있다.

 

AWS EB 배포

 -
        name: Deploy to elastic beanstalk
        uses: einaregilsson/beanstalk-deploy@v20
        with:
          aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          application_name: test
          environment_name: Test-env
          version_label: ${{ github.sha }}
          version_description: ${{ github.event.head_commit.message }}
          region: ${{ secrets.AWS_REGION }}
          deployment_package: docker-compose.yml

드디어 마지막 단계이다.

Elastic  Beanstalk에서 생성했던 애플리케이션 이름과 환경 이름을 적어주고

AWS 권한 정보가 있는 사용자의 액세스 정보와 지역을 입력해주면 된다.

 

 

이제 AWS EB 콘솔에서 환경이 다시 켜지는 것을 기다렸다가 완료된 뒤 접속해보면

제대로 빌드가 적용된 것을 확인할 수 있다.  

728x90
반응형