티스토리 뷰
저번 글에서 AWS Elastic Beanstalk, RDS 환경 세팅 및 인스턴스 연결을 해주었다.
이번 글에서는 Github Action yml 파일에 배포 스크립트를 추가하고, Github Action을 통한 AWS Elastic Beanstalk 배포 작업을 마무리해보자.
글은 다음과 같은 순서로 진행된다.
- docker-compose 파일 작성
- IAM 인증키 발급받기
- Github Action yml에 배포 스크립트 추가
1. docker-compose 파일 작성
Elastic beanstalk 배포를 위해 필요한 설정 파일인 docker-compose 파일을 작성해보자. docker-compose 파일을 이용해 Docker hub에 빌드되어 있는 이미지를 가져오고, 포트 맵핑, 환경변수 세팅 등을 해줄 수 있다.
version: "3.8"
services:
springboot:
image: "twoosky/springboot-demo"
environment:
- RDS_HOSTNAME=
- RDS_USERNAME=admin
- RDS_PASSWORD=1234
- RDS_DB_NAME=myapp
- RDS_PORT=3306
restart: "always"
nginx:
image: "twoosky/nginx-demo"
ports:
- "80:80"
restart: "always"
springboot
- RDS_HOSTNAME : RDS 앤드포인트를 넣어주면 된다.
- RDS_USERNAME : RDS 마스터 사용자 이름
- RDS_PASSWORD : RDS 마스터 사용자 암호
- RDS_DB_NAME : 사용할 DB 이름
- RDS_PORT : 3306으로 설정
nginx
- ports : 80 포트로 요청을 받기 위해 80포트 개방
- restart : nginx는 reverse proxy 역할을 하기 때문에 nginx 컨테이너가 다운되면 아무런 요청을 받을 수 없다. always로 설정
2. IAM 인증키 발급받기
[ IAM ]
IAM은 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹 서비스이다. 이를 통해 리소스를 사용 인증 및 권한 부여 대상을 제어한다. Root 사용자 는 AWS 서비스 및 리소스에 대한 완전한 엑세스 권한이 있다. IAM 사용자는 Root 사용자가 부여한 권한만 가지고 있다. 보안을 위해서는 항상 IAM 유저를 생성해 사용하는 것이 좋다.
같은 AWS 서비스가 아닌 경우 AWS 서비스에 명령을 줄 수 있는 권한을 받아야 한다. 권한을 받는 방법으로는 IAM 사용자를 이용한 인증키(accessKey, secretKey)가 있다.
2-1. IAM 사용자 추가


직접 정책 연결 클릭 후, Elastic BeanStalk을 제어하기 위한 AdministratorAccess-AWSElasticBeanstalk 권한 부여

아래와 같이 IAM 사용자가 생성되었다 !

2-2. Secrets key 발급
[ 해당 IAM 사용자의 보안 자격 증명 - 액세스 키 만들기 ] 버튼 클릭 후 아래와 같이 선택

나머지는 기본값으로 세팅 후 엑세스 키 발급. 엑세스 키는 한 번밖에 조회할 수 없으므로, 꼭 다른 곳에 저장해두어야 한다.

위에서 발급한 access key 와 secret access key를 Github 레포에 secrets key로 등록한다.

