이번에 하루동안 배포만 세 번했다.. 이때 겪은 문제들을 벨로그에 정리해두려고 한다
현재 한 프로젝트에서, latest태그만 사용하니 캐시때문인지 머지한 코드로 빌드가 되지않는 현상이 발견되었다. -> 즉, 추가한 기능들이 반영되지 않았다
따라서 github.sha를 이용하여 버전 관리를 도입하였다.
이때 나는 도커 컴포즈 파일을 서버내에 저장해두었기 때문에 deploy 스크립트에서 github.sha를 환경변수로 넘겨주어야 했다
# 서버 배포
- name: Deploy to server with Docker
uses: appleboy/ssh-action@master
env:
IMAGE_TAG: ${{ github.sha }}
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_SSH_KEY }}
envs: IMAGE_TAG
script: |
sudo docker pull ${{ secrets.DOCKER_REPO }}:$IMAGE_TAG
cd /root
docker compose down --remove-orphans || true
IMAGE_TAG=$IMAGE_TAG docker compose up -d --force-recreate
sudo docker image prune -f
# jar 파일명 확인
- name: Show built files
run: |
ls -alh build/libs
이렇게 넘겨주고 컴포즈 파일 내에서는 ${IMAGE_TAG}로 사용하였다
나는 항상 context path를 추가하는데 매번 배포할 때마다 이 부분에서 막혀가지고 이번 기회에 정리해본다
내가 겪었던 해당 에러는 다음과 같다.
• 브라우저에서 https://~~~~~~/{context-path}/health-check 접속 시 “Too many redirects” 메시지
-> 이전에 nginx를 밑에와 같이 설정해서 리디렉션 루프가 생겼던 거 같다
location /api {
proxy_pass http://localhost:8080/api;
# -> 리디렉션 루프 생성
}
• 또는 /{context-path}/health-check가 아니라 /health-check로만 요청했을 때 404 발생
-> context path 설정을 안해두었기 때문
따라서 아래처럼 nginx에서 따로 설정해주어야한다.
location /api {
proxy_pass http://localhost:8080;
}
이제 서버는 다 설정했음에도, DB연결이 안되어서 배포가 안됐었고 이런 로그가 떴다.
Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago.
-> EC2 인스턴스에서 RDS MySQL로 telnet 3306 시 Connection timed out
RDS 보안 그룹에 EC2 인스턴스 보안 그룹이 허용되어있지 않았던 것
그래서 보안그룹 id를 인바운드 규칙에 추가하였다.
유형: MySQL/Aurora
프로토콜: TCP
포트: 3306
소스: EC2 인스턴스의 보안그룹 ID
잘 연결되었는지는 밑의 명령어로 ec2에서 접속해보면 된다.
telnet 3306
aws로 배포하고나서 한 두번인 줄 알았던 에러가 계속 떴다.
처음에는 콘솔 허용이 안되어있어서 난 줄 알았는데 시스템 로그를 확인해보니 다른 문제였다.
Out of memory: Killed process 2374 (java) total-vm:2892224kB, anon-rss:415288kB …
즉, 리눅스 커널의 OOM (Out Of Memory) Killer가 java 프로세스를 강제 종료한 상황 
아마 메모리 부족문제였던 거 같다.

모니터링을 확인해본 결과 OOM때문이었다 따라서 스왑메모리를 할당하였다.
# swapfile 메모리를 할당
sudo dd if=/dev/zero of=/swapfile bs=128M count=16
# swapfile 권한 세팅 (READ, WRITE)
sudo chmod 600 /swapfile
# swap 공간 생성 (Make swap)
sudo mkswap /swapfile
# swap 공간에 swapfile 추가하여 즉시 사용할 수 있도록
sudo swapon /swapfile
# /etc/fstab vi 에디터 열기
sudo vi /etc/fstab
# 파일의 맨 끝 다음줄에 아래 명령어 작성
/swapfile swap swap defaults 0 0
이 후 재배포한 뒤 메모리가 잘 할당되었는지 확인한다.
free
추가로 메모리 관리를 위해 오래된 도커이미지도 주기적으로 삭제해주자!
# 서버 배포
- name: Deploy to server with Docker
uses: appleboy/ssh-action@master
env:
IMAGE_TAG: ${{ github.sha }}
with:
host: ${{ secrets.EC2_HOST }}
username: ${{ secrets.EC2_USERNAME }}
key: ${{ secrets.EC2_SSH_KEY }}
envs: IMAGE_TAG
script: |
sudo docker pull ${{ secrets.DOCKER_REPO }}:$IMAGE_TAG
cd /root
docker compose down --remove-orphans || true
IMAGE_TAG=$IMAGE_TAG docker compose up -d --force-recreate
# ✅ 오래된 이미지 정리 (3일 이상된 이미지 삭제)
sudo docker image prune -a --filter "until=72h" -f
# 추가로 중지된 컨테이너, 네트워크도 정리 가능
sudo docker container prune --filter "until=72h" -f
sudo docker network prune --filter "until=72h" -f