Chapter 14

모니터링 & 리소스 정리

"서비스를 모니터링하고, 실습 후 반드시 정리하자"

학습 목표

  • CloudWatch의 메트릭, 대시보드, 경보 개념을 이해한다
  • SNS를 활용하여 경보 알림을 설정할 수 있다
  • CloudWatch 대시보드를 만들어 서비스 상태를 한눈에 모니터링할 수 있다
  • AWS 리소스 정리 순서와 그 이유를 설명할 수 있다
  • 실습에서 생성한 모든 리소스를 빠짐없이 삭제하여 추가 과금을 방지한다

이 챕터에서 할 일

이번 챕터는 두 파트로 나뉩니다. Part 1에서는 CloudWatch를 이용해 ShopEasy 서비스의 상태를 모니터링하는 환경을 구축합니다. Part 2에서는 실습에서 생성한 모든 AWS 리소스를 삭제하여 추가 과금을 방지합니다.

파트 내용 주요 서비스
Part 1 모니터링 설정 CloudWatch, SNS
Part 2 리소스 정리 (19단계) 모든 AWS 리소스
예상 소요 시간

Part 1 (모니터링): 약 20~30분
Part 2 (리소스 정리): 약 30~40분 (RDS 삭제, NAT Gateway 삭제 등에 시간이 소요됩니다)

반드시 Part 2까지 완료하세요!

Part 2 리소스 정리를 하지 않으면 매일 과금이 발생합니다. 특히 NAT Gateway(시간당 ~$0.059), RDS(시간당 ~$0.026), EC2(시간당 ~$0.0116) 등은 사용하지 않아도 실행 중이면 계속 과금됩니다. 실습이 끝나면 반드시 모든 리소스를 삭제하세요!

왜 모니터링이 필요한가?

서비스를 배포했다고 해서 끝이 아닙니다. 실제 운영 환경에서는 예상치 못한 문제가 언제든 발생할 수 있습니다. 서버 CPU가 갑자기 치솟거나, 데이터베이스 연결이 끊기거나, 저장 공간이 부족해질 수 있습니다. 이런 상황을 사전에 감지하고 대응하려면 모니터링이 필수입니다.

비유: CloudWatch = 건물의 CCTV 모니터실

건물 관리자는 CCTV 모니터실에서 모든 상황을 한눈에 파악합니다. 화재가 나면 경보기가 울리고, 침입자가 감지되면 알림이 갑니다. CloudWatch는 AWS 서비스의 CCTV 모니터실입니다.

CCTV 모니터실CloudWatch
CCTV 카메라 (데이터 수집)메트릭 (Metrics)
모니터 화면 (시각화)대시보드 (Dashboard)
화재 경보기 (이상 감지)경보 (Alarm)
경비실에 전화 (알림 전달)SNS 알림 (이메일, SMS)

모니터링이 중요한 3가지 이유

  1. 장애 조기 발견: CPU 사용률이 80%를 넘으면 알림을 받아, 서비스가 다운되기 전에 대응할 수 있습니다. 고객 불만이 쏟아지기 전에 미리 조치하는 것이 핵심입니다.
  2. 비용 관리: AWS는 사용한 만큼 과금됩니다. 예상보다 트래픽이 많거나 불필요한 리소스가 실행 중이면 비용이 급증할 수 있습니다. 비용 탐색기와 경보를 통해 지출을 관리할 수 있습니다.
  3. 성능 최적화: 어떤 시간대에 트래픽이 많은지, 어떤 리소스가 병목인지 데이터를 기반으로 분석하여 인프라를 최적화할 수 있습니다.

CloudWatch 핵심 개념

1. 메트릭 (Metrics)

메트릭은 AWS 리소스에서 수집되는 시간별 데이터 포인트입니다. EC2의 CPU 사용률, RDS의 데이터베이스 연결 수, S3의 요청 수 등이 모두 메트릭입니다. AWS 서비스는 기본적으로 5분 간격으로 메트릭을 CloudWatch에 전송합니다.

서비스주요 메트릭설명
EC2CPUUtilizationCPU 사용률 (%)
EC2NetworkIn/Out네트워크 트래픽 (바이트)
RDSDatabaseConnections현재 DB 연결 수
RDSFreeStorageSpace남은 저장 공간 (바이트)
RDSCPUUtilizationDB 서버 CPU 사용률 (%)

2. 대시보드 (Dashboard)

대시보드는 여러 메트릭을 하나의 화면에서 시각적으로 모니터링할 수 있는 커스텀 페이지입니다. 그래프, 숫자, 텍스트 등의 위젯을 자유롭게 배치하여 서비스 상태를 한눈에 파악할 수 있습니다.

3. 경보 (Alarm)

