바이브코딩 서비스를 Docker 컨테이너로 실전서비스 론칭하기 · 3부 — CI/CD, IaC, 무중단 배포, 롤백

22장. 마무리 (회고 + 리소스 삭제)

수고 많았습니다. 이 마지막 장은 두 가지를 합니다. 무엇을 배웠는지 돌아보고(회고), 만든 것을 깨끗이 치웁니다(삭제). 특히 리소스 삭제는 반드시 끝까지 따라 하세요. 이 장을 건너뛰면 다음 달 AWS 청구서로 후회하게 됩니다.

[지금 여기]

우리는 22단계를 거쳐 "라이브 투표 서비스"를 직접 만들고, 컨테이너에 담아, AWS 클라우드에 배포했습니다. 아래가 그 전체 여정 지도입니다. 지금은 맨 마지막, 22단계에 있습니다.

  1. 1장개발 환경 준비 (터미널 / Node.js / Git / GitHub / VS Code / Claude Code)
  2. 2장Claude Code 사용법 익히기
  3. 3장무엇을 만들지 기획 (라이브 투표 서비스)
  4. 4장로컬에서 서비스 만들기 (React + Express + PostgreSQL)
  5. 5장Docker 개념
  6. 6장Dockerfile 작성
  7. 7장컨테이너 빌드·실행
  8. 8장AWS 시작 (계정 / IAM / 리전 / 비용)
  9. 9장이미지 태깅
  10. 10장ECR에 이미지 올리기
  11. 11장VPC 네트워크 구성
  12. 12장RDS 데이터베이스 생성
  13. 13장SSM 터널로 RDS 초기화
  14. 14장ECS Fargate + ALB로 배포 (기본 완성)
  15. 15장CI/CD (GitHub Actions)
  16. 16장IaC (Terraform)
  17. 17장배포 자동화 연결
  18. 18장현업 운영 구조 이해
  19. 19장무중단 배포
  20. 20장신규 버전 배포 & 롤백
  21. 21장(심화) 프론트를 Vercel로 분리 배포
  22. 22장마무리 (회고 + 리소스 삭제)

이번 장에서 완성되는 것

한 문장으로: 전체 여정을 스스로 정리할 수 있게 되고, 실습으로 켜 둔 모든 리소스를 삭제해 더 이상 요금이 나가지 않는 상태로 마무리합니다.

이렇게 되면 성공입니다: 서울 리전(ap-northeast-2)에 vote-로 시작하는 리소스가 하나도 남아 있지 않고, Vercel 대시보드에 실습용 프로젝트가 사라져 있으며, 며칠 뒤 AWS 청구 대시보드에서 요금이 더 늘지 않는 것을 확인할 수 있습니다.

사전 조건

22.1 전체 여정 회고 — 우리는 무엇을 만들었나

시작할 때 우리는 빈 노트북 앞에 있었습니다. 지금의 우리를 봅시다.

1부 — 만들고, 담았다

2부 — 손으로 배포했다

3부 — 자동화하고, 되돌리고, 실무 패턴까지

한 문장으로 압축하면 이렇습니다. "서비스의 탄생부터 장애 복구, 그리고 실무형 분리 배포까지, 운영의 한 사이클을 전부 직접 돌려 봤다." 이 책이 처음에 내건 목표 — "본인이 만든 서비스를 실제 고객에게 무중단 서비스하고 이를 자동화하고 싶은 사람" — 를 이제 여러분은 해 봤습니다.

그리고 하나 더. 이 책 내내 여러분은 코드를 직접 짜지 않았습니다. 대신 무엇을 만들지 정의하고, AI에게 지시하고, 결과를 검증하는 사람의 역할을 했습니다. 이것이 앞으로의 개발에서 점점 더 중요해지는 역할입니다.

22.2 실습 리소스 삭제 — 과금 방지

이제 만든 것을 치웁니다. 8장에서 약속한 그 시간입니다.

주의

왜 반드시 지워야 하나 AWS는 "쓴 만큼"이 아니라 정확히는 "켜 둔 만큼" 청구합니다. 접속자가 0명이어도 NAT 게이트웨이·RDS·ALB·Fargate는 시간당 요금이 계속 쌓입니다. 실습이 끝난 지금, 이 리소스들은 요금만 나가는 상태입니다.

삭제 순서가 중요합니다. 만든 순서의 역순으로 지웁니다. 리소스들이 서로 연결돼 있어서, 안쪽(뒤에 만든 것)부터 지워야 걸리지 않고 지워집니다. (예: 서비스가 살아 있으면 클러스터가 안 지워지고, NAT가 살아 있으면 VPC가 안 지워집니다.)

주의

시작 전, 콘솔 오른쪽 위 리전 선택기가 서울 (ap-northeast-2) 인지 확인하세요. 다른 리전을 보고 있으면 리소스가 안 보여서 "이미 다 지웠네?"로 착각하게 됩니다.

참고

