CodeDepoly 없이 로컬서버에 CD를 만들어보자!

준커·2024년 2월 20일
0

DevOps

목록 보기
6/6
post-thumbnail

1. CodeDepoly 없이 CD를 만들게 된 배경

기존에 진행하던 프로젝트를 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도 사용하지 않게 되어, 어떻게 해결해야할지 고민하게 되었다.

2. 기존 CI/CD 파이프라인

기존의 CI/CD 파이프 라인은 다음과 같다.

  1. Github Push.
  2. Github Actions을 사용한 CI
    a. 서버 파일 Build.
    b. Docker Image Build.
    c. Dockerhub Upload.
  3. Github Actions를 통해 CodeDeploy에게 Deploy 명령.
  4. CodeDeploy가 Elastic Beanstalk에 Deploy.

3. CodeDepoly를 대신할 방법

Github Actions를 이용한 CI 파이프라인은 유지할 수 있지만, AWS 의 CodeDeploy를 안쓰게 되면서 CD 파이프라인을 고민해야 했다.

  1. t2.medium만큼 많은 양이 발생하지 않으니 AWS CodeDeploy를 유료로 사용한다.
  2. 수동으로 배포한다.
  3. Linux의 Shell Script를 사용한다.

3-1. 그대로 AWS CodeDeploy를 유료로 사용

유료로 사용하면 그대로 파이프라인을 유지 할 수 있기 때문에 매우 편하겠지만, 프로젝트를 지속적으로 진행할 계획이 있었기에, 비용 지출은 최소화 하고 싶어서 선택하지 않았다.

3-2. 수동으로 배포

최초엔 이 방법을 채택하였다.
수동 배포의 흐름은 다음과 같다.

  1. ssh로 로컬 서버에 접속한다.
  2. 기존에 떠있던 Docker 컨테이너를 정지 시킨다.
  3. 정지된 컨테이너를 삭제한다.
  4. 기존에 있던 Docker Image를 삭제한다.
  5. Dockerhub에서 새로 업로드된 Image를 Pull한다.
  6. 새로 Pull한 Image로 컨테이너를 생성하고 시작한다.

위 과정을 코드로 표현하면 다음과 같다.

> 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 {이미지 이름}

보는 것 처럼 매우 귀찮다.. 그리하여 한 번 수동으로 배포하고 바로 다른 방법이 있는지 고민하게 됐다.

3-3. Linux의 Shell Script를 사용

CD 방법을 고민하던 도중 수동으로 배포할 때 입력하던 명령어들을 Shell Script로 작성해둔 뒤, Github Actions로 실행하면 되지 않을까? 하는 생각이 들었고, 결과적으론 이 방법을 채택하게 되었다.

4. Shell Script를 사용

그림처럼 배포 시 필요한 명령어들은 로컬서버에 Shell Script로 미리 작성해 두고, Github Actions로 실행시키는 방법이다.

4-1. Shell Script 작성

# 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 이미지 이름}

4-2. Github Actions WorkFlow 수정

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
  • appleboy/ssh-action을 사용하였다.

주목해야할 부분은 script 부분이다.

script: |
	chmod +x /home/sluv/deploy_script.sh
	echo ${{ secrets.LOCAL_SERVER_SUDO_PASSWORD }} | sudo -S {Deploy Script 파일 경로}
  • chmod +X로 Deploy Script 파일의 실행 권한을 부여한다.
  • sudo 권한으로 실행할 수 있도록 sudo 비밀번호와 함께 Deploy Script 파일을 실행한다.

5. 결과

모든 명령어를 성공적으로 실행했다는 appleboy/ssh-action 로그와 함께 배포에 성공했다.

이로써 AWS CodeDeploy를 사용하지 않고도 로컬서버에 CD 파이프라인을 구축하였다.

profile
학부생일뿐

0개의 댓글