경보는 특정 메트릭이 임계값을 초과하면 자동으로 알림을 보내는 기능입니다. 예를 들어 "EC2 CPU가 5분 동안 80%를 넘으면 이메일로 알려줘"와 같은 규칙을 설정할 수 있습니다.

경보의 3가지 상태:

  • OK: 메트릭이 정상 범위 내에 있음
  • ALARM: 메트릭이 임계값을 초과했음 (알림 발송)
  • INSUFFICIENT_DATA: 데이터가 부족하여 판단할 수 없음

4. SNS (Simple Notification Service)

SNS는 알림을 전달하는 메시징 서비스입니다. CloudWatch 경보가 발생하면 SNS를 통해 이메일, SMS, Lambda 함수 등으로 알림을 보낼 수 있습니다. SNS에서는 "주제(Topic)"를 만들고, 해당 주제에 "구독(Subscription)"을 추가하는 방식으로 동작합니다.

CloudWatch 모니터링 흐름 정리

AWS 서비스 (EC2, RDS 등) → 메트릭 자동 수집 → 대시보드에서 시각화 → 경보가 임계값 감시 → 임계값 초과 시 SNS로 알림 전달 → 이메일로 관리자에게 통보

무료 티어 참고

CloudWatch는 기본 모니터링(5분 간격)이 무료입니다. 대시보드는 월 3개까지 무료, 경보는 월 10개까지 무료입니다. 이 실습 범위에서는 추가 비용이 발생하지 않습니다.

실습 Part 1 - 모니터링 설정

시작 전 확인사항
  • AWS 콘솔에 로그인되어 있는지 확인하세요
  • 리전이 아시아 태평양 (서울) ap-northeast-2로 설정되어 있는지 확인하세요
  • 이전 챕터에서 생성한 EC2와 RDS가 실행 중인지 확인하세요