콘솔 화면은 조금씩 바뀝니다 AWS 콘솔의 메뉴 이름·버튼 위치는 이따금 개편됩니다. 아래 경로가 화면과 정확히 안 맞으면, 각 서비스 화면 위쪽의 검색창에 리소스 이름 (예: vote-service, vote-alb)을 쳐서 찾은 뒤 삭제하면 됩니다. 하는 일(무엇을 지우는가)은 그대로입니다.

[콘솔] AWS 삭제 체크리스트 — 위에서부터 순서대로

  1. ECS 서비스: ECS 콘솔 → 클러스터 → vote-cluster → 서비스 탭 → vote-service 선택 → 삭제(Delete). 실행 중인 태스크가 있어 막히면 "강제 삭제(force delete)" 옵션을 켜서 지웁니다. 태스크가 모두 종료(0개)될 때까지 몇 분 기다립니다.
  2. ECS 클러스터: ECS 콘솔 → vote-cluster 선택 → 클러스터 삭제 (Delete cluster). (서비스가 다 지워져야 클러스터가 지워집니다.)
  3. ALB(로드밸런서): EC2 콘솔 → 왼쪽 메뉴 로드 밸런서vote-alb 선택 → 작업(Actions) → 삭제(Delete).
  4. 타깃 그룹: EC2 콘솔 → 왼쪽 메뉴 대상 그룹(Target groups)vote-tg 선택 → 작업 → 삭제.
  5. 중계용 EC2(Bastion): EC2 콘솔 → 인스턴스vote-bastion 선택 → 인스턴스 상태(Instance state) → 인스턴스 종료(Terminate instance). (종료하면 다시 못 켜지지만, 실습이 끝났으니 괜찮습니다.)
  6. RDS(데이터베이스): RDS 콘솔 → 데이터베이스 → vote-db 선택 → 작업(Actions) → 삭제(Delete).
    • "최종 스냅샷 생성" 물음: 실습용이므로 체크 해제(아니요) 해도 됩니다. (실무라면 반드시 스냅샷을 남깁니다.)
    • "자동 백업 보존" 체크도 해제합니다. 마지막에 delete me 같은 확인 문구를 입력해야 삭제됩니다. 완료까지 몇 분 걸립니다.
    • [용어] 스냅샷(Snapshot): DB의 특정 시점 백업본입니다. 남겨 두면 나중에 그 시점으로 복원할 수 있지만, 보관하는 동안 소액의 저장 비용이 듭니다. 그래서 완전히 끝낼 거면 남기지 않습니다.
  7. NAT 게이트웨이: VPC 콘솔 → 왼쪽 메뉴 NAT 게이트웨이 → 우리 VPC의 NAT 선택 → 작업 → NAT 게이트웨이 삭제. 상태가 "삭제됨 (Deleted)"이 될 때까지 잠시 기다립니다.
    • [주의] 시간당 요금 1순위 품목입니다. 꼭 지웠는지 확인하세요.
  8. 탄력적 IP 릴리스: VPC 콘솔 → 왼쪽 메뉴 탄력적 IP(Elastic IPs) → NAT에 붙어 있던 IP 선택 → 작업(Actions) → 탄력적 IP 주소 릴리스 (Release Elastic IP addresses).
    • [주의] 가장 놓치기 쉬운 항목입니다. NAT를 지워도 이 IP는 그대로 남습니다.
    • [용어] 탄력적 IP(Elastic IP): 고정 공인 IP 주소입니다. NAT를 만들 때 함께 붙었는데, 어디에도 연결되지 않은 채로 남겨 두면 그 자체로 요금이 나옵니다. 그래서 NAT를 지운 직후 반드시 릴리스합니다. (NAT에 아직 붙어 있으면 릴리스 버튼이 비활성일 수 있으니, 7번을 먼저 끝내고 오세요.)
  9. VPC: VPC 콘솔 → VPCvote-vpc 선택 → 작업 → VPC 삭제. 서브넷·라우팅 테이블·인터넷 게이트웨이·보안 그룹이 함께 정리됩니다. (앞 단계가 다 됐다면 걸림 없이 지워집니다. 막히면 아래 "막히면"을 보세요.)
  10. ECR(이미지 창고): ECR 콘솔 → 프라이빗 리포지토리 → vote-api, vote-web 각각 선택 → 삭제(Delete). 안에 이미지가 있으면 삭제 확인 문구(delete)를 입력합니다.
  11. CloudWatch 로그: CloudWatch 콘솔 → 왼쪽 메뉴 로그 → 로그 그룹 (Log groups)vote 또는 /ecs/vote로 시작하는 로그 그룹 선택 → 작업 → 삭제. (소액이지만 깔끔하게 비웁니다.)
  12. Secrets Manager: (18장 등에서 시크릿 금고를 만들었다면) Secrets Manager 콘솔 → 해당 시크릿 선택 → 삭제. 시크릿은 즉시 사라지지 않고 대기 기간(최소 7일, 기본 30일) 후 완전 삭제되며, 대기 중에는 요금이 거의 없습니다. (안 만들었다면 이 단계는 건너뜁니다.)

