지난 글에서 CI를 끝냈다. 이제는 CD 환경을 구성해 볼 차례이다.
일반적인 CD의 흐름은 아래와 같다.
1. GitHub에 main 브랜치로 코드가 push됨
↓
2. Github Actions가 Docker 이미지 빌드하고 DockerHub에 업로드
↓
3. EC2 서버에서 최신 Docker 이미지 pull → 기존 컨테이너 중지 → 새 컨테이너 실행
↓
✅ 자동 배포 완료
즉, 서버가 항상 최신 이미지를 자동으로 가져와서 실행 하도록 만드는 게 CD의 핵심인 것이다.


키페어를 만들어 놓지 않았다면 아래 표를 참고해서 만든 후 적용하기
키 파일 저장 할 때는 내 프로젝트 폴더 옆에 keys/ 디렉토리 만들어서 보관한다.
(예시 경로 : ~/keys/zipitda-key.pem)
절대 GitHub에 올리면 안 됨!


위 그림과 같이 설정이 모두 끝났다면 Launch Instance를 클릭하여 EC2 서버를 생성한다.
생성하고 나면 CloudWatch와 같은 billing Alarm을 생성하라고 뜨는데 이 부분은 개인 상황에 맞게 설정하면 된다.
나는 돈 내고 싶지 않아서 $1 이상 청구될 경우 바로 메일오게 설정해뒀다ㅎㅎ

AWS 콘솔 → EC2 → 인스턴스 목록에 들어간 후 내가 만든 인스턴스를 클릭한다.
위 처럼 “퍼블릭 IPv4 주소”를 복사한다.
cd ~/Downloads # pem 파일이 있는 폴더로 이동 (본인 위치에 따라 다름)
chmod 400 zipitda-key.pem # 처음 한 번만 권한 설정
ssh -i zipitda-key.pem ubuntu@<퍼블릭_IP>
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
위와 같이 뜬다면 처음 EC2에 접속했기 때문에 나오는 경고이다.
이 IP 주소가 진짜 맞는지 아직 인증된 적 없는데 접속할거임? 이라고 떴기때문에 yes 입력하고 넘어가면 된다.
Welcome to Ubuntu 22.04 LTS (GNU/Linux 5.15.0-xxx-x86_64)
ubuntu@ip-172-31-xx-xx:~$
위와 같은 메세지가 뜨면 이제 EC2 서버에 접속 성공한 것~~!
sudo apt update
처음 서버에 들어왔기 때문에 sudo 명령어로 패키지 업데이트를 해주고 시작한다.
sudo apt install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker
이제 서버가 재시작되어도 자동으로 Docker가 켜지게 되었다.
sudo usermod -aG docker $USER
docker build, docker run, docker ps 등의 명령어들을 sudo 없이도 쓸 수 있게 된다.
적용을 위해선 로그아웃/재접속 또는 exit 후 다시 접속해줘야 해야 됨
docker --version
Docker version 20.10.x, build xxxx
도커 버전이 저렇게 나온다면 이제 Docker 설치도 완료~~
Github Actions로 DockerHub에 자동 배포 CI 파이프라인 만들기
여기에서 DockerHub에 이미지 올리기를 완료했었다.
이제 올라간 이미지를 가지고 서버에 배포할 차례!
docker pull <docker-id>/<project-name>:latest
# 성공했다면 아래와 같은 메세지가 뜬다!
latest: Pulling from <docker-id>/<project-name>
Digest: sha256:xxxxxxxx
Status: Downloaded newer image for <docker-id>/<project-name>:latest
docker run -d \
--name <project-name>-container \
-p 8081:8081 \
<docker-id>/<project-name>:latest
성공했는지 확인하기 위해선 docker ps를 날려보면 알 수 있다.
일단 이번 집잇다 프로젝트는 잘 올라갔는데..
로컬에서 작업할 때 docker-compose에 mysql이랑 redis를 올려서 작업했었기 때문에, EC2에서도 spring application까지 포함하여 한번에 compose로 띄우려고 했었다.
하지만 서버가 프리티어다보니 리소스가 부족해 과부하로 서버가 다운되는 문제가 발생했다ㅠㅠㅠㅠ..
결국 아키텍쳐부터 다시 구성해서 작업해 보도록한다. 일단 이번 글은 CD를 구현하는 것으로 만족, 이제 git develop 브랜치에 merge 또는 push되면 자동으로 DockerHub 올라가게 되고, 해당 이미지파일을 기반으로 ec2에 배포가 되도록 구성되어 있다.
(자연스럽게 CI/CD를 이어서 3편은 집잇다 아키텍쳐 구상도를 바탕으로 쓰게 되겠구만 하하 )