Part 1: CloudWatch 모니터링 설정
  1. SNS 주제 생성 및 이메일 구독 추가

    CloudWatch 경보가 발생했을 때 알림을 받을 SNS 주제를 만듭니다. 이 주제에 자신의 이메일 주소를 구독으로 추가하면, 경보 시 이메일을 받을 수 있습니다.

    1-1. SNS 주제 생성

    항목
    유형표준 (Standard)
    이름ShopEasy-Alerts

    1-2. 이메일 구독 추가

    항목
    프로토콜이메일 (Email)
    엔드포인트본인 이메일 주소
    이메일 확인 필수!

    구독을 추가하면 입력한 이메일로 확인 메일(Confirmation)이 발송됩니다. 메일함에서 "AWS Notification - Subscription Confirmation" 메일을 찾아 "Confirm subscription" 링크를 클릭해야 구독이 완료됩니다. 확인하지 않으면 경보 알림을 받을 수 없습니다.

    SNS 서비스로 이동: AWS 콘솔 상단 검색창에 "SNS"를 입력하고 Simple Notification Service를 클릭합니다.

    주제 생성: 왼쪽 메뉴 "주제" → "주제 생성" → 유형: 표준, 이름: ShopEasy-Alerts

    구독 생성: 생성된 주제 클릭 → "구독 생성" → 프로토콜: 이메일, 엔드포인트: 본인 이메일

  2. CloudWatch 대시보드 생성

    ShopEasy 서비스의 핵심 메트릭을 한눈에 볼 수 있는 커스텀 대시보드를 만듭니다. EC2 CPU 사용률, RDS 연결 수, RDS 저장 공간 등을 모니터링합니다.

    2-1. 대시보드 생성

    항목
    대시보드 이름ShopEasy-Dashboard

    2-2. 위젯 추가 (3개)

    다음 3개의 메트릭 위젯을 대시보드에 추가합니다:

    위젯메트릭 네임스페이스메트릭리소스
    EC2 CPU 사용률 AWS/EC2 CPUUtilization ShopEasy EC2 인스턴스
    RDS 연결 수 AWS/RDS DatabaseConnections ShopEasy RDS 인스턴스
    RDS 저장 공간 AWS/RDS FreeStorageSpace ShopEasy RDS 인스턴스
    위젯 유형 선택

    "꺾은선 그래프(Line)" 유형을 선택하면 시간에 따른 변화를 확인하기 좋습니다. 기간은 기본값(5분)으로 설정하면 됩니다.

    CloudWatch 서비스로 이동: AWS 콘솔 상단 검색창에 "CloudWatch"를 입력합니다.

    대시보드 생성: 왼쪽 메뉴 "대시보드" → "대시보드 생성" → 이름 입력

    위젯 추가: "위젯 추가" → "꺾은선" 선택 → "메트릭" 선택 → EC2 또는 RDS 네임스페이스에서 원하는 메트릭 선택

    저장: 위젯 3개를 모두 추가한 후 반드시 "대시보드 저장" 버튼을 클릭하세요.

  3. CloudWatch 경보 생성

    EC2 CPU 사용률이 80%를 초과하면 SNS로 알림을 보내는 경보(Alarm)를 생성합니다. 이 경보를 통해 서버에 부하가 걸리는 것을 조기에 감지할 수 있습니다.

    항목
    경보 이름ShopEasy-EC2-High-CPU
    메트릭 네임스페이스AWS/EC2
    메트릭 이름CPUUtilization
    인스턴스ShopEasy EC2 인스턴스 선택
    통계Average (평균)
    기간5분
    조건보다 큼 (>) 80
    평가 기간1회 (5분 중 1회 초과 시 경보)
    알림 대상ShopEasy-Alerts (SNS 주제)
    경보 조건 해석

    위 설정의 의미: "EC2 CPU 사용률의 5분 평균이 80%를 1회라도 초과하면 ShopEasy-Alerts SNS 주제로 알림을 보내라."

    실무에서는 평가 기간을 3회 연속으로 설정하여 일시적인 스파이크에 의한 오경보를 줄이기도 합니다. 이 실습에서는 빠르게 테스트하기 위해 1회로 설정합니다.

    경보 생성: CloudWatch → 왼쪽 메뉴 "경보" → "모든 경보" → "경보 생성"

    메트릭 선택: "메트릭 선택" → EC2 → 인스턴스별 메트릭 → CPUUtilization 체크 → "메트릭 선택"

    조건 설정: 통계: 평균, 기간: 5분, 보다 큼, 임계값: 80

    알림 설정: "기존 SNS 주제 선택" → ShopEasy-Alerts

    이름 입력: ShopEasy-EC2-High-CPU → "경보 생성"

  4. 비용 탐색기(Cost Explorer)에서 현재 비용 확인

    실습 중 발생한 AWS 비용을 Cost Explorer에서 확인합니다. 어떤 서비스에서 비용이 발생하고 있는지 파악하는 것이 중요합니다.

    항목
    서비스AWS 비용 관리 (Billing)
    메뉴Cost Explorer
    기간이번 달
    그룹 기준서비스별
    주요 과금 서비스 확인

    Cost Explorer에서 다음 서비스들의 비용을 특히 주의 깊게 확인하세요:

    • VPC (NAT Gateway): 시간당 ~$0.059 (월 ~$43)
    • RDS: db.t3.micro 시간당 ~$0.026 (월 ~$19)
    • EC2: t2.micro 시간당 ~$0.0116 (월 ~$8.5)
    • Elastic IP: 미사용 시 시간당 ~$0.005

    비용 관리로 이동: 콘솔 우측 상단 계정 이름 클릭 → "결제 대시보드" 또는 검색창에 "Billing"

    Cost Explorer: 왼쪽 메뉴 "Cost Explorer" → "Cost Explorer 시작" (처음 사용 시 활성화 필요, 최대 24시간 소요)

    필터: 기간을 "이번 달"로, 그룹 기준을 "서비스"로 설정하면 서비스별 비용을 확인할 수 있습니다.

    Cost Explorer가 아직 활성화되지 않았다면 "청구서" 페이지에서도 현재 비용을 확인할 수 있습니다.

리소스 정리의 중요성

리소스 정리 안 하면 과금!

AWS는 사용한 만큼 과금되는 서비스입니다. 실습이 끝나도 리소스를 삭제하지 않으면 계속 비용이 발생합니다. 특히 다음 서비스는 실행 중이기만 해도 시간당 과금이 됩니다:

서비스시간당 비용월 예상 비용비고
NAT Gateway~$0.059~$43가장 비싸므로 먼저 삭제!
RDS (db.t3.micro)~$0.026~$19프리 티어 초과 시
EC2 (t2.micro)~$0.0116~$8.5프리 티어 초과 시
Elastic IP (미사용)~$0.005~$3.6연결되지 않은 EIP

모두 합치면 실습 리소스를 방치할 경우 월 약 $70 이상이 과금될 수 있습니다!

왜 삭제 순서가 중요한가?

AWS 리소스는 서로 의존 관계를 가지고 있습니다. 예를 들어, VPC 안에 서브넷이 있고, 서브넷 안에 EC2가 있습니다. VPC를 먼저 삭제하려고 하면 "이 VPC에 연결된 리소스가 있어서 삭제할 수 없습니다"라는 오류가 발생합니다. 따라서 가장 안쪽(상위 레이어)부터 역순으로 삭제해야 합니다.

비유: 건물 철거 순서

건물을 철거할 때 지하부터 무너뜨리면 건물 전체가 위험합니다. 옥상 → 각 층 내부 집기 → 벽체 → 기둥 → 기초 순서로 철거해야 안전합니다. AWS 리소스 정리도 마찬가지입니다. 보안 서비스(GuardDuty, CloudTrail, Secrets Manager, KMS) → 모니터링(CloudWatch, SNS) → 컴퓨팅(EC2, RDS) → 스토리지(S3, DynamoDB) → 네트워크(서브넷, VPC) 순서로 삭제합니다.