[콘솔] Vercel 프로젝트·배포 삭제 — 21장에서 만든 것

21장에서 프론트를 Vercel로 올렸습니다. 그 프로젝트도 정리합니다. Vercel 무료(Hobby) 플랜은 요금이 없지만, 이 프로젝트는 vercel.json의 rewrite로 우리가 지운 ALB 주소를 계속 가리키고 있어서, 남겨 두면 열었을 때 /api가 죽은 서버를 부르며 에러가 납니다. 그래서 함께 삭제합니다. (프로젝트를 지우면 그 안의 모든 배포도 함께 사라집니다.)

  1. 웹브라우저에서 https://vercel.com/dashboard 에 접속해, 21장에서 쓴 계정으로 로그인합니다.
  2. 프로젝트 목록에서 21장에서 만든 프론트 프로젝트를 클릭해 들어갑니다. (프로젝트 이름은 21장에서 연결한 저장소/폴더 이름을 따릅니다.)
  3. 위쪽 탭에서 Settings(설정) 를 클릭합니다.
  4. 설정 페이지를 맨 아래까지 스크롤하면 빨간색 위험 구역에 Delete Project(프로젝트 삭제) 가 있습니다. 이 버튼을 누릅니다.
  5. 확인 창이 뜨면 안내에 따라 프로젝트 이름을 그대로 입력하고, 최종 삭제 버튼을 눌러 확정합니다.
참고

Vercel과 GitHub 연동도 정리하고 싶다면 21장에서 GitHub 저장소를 Vercel에 연결했다면, 프로젝트를 지우는 것으로 배포는 멈춥니다. 저장소에 자동 배포를 걸어 둔 상태를 완전히 끊고 싶으면 GitHub 저장소 → Settings → Integrations 에서 Vercel 연동을 제거해도 됩니다. (선택 사항입니다.)

[프롬프트] Claude Code에게 교차 점검 맡기기

사람 눈은 하나쯤 놓칩니다. 마지막 점검은 기계에게 맡기세요. vote-app 폴더를 VS Code로 연 터미널에서 claude를 실행한 뒤 이렇게 지시합니다.

프롬프트
서울 리전(ap-northeast-2)에 남아 있는 실습 리소스가 있는지 AWS CLI로
점검해 줘. ECS 서비스/클러스터, ALB, 타깃 그룹, EC2 인스턴스, RDS,
NAT 게이트웨이, 탄력적 IP, VPC, ECR 리포지토리, CloudWatch 로그 그룹을
하나씩 조회해서 vote 관련 리소스가 남아 있으면 목록으로 알려 줘.

Claude Code가 aws ecs, aws elbv2, aws ec2, aws rds 같은 명령으로 하나씩 조회해 남은 것을 알려 줍니다. 무언가 남아 있다고 나오면, 위 체크리스트에서 해당 항목을 다시 지우세요.

참고

지웠는데, 다시 만들고 싶다면? 여기서 16장의 Terraform이 빛납니다. infra 폴더에서 terraform apply 한 번이면, 방금 지운 인프라가 코드 그대로 다시 세워집니다. 시간이 있다면 꼭 해 보세요 — "지워도 코드가 있으니 두렵지 않다"는 IaC의 감각을 몸으로 얻는 최고의 마무리 실습입니다. 확인이 끝나면 반드시 terraform destroy로 다시 정리하세요. 안 그러면 되살린 인프라가 또 요금을 냅니다.

[확인] 최종 점검 두 가지

22.3 마치며

처음 시작할 때 "배포"는 여러분에게 막연하고 두려운 단어였을 겁니다. 지금은 그 안이 훤히 보일 겁니다. 상자에 담고(Docker), 창고에 올리고(ECR), 무대에 세우고(ECS·ALB), 길을 자동화하고(CI/CD), 무대 설계도를 남기고 (Terraform), 끊김 없이 갈아 끼우고(무중단), 잘못되면 되돌리고(롤백), 프론트는 떼어 내 따로 서비스한다(Vercel 분리 배포).

기술은 계속 바뀝니다. 하지만 이 과정에서 얻은 두 가지는 오래 갑니다. 하나는 배포와 운영의 사고방식 — 재현 가능하게, 기록이 남게, 되돌릴 수 있게. 다른 하나는 AI와 일하는 방식 — 명확히 지시하고, 결과를 의심하고, 검증하는 습관. 이 둘을 갖췄다면, 다음에 어떤 도구가 나와도 여러분은 금방 올라탈 수 있습니다.

여러분의 다음 서비스를 응원합니다. 이번에는 진짜 사용자를 받아 보세요.

[확인]

이번 장이 제대로 끝났는지 눈으로 확인합니다.

여기까지 확인됐다면, 실습으로 켜 둔 것을 모두 껐습니다.

막히면

리소스를 지울 때 자주 나는 오류와 대처법입니다.

[체크리스트]