AWS CLI를 사용해 연쇄 방식으로 AWS Route 53 Hosted Zone 삭제하는 방법
Source: Dev.to
AWS Route 53에서 호스티드 존을 삭제하는 것은 간단해 보이지만… 다음 오류가 발생할 때까지는 그렇지 않습니다:
The hosted zone contains non‑required resource record sets
AWS는 모든 비기본 레코드( NS와 SOA를 제외한 모든 레코드)를 먼저 제거하지 않으면 호스티드 존을 삭제하도록 허용하지 않습니다. 이 가이드는 AWS CLI를 사용하여 계단식(cascade) 방식으로 호스티드 존을 안전하게 삭제하는 방법을 보여줍니다.
왜 연쇄 삭제가 필요한가
호스티드 존을 생성하면 Route 53이 자동으로 생성합니다:
NS레코드SOA레코드
이 두 레코드는 필수이며 수동으로 삭제할 수 없습니다. 호스티드 존을 삭제하기 전에 다음을 수행해야 합니다:
- 모든 사용자 정의 레코드(
A,AAAA,CNAME,MX,TXT,ALIAS등)를 삭제합니다 NS와SOA만 남깁니다- 그런 다음 호스티드 존을 삭제합니다
사전 요구 사항
- AWS CLI v2가 설치됨
jq가 설치됨- IAM 권한:
route53:ListResourceRecordSetsroute53:ChangeResourceRecordSetsroute53:DeleteHostedZoneroute53: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→ 호스티드 존 IDtraced→ 선택적 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를 사용하여 NS 및 SOA 필터링
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 인프라를 많이 다루는 경우, 이 작은 스크립트가 큰 불편을 줄여줄 것입니다.