정리 원칙: 비싼 것 먼저, 의존성 역순으로
  • 과금 리소스 우선 삭제: NAT Gateway처럼 시간당 과금이 큰 것을 먼저 삭제
  • 서비스 레이어 → 컴퓨팅 → 스토리지 → 네트워크 순서
  • 참조 관계 확인: 보안 그룹은 EC2/RDS가 참조하므로, 인스턴스 삭제 후 보안 그룹 삭제
  • VPC는 가장 마지막에: 모든 하위 리소스가 삭제된 후에야 삭제 가능

실습 Part 2 - 리소스 정리

삭제 순서를 반드시 지켜주세요!

아래 19단계의 삭제 순서는 의존성을 고려하여 설계되었습니다. 순서를 어기면 "이 리소스는 다른 리소스에서 사용 중입니다"와 같은 오류가 발생합니다. 반드시 순서대로 진행하세요.

Part 2: 리소스 정리 (19단계)
  1. GuardDuty 비활성화

    Chapter 13에서 활성화한 GuardDuty를 비활성화(삭제)합니다. GuardDuty는 사용량 기반 과금(분석한 로그 양에 따라)이므로, 비활성화하면 즉시 과금이 중지됩니다.

    삭제 대상서비스메뉴 위치
    GuardDuty DetectorGuardDuty설정 (Settings)
    GuardDuty 과금 방식

    GuardDuty는 분석한 CloudTrail 이벤트, VPC Flow Logs, DNS 쿼리 로그의 양에 따라 과금됩니다. 비활성화하면 즉시 분석이 중지되어 추가 과금이 발생하지 않습니다. 30일 무료 체험 기간 중이라면 비용이 발생하지 않았을 수 있습니다.

    GuardDuty 콘솔 이동: AWS 콘솔 상단 검색창에 "GuardDuty"를 입력합니다.

    비활성화: 왼쪽 메뉴 "설정(Settings)" → 페이지 하단의 "GuardDuty 비활성화" 또는 "Suspend/Disable GuardDuty" 클릭

    CLI: aws guardduty list-detectors --region ap-northeast-2로 Detector ID 확인 후 aws guardduty delete-detector --detector-id <DETECTOR_ID> --region ap-northeast-2

  2. CloudTrail 트레일 삭제

    Chapter 12에서 생성한 CloudTrail 트레일을 삭제합니다. 트레일 로그를 저장하기 위해 전용 S3 버킷을 생성했다면, 해당 버킷도 비우고 삭제해야 합니다.

    삭제 대상서비스메뉴 위치
    ShopEasy-TrailCloudTrail트레일
    shopeasy-cloudtrail-logs-<ACCOUNT_ID>S3버킷 (전용 버킷 생성한 경우)
    CloudTrail 로그 S3 버킷 정리

    CloudTrail 트레일을 삭제해도 이미 저장된 로그 파일은 S3 버킷에 그대로 남아 있습니다. S3 스토리지 비용이 발생할 수 있으므로, 트레일 전용 S3 버킷을 생성했다면 해당 버킷도 비우고 삭제하세요.

    CloudTrail 콘솔 이동: AWS 콘솔 상단 검색창에 "CloudTrail"을 입력합니다.

    트레일 삭제: 왼쪽 메뉴 "트레일" → ShopEasy-Trail 선택 → "삭제" 클릭

    S3 버킷 정리: S3 → shopeasy-cloudtrail-logs 버킷 → "비우기" → "삭제"

    CLI: aws cloudtrail delete-trail --name ShopEasy-Trail --region ap-northeast-2

    S3 CLI: aws s3 rb s3://shopeasy-cloudtrail-logs-<ACCOUNT_ID> --force

  3. Secrets Manager 시크릿 삭제

    Chapter 11에서 생성한 Secrets Manager 시크릿을 삭제합니다. Secrets Manager는 시크릿당 월 $0.40이 과금되므로 반드시 삭제해야 합니다.

    삭제 대상서비스메뉴 위치
    ShopEasy/DB-CredentialsSecrets Manager보안 암호
    즉시 삭제 vs 복구 대기

    기본적으로 시크릿을 삭제하면 30일간 복구 대기 기간이 있습니다. 이 기간 동안에도 과금이 발생하므로, 실습 정리 시에는 복구 대기 없이 즉시 삭제하는 것이 좋습니다. 웹 콘솔에서 "대기 기간 없이 강제 삭제" 옵션을 선택하거나, CLI에서 --force-delete-without-recovery 옵션을 사용하세요.

    Secrets Manager 콘솔 이동: AWS 콘솔 상단 검색창에 "Secrets Manager"를 입력합니다.

    시크릿 삭제: 보안 암호 목록에서 ShopEasy/DB-Credentials 선택 → "작업" → "보안 암호 삭제"

    즉시 삭제: 대기 기간을 "대기 기간 없이 강제 삭제"로 선택 → "삭제 예약"

    CLI: aws secretsmanager delete-secret --secret-id ShopEasy/DB-Credentials --force-delete-without-recovery --region ap-northeast-2

  4. KMS 키 삭제 예약 (커스텀 키를 생성한 경우)

    Chapter 10에서 커스텀 CMK(Customer Master Key)를 직접 생성한 경우, 해당 키의 삭제를 예약합니다. KMS 키는 즉시 삭제할 수 없으며 최소 7일의 대기 기간이 필요합니다.

    삭제 대상서비스조건
    ShopEasy 커스텀 CMKKMS커스텀 키를 생성한 경우에만
    AWS 관리형 키는 삭제 불필요

    AWS 관리형 키(별칭이 aws/로 시작하는 키, 예: aws/s3, aws/rds)는 삭제할 필요가 없습니다. 이 키들은 AWS가 관리하며 사용하지 않으면 비용이 발생하지 않습니다. 실습에서 AWS 관리형 키만 사용했다면 이 단계를 건너뛰세요.

    KMS 키 삭제 대기 기간

    KMS 키 삭제는 즉시 이루어지지 않습니다. 최소 7일, 최대 30일의 대기 기간을 설정해야 합니다. 대기 기간 동안 키는 "삭제 예정(Pending deletion)" 상태가 되며, 이 기간 동안에는 키를 사용할 수 없지만 삭제를 취소할 수 있습니다. 대기 기간이 지나면 키가 영구적으로 삭제됩니다.

    KMS 콘솔 이동: AWS 콘솔 상단 검색창에 "KMS"를 입력합니다.

    키 확인: 왼쪽 메뉴 "고객 관리형 키" → ShopEasy 관련 키가 있는지 확인

    삭제 예약: 키 선택 → "키 작업" → "키 삭제 예약" → 대기 기간: 7일 → "삭제 예약"

    CLI: aws kms schedule-key-deletion --key-id <KEY_ID> --pending-window-in-days 7 --region ap-northeast-2

    참고: AWS 관리형 키 (aws/로 시작하는 별칭)는 삭제하지 않습니다.

  5. CloudWatch 경보 및 대시보드 삭제

    Part 1에서 생성한 CloudWatch 경보와 대시보드를 삭제합니다. 모니터링 리소스는 다른 서비스에 대한 의존성이 없으므로 가장 먼저 삭제합니다.

    삭제 대상서비스메뉴 위치
    ShopEasy-EC2-High-CPUCloudWatch경보 → 모든 경보
    ShopEasy-DashboardCloudWatch대시보드

    경보 삭제: CloudWatch → 경보 → 모든 경보 → ShopEasy-EC2-High-CPU 선택 → 작업 → 삭제

    대시보드 삭제: CloudWatch → 대시보드 → ShopEasy-Dashboard 선택 → 삭제

  6. SNS 주제 삭제

    알림용으로 생성한 SNS 주제를 삭제합니다. 주제를 삭제하면 연결된 구독도 함께 삭제됩니다.

    삭제 대상서비스
    ShopEasy-AlertsSNS

    SNS 주제 삭제: SNS → 주제 → ShopEasy-Alerts 선택 → 삭제

    삭제 확인 창에서 "삭제"를 입력해야 삭제됩니다.

  7. NAT Gateway 삭제

    시간당 과금이 되므로 최대한 빨리 삭제합니다. NAT Gateway를 삭제해도 연결된 Elastic IP는 자동으로 해제되지 않으므로 다음 단계에서 별도로 해제해야 합니다.

    삭제 대상서비스메뉴 위치
    ShopEasy-NATVPCNAT 게이트웨이
    삭제에 시간이 걸립니다

    NAT Gateway 삭제 요청 후 상태가 "Deleting"으로 변경됩니다. 완전히 삭제되기까지 수 분이 소요될 수 있습니다. 삭제가 완료될 때까지 기다린 후 다음 단계로 진행하세요.

    NAT GW 삭제: VPC → NAT 게이트웨이 → ShopEasy-NAT 선택 → 작업 → NAT 게이트웨이 삭제

    삭제 확인 창에서 "삭제"를 입력합니다.

    상태가 "Deleted"가 될 때까지 기다려주세요.

  8. Elastic IP 해제

    NAT Gateway에 연결되어 있던 Elastic IP를 해제(Release)합니다. 미사용 Elastic IP도 과금되므로 반드시 해제하세요. NAT Gateway가 완전히 삭제된 후에 해제할 수 있습니다.

    삭제 대상서비스메뉴 위치
    ShopEasy NAT용 Elastic IPVPC 또는 EC2탄력적 IP

    EIP 해제: VPC → 탄력적 IP (또는 EC2 → 탄력적 IP) → NAT에 사용했던 EIP 선택 → 작업 → "탄력적 IP 주소 릴리스"

    NAT Gateway가 아직 "Deleting" 상태이면 해제할 수 없습니다. 완전히 삭제될 때까지 기다려주세요.

  9. RDS 인스턴스 삭제

    ShopEasy 데이터베이스(RDS MySQL)를 삭제합니다. 삭제 시 최종 스냅샷을 생략하여 불필요한 스냅샷 비용이 발생하지 않도록 합니다.

    삭제 대상서비스옵션
    ShopEasy RDS 인스턴스RDS최종 스냅샷 생성: 아니요
    삭제 방지 (Deletion Protection) 확인

    RDS 생성 시 "삭제 방지(Deletion Protection)"를 활성화했다면, 먼저 이 옵션을 비활성화해야 삭제할 수 있습니다. RDS 인스턴스 선택 → 수정 → "삭제 방지" 체크 해제 → 즉시 적용.

    RDS 삭제는 시간이 걸립니다

    RDS 삭제는 수 분에서 최대 10분이 소요될 수 있습니다. 이것은 정상이며, 삭제가 진행되는 동안 다음 단계로 넘어가도 됩니다.

    RDS 삭제: RDS → 데이터베이스 → ShopEasy DB 선택 → 작업 → 삭제

    옵션: "최종 스냅샷을 생성하시겠습니까?" → 아니요 선택

    확인: "I acknowledge..." 체크 → "delete me" 입력 → 삭제

    삭제 방지가 활성화되어 있으면: 인스턴스 선택 → 수정 → 맨 아래 "삭제 방지" 체크 해제 → 계속 → 즉시 적용 → DB 인스턴스 수정

  10. RDS 서브넷 그룹 삭제

    RDS 인스턴스가 삭제된 후에 RDS용 서브넷 그룹을 삭제합니다. RDS가 존재하는 동안에는 서브넷 그룹을 삭제할 수 없으므로, RDS 삭제가 완료되었는지 확인하세요.

    삭제 대상서비스메뉴 위치
    ShopEasy DB 서브넷 그룹RDS서브넷 그룹

    서브넷 그룹 삭제: RDS → 서브넷 그룹 → ShopEasy 서브넷 그룹 선택 → 삭제

    RDS 인스턴스가 아직 "Deleting" 상태이면 서브넷 그룹을 삭제할 수 없습니다. RDS가 완전히 삭제될 때까지 기다려주세요.

  11. EC2 인스턴스 종료

    ShopEasy API 서버가 실행 중인 EC2 인스턴스를 종료(Terminate)합니다. "중지(Stop)"가 아니라 "종료(Terminate)"해야 완전히 삭제됩니다. 중지는 일시 정지이고, 종료는 영구 삭제입니다.

    삭제 대상서비스작업
    ShopEasy EC2 인스턴스EC2인스턴스 종료 (Terminate)
    "중지"와 "종료"는 다릅니다!

    중지(Stop): 인스턴스가 일시 정지됨. EBS 볼륨은 유지되어 스토리지 비용 계속 발생.
    종료(Terminate): 인스턴스와 연결된 EBS 볼륨이 영구 삭제됨. 비용 발생 없음.
    반드시 "종료(Terminate)"를 선택하세요!

    EC2 종료: EC2 → 인스턴스 → ShopEasy 인스턴스 선택 → 인스턴스 상태 → "인스턴스 종료"

    종료 방지(Termination Protection)가 켜져 있다면: 인스턴스 선택 → 작업 → 인스턴스 설정 → "종료 방지 변경" → 비활성화

  12. S3 버킷 비우기 + 삭제

    S3 버킷은 비어 있어야만 삭제할 수 있습니다. 먼저 버킷을 비운(Empty) 후에 삭제합니다. 이미지 버킷과 프론트엔드 버킷, 두 개 모두 삭제해야 합니다.

    삭제 대상서비스작업 순서
    ShopEasy 이미지 버킷S3비우기 → 삭제
    ShopEasy 프론트엔드 버킷S3비우기 → 삭제
    버킷 비우기를 먼저!

    버킷에 객체가 남아 있으면 삭제할 수 없습니다. 버킷 선택 → "비우기(Empty)"를 먼저 실행한 후 → "삭제(Delete)"를 실행하세요. 비우기 확인 창에서 "영구 삭제"를 입력해야 합니다.

    S3 버킷 비우기: S3 → 버킷 → 버킷 선택 → "비우기" → "영구 삭제" 입력 → 비우기

    S3 버킷 삭제: 비워진 버킷 선택 → "삭제" → 버킷 이름 입력 → 삭제

    두 버킷 모두 동일한 과정을 반복합니다.

  13. DynamoDB 테이블 삭제

    리뷰 데이터를 저장하던 DynamoDB 테이블을 삭제합니다.

    삭제 대상서비스
    ShopEasy 리뷰 테이블DynamoDB

    DynamoDB 테이블 삭제: DynamoDB → 테이블 → ShopEasy 테이블 선택 → 삭제

    삭제 확인 창에서 "삭제"를 입력합니다. "백업 생성" 체크는 해제합니다.

  14. IAM 역할 정리 (정책 분리 → 정책 삭제 → 역할 삭제)

    IAM 역할을 삭제하려면 먼저 연결된 정책을 분리(Detach)해야 합니다. 그런 다음 커스텀 정책을 삭제하고, 마지막으로 역할을 삭제합니다. 3단계 순서를 지켜야 합니다.

    14-1. 역할에서 정책 분리

    ShopEasy EC2 역할에 연결된 모든 정책을 분리합니다.

    14-2. 커스텀 정책 삭제

    직접 생성한 커스텀 IAM 정책을 삭제합니다. (AWS 관리형 정책은 삭제하지 않습니다)

    14-3. 역할 삭제

    정책이 모두 분리된 역할을 삭제합니다.

    정책 분리: IAM → 역할 → ShopEasy 역할 클릭 → 권한 탭 → 각 정책의 "분리" 또는 "X" 버튼 클릭

    정책 삭제: IAM → 정책 → 필터: "고객 관리형" → ShopEasy 관련 정책 선택 → 삭제

    역할 삭제: IAM → 역할 → ShopEasy 역할 선택 → 삭제 → 역할 이름 입력

  15. 보안 그룹 삭제

    EC2용 보안 그룹과 RDS용 보안 그룹을 삭제합니다. EC2와 RDS 인스턴스가 먼저 삭제되어야 보안 그룹을 삭제할 수 있습니다. 기본(default) 보안 그룹은 삭제하지 마세요 - VPC와 함께 자동 삭제됩니다.

    삭제 대상서비스
    ShopEasy EC2 보안 그룹VPC (또는 EC2)
    ShopEasy RDS 보안 그룹VPC (또는 EC2)
    보안 그룹이 삭제 안 되는 경우

    다른 보안 그룹의 인바운드/아웃바운드 규칙에서 이 보안 그룹을 참조하고 있으면 삭제할 수 없습니다. 먼저 해당 규칙을 수정하거나, 참조하는 보안 그룹의 규칙에서 참조를 제거한 후 삭제하세요.

    보안 그룹 삭제: VPC → 보안 그룹 → ShopEasy 관련 보안 그룹 선택 → 작업 → "보안 그룹 삭제"

    삭제 실패 시: 해당 보안 그룹을 참조하는 다른 보안 그룹의 규칙을 먼저 수정(참조 제거)한 후 다시 시도합니다.

  16. 인터넷 게이트웨이 분리 + 삭제

    인터넷 게이트웨이(IGW)는 VPC에서 분리(Detach)한 후에 삭제해야 합니다. VPC에 연결된 상태에서는 삭제할 수 없습니다.

    작업대상
    1. VPC에서 분리 (Detach)ShopEasy-IGW
    2. 삭제 (Delete)ShopEasy-IGW

    IGW 분리: VPC → 인터넷 게이트웨이 → ShopEasy-IGW 선택 → 작업 → "VPC에서 분리"

    IGW 삭제: 분리된 IGW 선택 → 작업 → "인터넷 게이트웨이 삭제"

  17. 서브넷 삭제 (4개)

    ShopEasy-VPC 내에 생성한 서브넷 4개를 모두 삭제합니다.

    삭제 대상CIDR
    ShopEasy-Public-A10.0.1.0/24
    ShopEasy-Public-C10.0.2.0/24
    ShopEasy-Private-A10.0.100.0/24
    ShopEasy-Private-C10.0.101.0/24

    서브넷 삭제: VPC → 서브넷 → ShopEasy 관련 서브넷 4개를 모두 선택 → 작업 → "서브넷 삭제"

    한 번에 여러 개를 선택하여 삭제할 수 있습니다.

    삭제가 안 되면: 해당 서브넷에 아직 ENI(네트워크 인터페이스)가 남아 있을 수 있습니다. NAT Gateway 삭제가 완전히 끝났는지 확인하세요.

  18. 라우트 테이블 삭제 (기본 제외)

    직접 생성한 퍼블릭/프라이빗 라우트 테이블을 삭제합니다. VPC 기본(Main) 라우트 테이블은 삭제하지 않습니다 - VPC 삭제 시 자동으로 함께 삭제됩니다.

    삭제 대상비고
    ShopEasy-Public-RT퍼블릭 라우트 테이블
    ShopEasy-Private-RT프라이빗 라우트 테이블

    라우트 테이블 삭제: VPC → 라우트 테이블 → ShopEasy 관련 라우트 테이블 선택 → 작업 → "라우트 테이블 삭제"

    "Main" 열에 "Yes"로 표시된 기본 라우트 테이블은 삭제하지 마세요.

    서브넷 연결이 남아 있으면 먼저 "서브넷 연결 편집"에서 연결을 해제해야 합니다.

  19. VPC 삭제

    모든 하위 리소스가 삭제되었으면 마지막으로 VPC를 삭제합니다. VPC 삭제 시 기본 라우트 테이블, 기본 보안 그룹, 기본 NACL이 함께 삭제됩니다.

    삭제 대상CIDR
    ShopEasy-VPC10.0.0.0/16
    VPC가 삭제 안 되면?

    VPC에 연결된 리소스가 남아 있으면 삭제할 수 없습니다. 오류 메시지를 확인하고 남은 리소스를 먼저 삭제하세요. 주요 원인: 네트워크 인터페이스(ENI), 보안 그룹, 서브넷, IGW 등이 아직 남아 있음.

    VPC 삭제: VPC → VPC → ShopEasy-VPC 선택 → 작업 → "VPC 삭제"

    삭제 확인 창에서 "삭제"를 입력합니다.

    오류 발생 시: 오류 메시지에 표시된 리소스 ID를 확인하고 해당 리소스를 먼저 삭제합니다.