3. Github Action yml 수정
이전 글에서 작성한 Github Action yml 파일에 아래 코드를 추가한다. Elastic BeanStalk 플러그인을 사용하는 코드이다. 앞에서 생성한 IAM 인증키를 사용한다.
3-1. deploy 추가
- name: Get current time
uses: 1466587594/get-current-time@v2
id: current-time
with:
format: YYYY-MM-DDTHH-mm-ss
utcOffset: "+09:00"
- name: Deploy to EB
uses: einaregilsson/beanstalk-deploy@v18
with:
aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
application_name: docker-springboot
environment_name: Dockerspringboot-env
version_label: deploy-${{steps.current-time.outputs.formattedTime}}
region: ap-northeast-2
deployment_package: demo/docker-compose.yml
name: Get current time
- uses: 1466587594/get-current-time@v2 : 배포될때마다 유니크한 버저닝을 하기 위해 현재시간 플러그인 사용
name: Deploy to EB
- uses: einaregilsson/beanstalk-deploy@v18 : EB 배포를 위한 플러그인 사용 (참고)
- 미리 생성해둔 IAM 인증키 사용
- application_name : 앞서 생성한 EB 애플리케이션 이름 작성
- environment_name : EB 애플리케이션 환경 이름 작성
- version_label : 위에서 정의한 현재시간 플러그인 사용해 버전 라벨 설정
- deployment_package : 위에서 작성한 docker-compose 파일 경로 작성 (중요)
3-2. 최종 Github Action yml 파일
name: deploy
on:
push:
branches:
- 'main'
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: Grant execute permission for gradlew
run: |
cd demo
chmod +x ./gradlew
- name: Build with Gradle
run: |
cd demo
./gradlew clean build -x test
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Build Docker Image & Push to Docker Hub
run: |
docker build ./demo/ -t twoosky/springboot-demo
docker build ./demo/nginx -t twoosky/nginx-demo
docker push twoosky/springboot-demo
docker push twoosky/nginx-demo
- name: Get current time
uses: 1466587594/get-current-time@v2
id: current-time
with:
format: YYYY-MM-DDTHH-mm-ss
utcOffset: "+09:00"
- name: Deploy to EB
uses: einaregilsson/beanstalk-deploy@v18
with:
aws_access_key: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws_secret_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
application_name: docker-springboot
environment_name: Dockerspringboot-env
version_label: deploy-${{steps.current-time.outputs.formattedTime}}
region: ap-northeast-2
deployment_package: demo/docker-compose.yml
Github Action에서 실행하는 job은 아래와 같다.
- Spring boot 프로젝트 빌드
- Dockerfile 빌드해 docker image 생성
- Docker hub에 docker image 푸시
- Elastic Beanstalk에 배포
3. Github Action 실행
마지막으로, 해당 Repository의 main 브랜치에 푸시해 Github Action을 실행시켜보자. 그 후 Elastic Beanstalk에 제대로 배포되는지 확인해보자.
3-1. Github Action 실행
Repository - Actions 탭에 아래와 같이 녹색불이 떴으면 Github Action이 정상적으로 실행된 것이다.

각 Job 별로 Github Action 빌드 로그를 볼 수 있다. 정상적으로 배포가 되었다면 아래와 같이 Deploy to EB 로그에서 배포 성공 메시지를 볼 수 있다.

3-2. Elastic Beanstalk 배포 확인
배포에 성공했다면, AWS Elastic Beanstalk 대시보드에 있는 URL을 클릭해보자.

/hello 경로에 들어가면 User id와 name이 나오는 것을 확인할 수 있다. (배포 성공 ! )

ec2에 들어가 nginx 컨테이너의 log를 확인하면 아래와 같이 health check가 정상적으로 되고 있는 것을 볼 수 있다.


ssh 을 사용해 ec2에 접속하려면 보안그룹 인바운드 규칙으로 22 포트 0.0.0.0/0 을 추가해줘야 한다.
이로써 Docker + Github Action + AWS EB 를 사용한 CI / CD 구축을 완료했다.
Reference
'DevOps > AWS' 카테고리의 다른 글
[AWS] AutoScaling CodeDeploy Blue/Green CI/CD (0) | 2023.09.26 |
---|---|
[AWS] Auto Scaling, Elastic Load Balancer 구성해보기 (0) | 2023.07.11 |
[AWS] Spring Boot 프로젝트 Elastic beanstalk에 수동 배포하기 (0) | 2023.03.27 |
[AWS] Github Action + AWS Elastic Beanstalk을 사용한 CI/CD (2) (0) | 2023.03.17 |
[AWS] Github Action + AWS Elastic Beanstalk을 사용한 CI/CD (1) (1) | 2023.03.15 |