AWS CLI를 사용해 연쇄 방식으로 AWS Route 53 Hosted Zone 삭제하는 방법

발행: (2026년 2월 28일 오후 02:12 GMT+9)
6 분 소요
원문: Dev.to

Source: Dev.to

AWS Route 53에서 호스티드 존을 삭제하는 것은 간단해 보이지만… 다음 오류가 발생할 때까지는 그렇지 않습니다:

The hosted zone contains non‑required resource record sets

AWS는 모든 비기본 레코드( NSSOA를 제외한 모든 레코드)를 먼저 제거하지 않으면 호스티드 존을 삭제하도록 허용하지 않습니다. 이 가이드는 AWS CLI를 사용하여 계단식(cascade) 방식으로 호스티드 존을 안전하게 삭제하는 방법을 보여줍니다.

왜 연쇄 삭제가 필요한가

호스티드 존을 생성하면 Route 53이 자동으로 생성합니다:

  • NS 레코드
  • SOA 레코드

이 두 레코드는 필수이며 수동으로 삭제할 수 없습니다. 호스티드 존을 삭제하기 전에 다음을 수행해야 합니다:

  • 모든 사용자 정의 레코드(A, AAAA, CNAME, MX, TXT, ALIAS 등)를 삭제합니다
  • NSSOA만 남깁니다
  • 그런 다음 호스티드 존을 삭제합니다

사전 요구 사항

  • AWS CLI v2가 설치됨
  • jq가 설치됨
  • IAM 권한:
    • route53:ListResourceRecordSets
    • route53:ChangeResourceRecordSets
    • route53:DeleteHostedZone
    • route53:GetHostedZone

캐스케이드 삭제 스크립트

delete-hosted-zone-cascade.sh 라는 파일을 만들고 아래 스크립트를 붙여넣으세요:

#!/bin/bash

# ==========================================
# Script: delete-hosted-zone-cascade.sh
# Description:
#   Deletes all record sets in a Route53
#   hosted zone and then deletes the zone.
# ==========================================

set -euo pipefail

HOSTED_ZONE_ID="$1"
AWS_PROFILE="${2:-default}"

if [[ -z "$HOSTED_ZONE_ID" ]]; then
  echo "Usage: $0 <hosted_zone_id> [aws_profile]"
  exit 1
fi

echo "Using AWS Profile: $AWS_PROFILE"
echo "Target Hosted Zone: $HOSTED_ZONE_ID"

# Step 1: Get hosted zone name
ZONE_NAME=$(aws route53 get-hosted-zone \
  --id "$HOSTED_ZONE_ID" \
  --profile "$AWS_PROFILE" \
  --query 'HostedZone.Name' \
  --output text)

echo "Hosted Zone Name: $ZONE_NAME"

# Step 2: Fetch all record sets except default NS & SOA
echo "Fetching record sets..."

aws route53 list-resource-record-sets \
  --hosted-zone-id "$HOSTED_ZONE_ID" \
  --profile "$AWS_PROFILE" \
  --output json \
| jq '
  .ResourceRecordSets
  | map(select(.Type != "NS" and .Type != "SOA"))
  | map({
      Action: "DELETE",
      ResourceRecordSet: .
    })
  | {Changes: .}
' > changes.json

COUNT=$(jq '.Changes | length' changes.json)

if [[ "$COUNT" -eq 0 ]]; then
  echo "No non‑default records found."
else
  echo "Deleting $COUNT record sets..."

  aws route53 change-resource-record-sets \
    --hosted-zone-id "$HOSTED_ZONE_ID" \
    --change-batch file://changes.json \
    --profile "$AWS_PROFILE"

  sleep 10
fi

# Step 3: Delete hosted zone
echo "Deleting hosted zone..."

aws route53 delete-hosted-zone \
  --id "$HOSTED_ZONE_ID" \
  --profile "$AWS_PROFILE"

echo "Hosted zone $HOSTED_ZONE_ID deleted successfully."

rm -f changes.json

사용 방법

스크립트를 실행 가능하게 만들기:

chmod +x delete-hosted-zone-cascade.sh

실행:

./delete-hosted-zone-cascade.sh Z123456ABCDEFG traced
  • Z123456ABCDEFG → 호스티드 존 ID
  • traced → 선택적 AWS CLI 프로파일 (기본값은 default)

스크립트가 수행하는 작업 (단계별)

1️⃣ 호스티드 존 정보 가져오기

aws route53 get-hosted-zone --id "$HOSTED_ZONE_ID"

2️⃣ 모든 레코드 세트 나열

aws route53 list-resource-record-sets --hosted-zone-id "$HOSTED_ZONE_ID"

3️⃣ jq를 사용하여 NSSOA 필터링

NS가 아니고 SOA가 아닌 레코드만 삭제 작업으로 변환됩니다.

4️⃣ 배치 삭제 제출

aws route53 change-resource-record-sets \
  --hosted-zone-id "$HOSTED_ZONE_ID" \
  --change-batch file://changes.json

5️⃣ 호스티드 존 삭제

aws route53 delete-hosted-zone --id "$HOSTED_ZONE_ID"

중요 사항

  • 이 작업은 모든 DNS 레코드를 영구적으로 삭제합니다; 작업은 되돌릴 수 없습니다.
  • DNSSEC가 활성화된 경우, 스크립트를 실행하기 전에 비활성화하십시오.
  • 프라이빗 호스티드 존의 경우, VPC 연관이 적절히 처리되었는지 확인하십시오.

언제 유용한가?

  • 임시 환경의 CI/CD 정리
  • 일시적인 테스트 스택 파괴
  • Terraform 드리프트 수정
  • 다중 계정 마이그레이션
  • 전체 AWS 조직 계정 폐기

Production Hardening Ideas

  • 진행하기 전에 확인 프롬프트를 추가합니다.
  • aws route53 get-change를 사용하여 변경 상태를 기다립니다.
  • 삭제 작업을 파일이나 모니터링 시스템에 기록합니다.
  • 삭제를 미리 보기 위해 --dry-run 모드를 구현합니다.
  • 레코드가 많은 존에 대해 페이지네이션을 처리합니다.

최종 생각

Amazon Route 53에서 DNS 레코드를 수동으로 삭제하는 것은 번거롭고 오류가 발생하기 쉽습니다. 연쇄 삭제를 자동화하면:

  • 시간을 절약합니다
  • 실수를 방지합니다
  • 계정 정리를 예측 가능하게 합니다
  • 자동화 파이프라인에 자연스럽게 통합됩니다

AWS 인프라를 많이 다루는 경우, 이 작은 스크립트가 큰 불편을 줄여줄 것입니다.

0 조회
Back to Blog

관련 글

더 보기 »