최종 확인 - 모든 리소스 삭제 체크리스트

아래 체크리스트를 하나씩 확인하여 모든 리소스가 확실히 삭제되었는지 검증하세요. 하나라도 남아 있으면 과금이 발생할 수 있습니다.

  • GuardDuty - GuardDuty가 비활성화(삭제)되었다
  • CloudTrail - ShopEasy-Trail 트레일이 삭제되었다
  • CloudTrail S3 - 트레일 로그 전용 S3 버킷이 삭제되었다 (생성한 경우)
  • Secrets Manager - ShopEasy/DB-Credentials 시크릿이 삭제되었다
  • KMS - 커스텀 CMK 삭제가 예약되었다 (생성한 경우)
  • CloudWatch - 경보(ShopEasy-EC2-High-CPU)가 삭제되었다
  • CloudWatch - 대시보드(ShopEasy-Dashboard)가 삭제되었다
  • SNS - 주제(ShopEasy-Alerts)가 삭제되었다
  • NAT Gateway - ShopEasy-NAT이 삭제되었다 (상태: Deleted)
  • Elastic IP - NAT Gateway용 탄력적 IP가 해제되었다
  • RDS - 데이터베이스 인스턴스가 삭제되었다
  • RDS - DB 서브넷 그룹이 삭제되었다
  • EC2 - 인스턴스가 종료(Terminated)되었다
  • S3 - 이미지 버킷이 비워지고 삭제되었다
  • S3 - 프론트엔드 버킷이 비워지고 삭제되었다
  • DynamoDB - 테이블이 삭제되었다
  • IAM - 커스텀 정책이 삭제되었다
  • IAM - 역할이 삭제되었다
  • 보안 그룹 - EC2용, RDS용 보안 그룹이 삭제되었다
  • 인터넷 게이트웨이 - IGW가 분리 및 삭제되었다
  • 서브넷 - 4개 서브넷이 모두 삭제되었다
  • 라우트 테이블 - 퍼블릭/프라이빗 RT가 삭제되었다
  • VPC - ShopEasy-VPC가 삭제되었다
추가 확인: 비용 발생 여부 확인

모든 리소스를 삭제한 후 다음 날 AWS 비용 관리(Billing) 페이지에서 추가 비용이 발생하지 않는지 확인하세요. 만약 예상치 못한 비용이 보인다면, 삭제하지 못한 리소스가 있을 수 있습니다. 각 서비스 콘솔을 다시 확인해보세요.

실습을 마치며

축하합니다! 14개 챕터의 실습을 모두 완료했습니다. VPC 네트워크 구축부터 EC2, RDS, IAM, S3, DynamoDB, 프론트엔드 배포, 보안 그룹 최적화, IAM 최소 권한, S3 보안, KMS 암호화, Secrets Manager, CloudTrail, GuardDuty, 모니터링까지 ShopEasy 이커머스 앱을 AWS에 배포하고 보안을 강화하는 전체 과정을 경험했습니다. 이 경험을 바탕으로 실제 프로젝트에서도 자신감 있게 AWS 배포를 수행할 수 있을 것입니다.