캡스톤 디자인 프로젝트에서 만든 우리 팀의 '망하지망고'라는 어플의 백엔드 서버를 AWS EC2에 배포하려고 한다. 배포 시 사용하는 대표적인 소프트웨어로 Docker가 있고, 프로젝트를 Docker 이미지로 만든 후 EC2에서 해당 이미지의 Container를 실행시키면 편리한 배포가 가능하다.
그러나 Docker를 직접 로컬에 설치하여 배포하면 pc에 부담이 크다. 실제로 Docker를 내 pc에 직접 설치하고 몇 GB크기의 이미지를 생성해본 적이 있었는데, 한동안 컴퓨터가 매우 느려지고 팬 소리가 커지고 컴퓨터가 매우 뜨거워진 경험이 있다. 더군다나 기능이 변경되거나 리팩토링을 했을 때 다시 이미지를 생성하고 EC2에 배포해야 하므로 한 번 서버를 켤 때도 최소 10분 이상이 걸리게 된다.
이러한 문제가 발생했을 때, GitHub에 push만 하면 자동으로 연결된 EC2에 수정한 내용이 컨테이너화되어 실행되게끔 하는 소프트웨어 개발 워크플로우 자동화하는 CI/CD 툴이 있으니, 바로 GitHub Actions이다.
배포에 관한 내용이므로 GitHub에, 배포할 프로젝트들을 push한 Repository가 있다고 가정합니다.
우선 EC2에 Docker가 설치되어 있어야 한다. 개인적으로 많은 도움을 받았던 블로그 링크를 첨부한다.
EC2에 Docker 설치하는 방법
application.yml과 같은 파일에는 S3 access key, secret key, jwt secret key 등등 온라인에 노출되어서는 안되는 프로그램 고유 정보들이 존재하므로, GitHub에 업로드할 수 없다. 그러나 Github에 있는 내용을 통해 도커 이미지들을 생성해야하므로, 해당 정보가 필요하다는 두 요구가 충돌하게 된다.
이 경우에 GitHub Actions에서 제공하는 Actions Secrets 을 이용하면 외부에 노출이 없으면서도 해당 내용을 안전하게 EC2에 배포할 수 있다.
먼저 배포하려는 레포지토리>Settings 탭에 들어간다.
메뉴 바를 내리다 보면 Security>Secrets and variables>Actions 에 들어가면 다음과 같이, Repository secrets를 추가할 수 있는 공간이 있다. 여기에 'New Repository secret'버튼을 눌러, application.yml 내용이나, ec2 ssh secret key 등의 필요한 요소들을 추가할 수 있다.
EC2에 배포하기 위해 내가 사용한 SECRETS들은 다음과 같다.
프로젝트에서 사용한 application.yml
도커 허브에서 발급받은 토큰
도커 password, username
AWS EC2 퍼블릭 ipv4 DNS
AWS EC2 SSH 프라이빗 키
레포지토리의 Actions 탭에 들어가면 다음과 같은 화면을 볼 수 있다. 여기서 여러분들의 프로젝트 언어나 툴에 맞는 workflow들을 선택할 수 있는데, 나의 경우 왼쪽 하단의 Java with Gradle을 사용하여 workflow를 생성하였다.
그러면 다음과 같이 프로젝트에 .github/workflows/gradle.yml 이 생성되는데, 바로 여기에서 docker 명령어를 작성하여 이미지 생성 및 EC2에서 컨테이너 실행 등의 작업을 진행할 수 있다.
워크플로우에서 수행하는 작업들을 지정하는 위치는 jobs:이며, build: steps: 아래에 EC2에서 진행시키고자 하는 명령어들, 예를 들어
chmod +x gradlew
./gradlew build -x test
docker build -f Dockerfile
등과 같은 linux, docker 명령어들을 실행킬 수 있다.
Actions Secret를 사용하는 것도 여기서 설정하게 된다.
이것은 application.yml을 프로젝트의 src/main/resources/ 경로에 생성하는 명령어이다. 다음과 같이
"${{ secrets.[actions secret에서 설정한 변수명] }}"
사용할 수 있다.
gradle.yml을 push하면
다음과 같이 연결된 EC2에 Docker를 사용하여 repository의 내용을 이미지화시키고 컨테이너로 실행하게 된다.
만약 배포 과정에서 문제가 생길 경우, 다음과 같이 x 표시가 뜨는 걸 확인할 수 있다. 이후 EC2의 public ip를 사용하여 프런트엔드 연결 혹은 테스트를 진행할 수 있다.😊
이런 경우 다음과 같이
실패한 flow를 클릭하고 원인이 생긴 부분이 log로 기록되므로 확인 후 수정할 수 있다.