[Troubleshooting] 금요일 배포의 공포 종결: GitHub Actions 무중단 배포(Zero-Downtime) 및 자율 롤백 아키텍처
"금요일 오후 5시에는 절대 배포(Deploy)하지 마라."
전 세계 모든 IT 기업의 개발팀에 전해 내려오는 뼈아픈 불문율이다. 완벽하게 테스트를 거쳤다고 자부한 코드도, 막상 라이브 프로덕션(Production) 서버에 올라가면 예상치 못한 DB 병목이나 메모리 누수를 일으키며 사이트를 마비시킨다. 만약 금요일 퇴근 직전에 사이트가 뻗는다면, 당신의 주말은 서버 로그를 뒤지는 끔찍한 야근으로 대체될 것이다.
이 공포의 근원은 '사람의 모니터링'에 의존하기 때문이다. 배포를 누르고, 모니터에 에러가 뜨는지 지켜보다가, 문제가 생기면 수동으로 이전 코드를 다시 빌드해서 올리는 이 원시적인 파이프라인이 모든 재앙의 시작이다. 본 가이드에서는 시스템이 스스로 건강 상태를 진단하고, 에러 감지 시 인간의 개입 없이 즉각적으로 과거의 안정된 상태로 회귀하는 '자율 롤백(Auto-Rollback) 아키텍처'를 단호하게 제시한다.
1단계: 핵심 원인 분석 (배포의 비가역성)
기존의 덮어쓰기(Overwrite) 배포 방식은 비가역적이다. 새 코드가 서버에 올라가는 순간 기존 코드는 삭제되며, 새 코드에 버그가 있다면 유저는 즉시 500(Internal Server Error) 화면을 마주하게 된다. 진정한 무중단 배포를 위해서는 새 코드를 바로 서비스에 투입하지 않고, 임시 공간(Green 영역)에 띄워둔 뒤 정상 작동하는지 먼저 찔러보는(Health Check) 과정이 필수적이다.
2단계: 1차 방어선 - Health Check API 구축
서버가 단순히 '켜져 있는지'가 아니라, '정상적으로 DB와 연결되어 일할 준비가 되었는지'를 판별하는 /health 엔드포인트를 백엔드 코드에 추가해야 한다. 이 주소에 GET 요청을 보냈을 때 HTTP 상태 코드 200(OK)이 돌아와야만 합격이다.
3단계: 완벽한 해결책 - GitHub Actions 롤백 파이프라인
GitHub Actions를 활용하여 새 코드를 배포한 직후, /health API를 호출하여 상태를 점검하고, 실패 시 이전에 성공했던 도커(Docker) 이미지나 커밋 상태로 자동 복구하는 스크립트를 작성한다.
name: CD Pipeline with Auto-Rollback
on:
push:
branches: [ "main" ]
jobs:
deploy-and-verify:
runs-on: ubuntu-latest
steps:
- name: 🚀 1. 최신 코드 서버 배포 (Deploy)
run: |
echo "서버에 최신 코드를 배포합니다..."
# 여기에 AWS ECS, EC2, K8s 배포 스크립트 작성
- name: 🩺 2. Health Check (서버 상태 진단)
id: health-check
run: |
echo "Health Check API를 5회 타격합니다..."
for i in {1..5}; do
STATUS_CODE=$(curl -o /dev/null -s -w "%{http_code}\n" https://api.yourdomain.com/health)
if [ "$STATUS_CODE" -eq 200 ]; then
echo "✅ 서버 정상 작동 확인. 배포를 확정합니다."
exit 0
fi
echo "대기 중... ($i/5)"
sleep 10
done
echo "❌ Health Check 실패. 롤백을 가동합니다."
exit 1 # 에러를 발생시켜 다음 롤백 단계로 넘김
- name: ⏪ 3. 치명적 에러 감지 시 자율 롤백 (Auto-Rollback)
if: failure() # 윗 단계가 실패했을 때만 가동됨
run: |
echo "🚨 비상 사태: 이전 안정화 버전으로 롤백합니다."
# 직전에 성공했던 Docker 태그나 이전 커밋으로 인프라 복구 명령어 실행
# 예: aws ecs update-service --service my-service --task-definition my-task:PREVIOUS_REV
# 슬랙(Slack)으로 관리자에게 비상 알림 발송
curl -X POST -H 'Content-type: application/json' \
--data '{"text":"🚨 배포 실패! 시스템이 안전하게 이전 버전으로 자동 롤백되었습니다."}' \
YOUR_SLACK_WEBHOOK_URL
위 YAML 스크립트의 핵심은 if: failure() 조건문이다. 시스템 스스로 5번의 진단을 거친 뒤, 심장 박동이 감지되지 않으면 즉시 과거의 이미지로 덮어씌워 유저가 겪는 서비스 마비 시간을 1분 이내로 봉쇄한다.
아키텍트의 시선 (Insight)
기술의 발전은 인간을 모니터 앞의 감시자로 전락시키는 것이 아니라, 그 감시의 굴레로부터 완전히 해방시키는 방향으로 나아가야 한다. 배포의 공포는 코드를 믿지 못해서가 아니라, 실패했을 때 돌아갈 '안전망(Safety Net)'이 없기 때문에 발생한다. GitHub Actions에 진단과 롤백의 책임을 위임하라. 자가 치유 능력을 갖춘 시스템을 구축하는 순간, 당신은 금요일 오후 5시에 당당하게 배포 버튼을 누르고 퇴근할 수 있는 진정한 기술의 통제권을 얻게 될 것이다.
댓글
댓글 쓰기