22장. 마무리 (회고 + 리소스 삭제)
수고 많았습니다. 이 마지막 장은 두 가지를 합니다. 무엇을 배웠는지 돌아보고(회고), 만든 것을 깨끗이 치웁니다(삭제). 특히 리소스 삭제는 반드시 끝까지 따라 하세요. 이 장을 건너뛰면 다음 달 AWS 청구서로 후회하게 됩니다.
[지금 여기]
우리는 22단계를 거쳐 "라이브 투표 서비스"를 직접 만들고, 컨테이너에 담아, AWS 클라우드에 배포했습니다. 아래가 그 전체 여정 지도입니다. 지금은 맨 마지막, 22단계에 있습니다.
- 1장개발 환경 준비 (터미널 / Node.js / Git / GitHub / VS Code / Claude Code)
- 2장Claude Code 사용법 익히기
- 3장무엇을 만들지 기획 (라이브 투표 서비스)
- 4장로컬에서 서비스 만들기 (React + Express + PostgreSQL)
- 5장Docker 개념
- 6장Dockerfile 작성
- 7장컨테이너 빌드·실행
- 8장AWS 시작 (계정 / IAM / 리전 / 비용)
- 9장이미지 태깅
- 10장ECR에 이미지 올리기
- 11장VPC 네트워크 구성
- 12장RDS 데이터베이스 생성
- 13장SSM 터널로 RDS 초기화
- 14장ECS Fargate + ALB로 배포 (기본 완성)
- 15장CI/CD (GitHub Actions)
- 16장IaC (Terraform)
- 17장배포 자동화 연결
- 18장현업 운영 구조 이해
- 19장무중단 배포
- 20장신규 버전 배포 & 롤백
- 21장(심화) 프론트를 Vercel로 분리 배포
- 22장마무리 (회고 + 리소스 삭제)
- 방금 끝낸 것: 21장에서 프론트를 Vercel로 분리 배포하고,
vercel.json의 rewrites로/api요청을 ALB로 프록시해 HTTPS로 "진짜 배포"를 완성했습니다. - 이번 장에서 하는 것: 전체 여정을 한눈에 회고하고, 실습으로 만든 AWS·Vercel 리소스를 빠짐없이 삭제해 과금을 막습니다.
이번 장에서 완성되는 것
한 문장으로: 전체 여정을 스스로 정리할 수 있게 되고, 실습으로 켜 둔 모든 리소스를 삭제해 더 이상 요금이 나가지 않는 상태로 마무리합니다.
이렇게 되면 성공입니다: 서울 리전(ap-northeast-2)에 vote-로 시작하는
리소스가 하나도 남아 있지 않고, Vercel 대시보드에 실습용 프로젝트가
사라져 있으며, 며칠 뒤 AWS 청구 대시보드에서 요금이 더 늘지 않는 것을
확인할 수 있습니다.
사전 조건
- 1~21장을 모두 마친 상태. 즉 ECS·ALB·RDS·VPC·ECR 등 AWS 리소스와 21장에서 만든 Vercel 프로젝트가 실제로 존재하는 상태여야, 이 장에서 하나씩 지워 나갈 수 있습니다.
- AWS 콘솔에 로그인할 수 있어야 합니다. 리전은 이 책 내내 써 온 서울(ap-northeast-2) 입니다.
- Vercel 대시보드에 로그인할 수 있어야 합니다. 21장에서 프론트를 올릴 때 쓴 그 계정입니다.
- (선택) 마지막 교차 점검에 Claude Code를 쓰려면,
vote-app폴더를 VS Code로 연 상태에서 터미널에claude를 실행할 수 있으면 됩니다.
22.1 전체 여정 회고 — 우리는 무엇을 만들었나
시작할 때 우리는 빈 노트북 앞에 있었습니다. 지금의 우리를 봅시다.
1부 — 만들고, 담았다
- 바이브코딩: 코드를 직접 짜지 않고, Claude Code에게 지시하고 확인하는 방법을 익혔다.
- 라이브 투표 서비스(프론트 + API + DB)를 기획하고 완성했다.
- Docker를 이해하고, 서비스를 "어디서든 똑같이 도는 상자"(이미지)에 담았다.
2부 — 손으로 배포했다
- AWS에 발을 들이고(계정·IAM·리전), 이미지 창고(ECR)에 상자를 올렸다.
- 격리된 네트워크(VPC)를 짓고, 보안 그룹으로 통신 사슬을 설계했다.
- 관리형 DB(RDS)를 프라이빗에 숨기고, SSM 터널로 안전하게 접속해 초기화했다.
- ECS Fargate로 컨테이너를 실행하고, ALB를 세워 인터넷에 공개했다.
3부 — 자동화하고, 되돌리고, 실무 패턴까지
- CI/CD: "푸시하면 배포되는" 파이프라인을 만들었다.
- IaC: 클릭으로 만든 인프라를 Terraform 코드로 옮겼다.
- 무중단: 배포 중에도 서비스가 안 끊김을 실험으로 증명했다.
- 롤백: 일부러 장애를 내고, 1분 만에 이전 버전으로 되돌렸다.
- (심화) Vercel 분리 배포: 프론트를 Vercel로 떼어 내 HTTPS로 서비스하고,
rewrite로
/api를 ALB에 붙여 "프론트는 Vercel, API는 ECS"라는 실무에서 흔한 구조를 직접 만들었다.
한 문장으로 압축하면 이렇습니다. "서비스의 탄생부터 장애 복구, 그리고 실무형 분리 배포까지, 운영의 한 사이클을 전부 직접 돌려 봤다." 이 책이 처음에 내건 목표 — "본인이 만든 서비스를 실제 고객에게 무중단 서비스하고 이를 자동화하고 싶은 사람" — 를 이제 여러분은 해 봤습니다.
그리고 하나 더. 이 책 내내 여러분은 코드를 직접 짜지 않았습니다. 대신 무엇을 만들지 정의하고, AI에게 지시하고, 결과를 검증하는 사람의 역할을 했습니다. 이것이 앞으로의 개발에서 점점 더 중요해지는 역할입니다.
22.2 실습 리소스 삭제 — 과금 방지
이제 만든 것을 치웁니다. 8장에서 약속한 그 시간입니다.
왜 반드시 지워야 하나 AWS는 "쓴 만큼"이 아니라 정확히는 "켜 둔 만큼" 청구합니다. 접속자가 0명이어도 NAT 게이트웨이·RDS·ALB·Fargate는 시간당 요금이 계속 쌓입니다. 실습이 끝난 지금, 이 리소스들은 요금만 나가는 상태입니다.
삭제 순서가 중요합니다. 만든 순서의 역순으로 지웁니다. 리소스들이 서로 연결돼 있어서, 안쪽(뒤에 만든 것)부터 지워야 걸리지 않고 지워집니다. (예: 서비스가 살아 있으면 클러스터가 안 지워지고, NAT가 살아 있으면 VPC가 안 지워집니다.)
시작 전, 콘솔 오른쪽 위 리전 선택기가 서울 (ap-northeast-2) 인지 확인하세요. 다른 리전을 보고 있으면 리소스가 안 보여서 "이미 다 지웠네?"로 착각하게 됩니다.
콘솔 화면은 조금씩 바뀝니다
AWS 콘솔의 메뉴 이름·버튼 위치는 이따금 개편됩니다. 아래 경로가 화면과
정확히 안 맞으면, 각 서비스 화면 위쪽의 검색창에 리소스 이름
(예: vote-service, vote-alb)을 쳐서 찾은 뒤 삭제하면 됩니다. 하는
일(무엇을 지우는가)은 그대로입니다.
[콘솔] AWS 삭제 체크리스트 — 위에서부터 순서대로
- ECS 서비스: ECS 콘솔 → 클러스터 →
vote-cluster→ 서비스 탭 →vote-service선택 → 삭제(Delete). 실행 중인 태스크가 있어 막히면 "강제 삭제(force delete)" 옵션을 켜서 지웁니다. 태스크가 모두 종료(0개)될 때까지 몇 분 기다립니다. - ECS 클러스터: ECS 콘솔 →
vote-cluster선택 → 클러스터 삭제 (Delete cluster). (서비스가 다 지워져야 클러스터가 지워집니다.) - ALB(로드밸런서): EC2 콘솔 → 왼쪽 메뉴 로드 밸런서 →
vote-alb선택 → 작업(Actions) → 삭제(Delete). - 타깃 그룹: EC2 콘솔 → 왼쪽 메뉴 대상 그룹(Target groups) →
vote-tg선택 → 작업 → 삭제. - 중계용 EC2(Bastion): EC2 콘솔 → 인스턴스 →
vote-bastion선택 → 인스턴스 상태(Instance state) → 인스턴스 종료(Terminate instance). (종료하면 다시 못 켜지지만, 실습이 끝났으니 괜찮습니다.) - RDS(데이터베이스): RDS 콘솔 → 데이터베이스 →
vote-db선택 → 작업(Actions) → 삭제(Delete).- "최종 스냅샷 생성" 물음: 실습용이므로 체크 해제(아니요) 해도 됩니다. (실무라면 반드시 스냅샷을 남깁니다.)
- "자동 백업 보존" 체크도 해제합니다. 마지막에
delete me같은 확인 문구를 입력해야 삭제됩니다. 완료까지 몇 분 걸립니다. - [용어] 스냅샷(Snapshot): DB의 특정 시점 백업본입니다. 남겨 두면 나중에 그 시점으로 복원할 수 있지만, 보관하는 동안 소액의 저장 비용이 듭니다. 그래서 완전히 끝낼 거면 남기지 않습니다.
- NAT 게이트웨이: VPC 콘솔 → 왼쪽 메뉴 NAT 게이트웨이 → 우리
VPC의 NAT 선택 → 작업 → NAT 게이트웨이 삭제. 상태가 "삭제됨
(Deleted)"이 될 때까지 잠시 기다립니다.
- [주의] 시간당 요금 1순위 품목입니다. 꼭 지웠는지 확인하세요.
- 탄력적 IP 릴리스: VPC 콘솔 → 왼쪽 메뉴 탄력적 IP(Elastic IPs)
→ NAT에 붙어 있던 IP 선택 → 작업(Actions) → 탄력적 IP 주소 릴리스
(Release Elastic IP addresses).
- [주의] 가장 놓치기 쉬운 항목입니다. NAT를 지워도 이 IP는 그대로 남습니다.
- [용어] 탄력적 IP(Elastic IP): 고정 공인 IP 주소입니다. NAT를 만들 때 함께 붙었는데, 어디에도 연결되지 않은 채로 남겨 두면 그 자체로 요금이 나옵니다. 그래서 NAT를 지운 직후 반드시 릴리스합니다. (NAT에 아직 붙어 있으면 릴리스 버튼이 비활성일 수 있으니, 7번을 먼저 끝내고 오세요.)
- VPC: VPC 콘솔 → VPC →
vote-vpc선택 → 작업 → VPC 삭제. 서브넷·라우팅 테이블·인터넷 게이트웨이·보안 그룹이 함께 정리됩니다. (앞 단계가 다 됐다면 걸림 없이 지워집니다. 막히면 아래 "막히면"을 보세요.) - ECR(이미지 창고): ECR 콘솔 → 프라이빗 리포지토리 →
vote-api,vote-web각각 선택 → 삭제(Delete). 안에 이미지가 있으면 삭제 확인 문구(delete)를 입력합니다. - CloudWatch 로그: CloudWatch 콘솔 → 왼쪽 메뉴 로그 → 로그 그룹
(Log groups) →
vote또는/ecs/vote로 시작하는 로그 그룹 선택 → 작업 → 삭제. (소액이지만 깔끔하게 비웁니다.) - Secrets Manager: (18장 등에서 시크릿 금고를 만들었다면) Secrets Manager 콘솔 → 해당 시크릿 선택 → 삭제. 시크릿은 즉시 사라지지 않고 대기 기간(최소 7일, 기본 30일) 후 완전 삭제되며, 대기 중에는 요금이 거의 없습니다. (안 만들었다면 이 단계는 건너뜁니다.)
[콘솔] Vercel 프로젝트·배포 삭제 — 21장에서 만든 것
21장에서 프론트를 Vercel로 올렸습니다. 그 프로젝트도 정리합니다. Vercel
무료(Hobby) 플랜은 요금이 없지만, 이 프로젝트는 vercel.json의 rewrite로
우리가 지운 ALB 주소를 계속 가리키고 있어서, 남겨 두면 열었을 때
/api가 죽은 서버를 부르며 에러가 납니다. 그래서 함께 삭제합니다.
(프로젝트를 지우면 그 안의 모든 배포도 함께 사라집니다.)
- 웹브라우저에서
https://vercel.com/dashboard에 접속해, 21장에서 쓴 계정으로 로그인합니다. - 프로젝트 목록에서 21장에서 만든 프론트 프로젝트를 클릭해 들어갑니다. (프로젝트 이름은 21장에서 연결한 저장소/폴더 이름을 따릅니다.)
- 위쪽 탭에서 Settings(설정) 를 클릭합니다.
- 설정 페이지를 맨 아래까지 스크롤하면 빨간색 위험 구역에 Delete Project(프로젝트 삭제) 가 있습니다. 이 버튼을 누릅니다.
- 확인 창이 뜨면 안내에 따라 프로젝트 이름을 그대로 입력하고, 최종 삭제 버튼을 눌러 확정합니다.
Vercel과 GitHub 연동도 정리하고 싶다면 21장에서 GitHub 저장소를 Vercel에 연결했다면, 프로젝트를 지우는 것으로 배포는 멈춥니다. 저장소에 자동 배포를 걸어 둔 상태를 완전히 끊고 싶으면 GitHub 저장소 → Settings → Integrations 에서 Vercel 연동을 제거해도 됩니다. (선택 사항입니다.)
[프롬프트] Claude Code에게 교차 점검 맡기기
사람 눈은 하나쯤 놓칩니다. 마지막 점검은 기계에게 맡기세요. vote-app
폴더를 VS Code로 연 터미널에서 claude를 실행한 뒤 이렇게 지시합니다.
Claude Code가 aws ecs, aws elbv2, aws ec2, aws rds 같은 명령으로
하나씩 조회해 남은 것을 알려 줍니다. 무언가 남아 있다고 나오면, 위
체크리스트에서 해당 항목을 다시 지우세요.
지웠는데, 다시 만들고 싶다면?
여기서 16장의 Terraform이 빛납니다. infra 폴더에서 terraform apply
한 번이면, 방금 지운 인프라가 코드 그대로 다시 세워집니다. 시간이 있다면
꼭 해 보세요 — "지워도 코드가 있으니 두렵지 않다"는 IaC의 감각을 몸으로
얻는 최고의 마무리 실습입니다. 확인이 끝나면 반드시 terraform
destroy로 다시 정리하세요. 안 그러면 되살린 인프라가 또 요금을
냅니다.
[확인] 최종 점검 두 가지
- 청구 대시보드: 콘솔 오른쪽 위 계정 메뉴 → 결제 및 비용 관리 (Billing and Cost Management) → 며칠 뒤 다시 들어와 "요금이 더 이상 늘지 않는지" 확인하세요. 8장에서 예산 알림을 설정했다면 이중 안전망이 됩니다. (방금 지워도 이미 쌓인 이번 달 요금은 남아 있을 수 있습니다. 중요한 건 "앞으로 더 늘지 않는 것"입니다.)
- IAM 액세스 키 정리: 실습을 완전히 끝낼 거라면, IAM 콘솔 → 사용자 → 보안 자격 증명 에서 실습에 쓴 액세스 키를 비활성화 또는 삭제해 두는 것이 안전합니다. 15장 CI/CD에서 이 키를 GitHub Secrets에도 넣었다면, GitHub 저장소 → Settings → Secrets 에서도 함께 지웁니다. (키가 유출돼도 악용될 수 없게 하는 마무리입니다.)
22.3 마치며
처음 시작할 때 "배포"는 여러분에게 막연하고 두려운 단어였을 겁니다. 지금은 그 안이 훤히 보일 겁니다. 상자에 담고(Docker), 창고에 올리고(ECR), 무대에 세우고(ECS·ALB), 길을 자동화하고(CI/CD), 무대 설계도를 남기고 (Terraform), 끊김 없이 갈아 끼우고(무중단), 잘못되면 되돌리고(롤백), 프론트는 떼어 내 따로 서비스한다(Vercel 분리 배포).
기술은 계속 바뀝니다. 하지만 이 과정에서 얻은 두 가지는 오래 갑니다. 하나는 배포와 운영의 사고방식 — 재현 가능하게, 기록이 남게, 되돌릴 수 있게. 다른 하나는 AI와 일하는 방식 — 명확히 지시하고, 결과를 의심하고, 검증하는 습관. 이 둘을 갖췄다면, 다음에 어떤 도구가 나와도 여러분은 금방 올라탈 수 있습니다.
여러분의 다음 서비스를 응원합니다. 이번에는 진짜 사용자를 받아 보세요.
[확인]
이번 장이 제대로 끝났는지 눈으로 확인합니다.
- ECS 콘솔에서
vote-cluster와vote-service가 보이지 않는다. - EC2 콘솔에서
vote-alb(로드 밸런서)·vote-tg(대상 그룹)·vote-bastion(인스턴스)이 없다. - RDS 콘솔에서
vote-db가 없다. - VPC 콘솔에서 NAT 게이트웨이가 없고, 탄력적 IP 목록이 비어 있다.
- VPC 콘솔에서
vote-vpc가 없다. - ECR 콘솔에서
vote-api·vote-web리포지토리가 없다. - Vercel 대시보드에서 21장에 만든 프로젝트가 사라졌다.
- (선택) Claude Code 교차 점검에서 "남은 vote 리소스 없음"을 확인했다.
여기까지 확인됐다면, 실습으로 켜 둔 것을 모두 껐습니다.
막히면
리소스를 지울 때 자주 나는 오류와 대처법입니다.
-
VPC가 "종속 리소스가 있어 삭제할 수 없다"며 안 지워진다. VPC 안에 아직 살아 있는 것이 남은 경우입니다. 순서를 다시 밟으세요: ECS 서비스/클러스터 → ALB → 타깃 그룹 → 중계 EC2 → NAT 게이트웨이 → 탄력적 IP 릴리스가 모두 끝난 뒤에 VPC를 지워야 합니다. 특히 NAT 게이트웨이가 "삭제됨" 상태가 될 때까지 기다렸다가 VPC를 지우세요.
-
RDS 삭제 버튼이 회색으로 비활성이다. DB에 "삭제 방지(Deletion protection)"가 켜져 있을 수 있습니다.
vote-db→ 수정(Modify)에서 삭제 방지를 끄고 저장한 뒤, 다시 삭제를 시도하세요. -
탄력적 IP 릴리스 버튼이 안 눌린다. 아직 NAT 게이트웨이(또는 다른 리소스)에 붙어 있는 상태입니다. 먼저 NAT 게이트웨이를 삭제해 "삭제됨" 상태가 되면, 그 IP의 연결이 풀려 릴리스할 수 있습니다.
-
콘솔에서 리소스가 하나도 안 보인다. 리전이 서울(ap-northeast-2)이 맞는지 오른쪽 위에서 확인하세요. 다른 리전을 보고 있으면 우리 리소스가 안 보입니다.
-
Vercel 프로젝트를 지웠는데 예전 주소가 아직 열린다. 브라우저 캐시일 수 있습니다. 잠시 뒤 다시 열어 보면 접속되지 않습니다. 프로젝트가 목록에서 사라졌다면 삭제는 완료된 것입니다.
[체크리스트]
- □ 전체 흐름(만들다→담다→손배포→자동화→무중단→롤백→Vercel 분리)을 남에게 설명할 수 있다
- □ ECS 서비스·클러스터를 삭제했다
- □ ALB·타깃 그룹·중계 EC2를 삭제했다
- □ RDS를 삭제했다
- □ NAT 게이트웨이를 삭제하고, 탄력적 IP를 릴리스했다 (놓치기 쉬운 1순위)
- □ VPC를 삭제했다
- □ ECR 리포지토리(vote-api·vote-web)와 CloudWatch 로그 그룹을 삭제했다
- □ (만들었다면) Secrets Manager 시크릿을 삭제 예약했다
- □ 21장에서 만든 Vercel 프로젝트를 삭제했다
- □ Claude Code로 남은 리소스가 없는지 교차 점검했다
- □ IAM 액세스 키와 GitHub Secrets의 키를 정리했다
- □ 며칠 뒤 청구 대시보드를 확인할 일정을 잡았다