- [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 메뉴에 들어가자
그리고 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 콘솔에서 환경이 다시 켜지는 것을 기다렸다가 완료된 뒤 접속해보면
제대로 빌드가 적용된 것을 확인할 수 있다.