기존에 진행하던 프로젝트를 1년간 개발하면서, 메인 API 서버 뿐만 아니라 ELK 검색엔진 도입과, FastAPI AI 모델을 도입하게 되었다.
메인 API 서버 뿐일때는, AWS FreeTier를 지원하는 EC2 인스턴스(t2.micro)로 충분히 커버가 가능 했다. ELK와 AI 모델의 특성상 t2.micro로는 메모리가 부족하는 현상이 발생하여 각각 t2.medium을 1개씩 총 2개를 추가해야 했다.
t2.medium은 FreeTier가 아니기 때문에 발생하는 비용은 학교의 지원금으로 해결하고 있었지만, 더 이상 지원을 받을 수 없는 상황이 발생하여, 해당 부분을 어떻게 지불해야할까 고민하였다.
우리 팀은 큰 마음을 먹고 컴퓨터를 구매하여 로컬서버로 만들고, S3를 제외한 모든 AWS 서비스를 로컬서버로 이전하였다.
자연스럽게 CD/CD 중 CD를 담당하연 CodeDeploy도 사용하지 않게 되어, 어떻게 해결해야할지 고민하게 되었다.
기존의 CI/CD 파이프 라인은 다음과 같다.
Github Actions를 이용한 CI 파이프라인은 유지할 수 있지만, AWS 의 CodeDeploy를 안쓰게 되면서 CD 파이프라인을 고민해야 했다.
유료로 사용하면 그대로 파이프라인을 유지 할 수 있기 때문에 매우 편하겠지만, 프로젝트를 지속적으로 진행할 계획이 있었기에, 비용 지출은 최소화 하고 싶어서 선택하지 않았다.
최초엔 이 방법을 채택하였다.
수동 배포의 흐름은 다음과 같다.
위 과정을 코드로 표현하면 다음과 같다.
> ssh {user}@{host}
> {password}
> sudo docker stop {컨테이너 이름}
> sudo docker remove {컨테이너 이름}
> sudo docker rmi {이미지 이름}
> sudo docker pull {Dockerhub의 이미지 이름}
> sudo docker run -it --name {컨테이너 이름} -d -p 8082:8080 {이미지 이름}
보는 것 처럼 매우 귀찮다.. 그리하여 한 번 수동으로 배포하고 바로 다른 방법이 있는지 고민하게 됐다.
CD 방법을 고민하던 도중 수동으로 배포할 때 입력하던 명령어들을 Shell Script로 작성해둔 뒤, Github Actions로 실행하면 되지 않을까? 하는 생각이 들었고, 결과적으론 이 방법을 채택하게 되었다.
그림처럼 배포 시 필요한 명령어들은 로컬서버에 Shell Script로 미리 작성해 두고, Github Actions로 실행시키는 방법이다.
# Docker 컨테이너 정지 및 삭제
sudo docker stop {Docker 컨테이너 이믈}
sudo docker rm {Docker 컨테이너 이믈}
# Docker 이미지 삭제
sudo docker rmi {Docker 이미지 이름}
# Docker 이미지 Pull
sudo docker pull {Docker 이미지 이름}
# Docker 이미지로 컨테이너 생성 및 시작
sudo docker run -it --name {Docker 컨테이너 이름} -d -p 8082:8080 {Docker 이미지 이름}
jobs:
dev-ci-cd:
runs-on: ubuntu-latest
steps:
# ======
# CI 로직
# ======
- name: Deploy to Local Server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.LOCAL_SERVER_HOST }}
username: ${{ secrets.LOCAL_SERVER_USER }}
password: ${{ secrets.LOCAL_SERVER_SSH_PASSWORD }}
script: |
chmod +x /home/sluv/deploy_script.sh
echo ${{ secrets.LOCAL_SERVER_SUDO_PASSWORD }} | sudo -S /home/sluv/deploy_script.sh
주목해야할 부분은 script 부분이다.
script: |
chmod +x /home/sluv/deploy_script.sh
echo ${{ secrets.LOCAL_SERVER_SUDO_PASSWORD }} | sudo -S {Deploy Script 파일 경로}
모든 명령어를 성공적으로 실행했다는 appleboy/ssh-action 로그와 함께 배포에 성공했다.
이로써 AWS CodeDeploy를 사용하지 않고도 로컬서버에 CD 파이프라인을 구축하였다.