View a markdown version of this page

DNS 레코드를 Amazon Route 53 프라이빗 호스팅 영역으로 대량 마이그레이션합니다. - 권장 가이드

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

DNS 레코드를 Amazon Route 53 프라이빗 호스팅 영역으로 대량 마이그레이션합니다.

Ram Kandaswamy, Amazon Web Services

요약

이 패턴은 DNS 레코드를 Amazon Route 53 호스팅 영역으로 대량 마이그레이션하는 작업을 자동화합니다. Python용 AWS SDK(Boto3)와 함께 Python 스크립트를 사용하여 Amazon Simple Storage Service(Amazon S3)에 저장된 JSON 파일에서 레코드 데이터를 읽고 Route 53 API를 사용하여 프로그래밍 방식으로 레코드를 생성합니다.

소스 시스템이 표준 BIND 영역 파일을 내보내는 경우 Route 53 네이티브 가져오기 기능 또는 cli53(커뮤니티에서 유지 관리하는 오픈 소스 CLI 도구로, 연결되지 않음 AWS)은 사용자 지정 스크립팅 없이 마이그레이션을 처리할 수 있습니다. 그러나 많은 엔터프라이즈 환경에서 DNS 레코드는 영역 파일이 아닌 Excel 워크시트에 있습니다. Excel 내보내기에는 표준 가져오기 도구가 처리하지 않는 중단되지 않는 공백 및 유니코드 문자와 같은 데이터 품질 문제가 포함되는 경우가 많습니다. 이 패턴은 Excel에서 읽고 데이터를 정리하여 end-to-end 레코드를 생성하는 격차를 해결합니다.

콘솔을 통해 각 레코드를 수동으로 생성하지 않고 기존 시스템의 많은 DNS 레코드를 Route 53 호스팅 영역으로 마이그레이션해야 하는 경우이 패턴을 사용합니다.

사전 조건 및 제한 사항

사전 조건 

  • 활성 상태의 AWS 계정

  • 정규화된 도메인 이름(FQDN), 레코드 유형, TTL(Time to Live) 및 값에 대한 열이 있는 호스팅 영역 레코드가 포함된 Excel 워크시트

  • Python 3.12 이상(Python 다운로드 참조)

  • pandas Python 라이브러리 설치됨(pip3 install pandas)

  • A, NAPTR 및 SRV 레코드와 같은 DNS 레코드 유형에 대한 지식(지원되는 DNS 레코드 유형 참조)

  • Python 언어 및 해당 라이브러리에 대한 지식

제한 사항

  • 이 패턴은 change_resource_record_sets API 호출에서 사용 가능한 모든 속성을 사용하지 않습니다. 사용 사례에 따라 코드를 확장합니다.

  • Excel 워크시트에서는 각 행의 값이 고유한 것으로 간주됩니다. 각 FQDN에 대해 여러 값이 동일한 행에 나타날 것으로 예상됩니다. 그렇지 않은 경우 동일한 FQDN에 대해 여러 값을 연결하도록 코드를 수정합니다.

  • 이 패턴은 Boto3를 사용하여 Route 53 API를 직접 호출합니다. Boto3 create_stackupdate_stack 명령에 AWS CloudFormation 래퍼를 사용하도록 코드를 개선하고 JSON 값을 사용하여 템플릿 리소스를 채울 수 있습니다.

  • 소스 시스템이 BIND 영역 파일 형식으로 레코드를 내보낼 수 있는 경우 Route 53 가져오기 기능을 대신 사용하는 것이 좋습니다.

  • 일부 AWS 서비스는 전혀 사용할 수 없습니다 AWS 리전. 리전 가용성은 AWS 리전별 서비스를 참조하세요. 구체적인 엔드포인트는 서비스 엔드포인트 및 할당량 페이지를 참조하고 서비스 링크를 선택합니다.

아키텍처

  1. 사용자는 DNS 레코드 데이터가 포함된 Excel 워크시트를 Amazon S3 버킷에 업로드합니다.

  2. 로컬에서(또는 Kiro와 같은 IDE에서) 실행되는 Python 스크립트는 Boto3를 사용하여 Amazon S3 버킷에서 JSON 파일을 읽습니다.

  3. 스크립트는 레코드를 처리하고 Route 53 change_resource_record_sets API 작업을 호출하여 호스팅 영역에 레코드를 생성합니다.

도구

서비스

  • Route 53 - DNS 레코드가 생성되는 호스팅 영역을  제공합니다. 이 패턴은 create_hosted_zonechange_resource_record_sets API 작업을 사용합니다.

  • Amazon S3 - 마이그레이션할 DNS 레코드 데이터가 포함된 JSON 파일을 저장합니다.

기타 도구

  • Kiro - Python 마이그레이션 스크립트를 개발하고 실행하는 데 사용되는 에이전트 AI 기능이 있는 IDE입니다. 자세한 내용은 Kiro를 참조하세요.

  • pandas - Excel 워크시트를 JSON 형식으로 변환하는 데 사용되는 Python 데이터 분석 라이브러리입니다.

모범 사례

  • 모든 레코드에 대해 스크립트를 실행하기 전에 5~10개의 레코드로 구성된 작은 하위 집합으로 테스트하여 데이터 형식을 확인하고 레코드 생성을 수정합니다.

  • 대신 UPSERT 작업을 사용합니다CREATE. UPSERT 작업이 없는 경우 레코드를 생성하고 없는 경우 레코드를 업데이트합니다. 이렇게 하면 스크립트가 멱등성이 있고 안전하게 다시 실행할 수 있습니다.

  • 변경 사항을 일괄 처리하여 ChangeResourceRecordSets 요청 한도 내에서 유지합니다. UPSERT 작업을 사용하면 각 ResourceRecord 요소가 최대 1,000개 요소에 두 번 포함됩니다.

  • 삽입 전에 데이터를 검증합니다. FQDNs 마침표(.)로 끝나는지, TTL 값이 양의 정수인지, 레코드 유형이 지원되는 DNS 레코드 유형과 일치하는지 확인합니다.

  • 대량으로 변경하기 전에 기존 레코드를 백업합니다. 를 사용하여 롤백 지점을 list_resource_record_sets 제공하여 현재 호스팅 영역 레코드를 내보냅니다.

  • 지수 백오프가 있는 재시도 로직을 구현하여 Route 53 API 속도 제한을 처리합니다. 자세한 내용은 오류 재시도 및 지수 백오프를 AWS 참조하세요.

  • 최소 권한 원칙을 따르고 작업을 수행하는 데 필요한 최소 권한을 부여하세요. 자세한 내용은 AWS Identity and Access Management (IAM) 설명서의 최소 권한 부여보안 모범 사례를 참조하세요.

에픽

작업설명필요한 기술

기록을 위한 Excel 파일을 만드세요.

  1. 현재 DNS 시스템에서 레코드를 내보냅니다.

  2. , FqdnName, RecordTypeValue, 열을 사용하여 Excel 워크시트를 생성합니다TTL.

  3. NAPTR 및 SRV 레코드의 경우 Excel의 CONCAT 함수를 사용하여 여러 속성 값을 Value 열에 결합합니다.

  4. 각 FQDN이 마침표(.)로 끝나고 TTL 값이 양의 정수인지 확인합니다.

행 예제:

FQDNName

RecordType

TTL

something.example.org

A

192.0.2.1

900

데이터 엔지니어

엑셀 워크시트 데이터를 JSON으로 변환합니다.

  1. 터미널python3 --version에서를 실행하여 Python 3.12 이상이 설치되어 있는지 확인합니다.

  2. 터미널pip3 install pandas --user에서를 실행하여 pandas 라이브러리를 설치합니다.

  3. 다음 코드를 사용하여 Python 파일을 생성하여 Excel 워크시트를 JSON으로 변환합니다.

import pandas as pd data=pd.read_excel('./Book1.xls') data.to_json(path_or_buf='my.json',orient='records')
  1. 스크립트 실행. 출력 파일에 예상 레코드가 my.json 포함되어 있는지 확인합니다.

데이터 엔지니어, Python 개발자

Amazon S3 버킷에 JSON 파일을 업로드합니다.

  1. Amazon S3 버킷이 아직 없는 경우 생성합니다. 자세한 내용은 Amazon S3 설명서의 버킷 생성을 참조하십시오.

  2. my.json 파일을 버킷에 업로드합니다.

앱 개발자
작업설명필요한 기술

호스팅 영역 생성.

  1. 다음 코드를 사용하여 Python 파일을 생성하여 호스팅 영역을 생성합니다. <hosted-zone-name>, <vpc-region><vpc-id>를 값으로 바꿉니다.

import boto3 import random hostedZoneName ="xxx" vpcRegion = "us-east-1" vpcId="vpc-xxxx" route53_client = boto3.client('route53') response = route53_client.create_hosted_zone( Name= hostedZoneName, VPC={ 'VPCRegion': vpcRegion, 'VPCId': vpcId }, CallerReference=str(random.random()*100000), HostedZoneConfig={ 'Comment': "private hosted zone created by automation", 'PrivateZone': True } ) print(response)
  1. 스크립트를 실행하고 응답의 호스팅 영역 ID를 기록해 둡니다.

와 같은 코드형 인프라(IaC) 도구를 사용하여 이러한 단계를 적절한 리소스 및 속성을 사용하여 스택을 생성하는 템플릿으로 AWS CloudFormation 바꿀 수도 있습니다. 자세한 내용은 CloudFormation 설명서의 AWS Route 53::HostedZone을 참조하세요.

클라우드 아키텍트, 네트워크 관리자, Python 스킬

Amazon S3에서 JSON 데이터를 읽습니다.

  1. 이 코드를 사용하여 Amazon S3 버킷에서 읽고 Python 사전으로 로드합니다. 

import json import boto3 s3_client = boto3.client('s3') fileobj = s3_client.get_object( Bucket='<your-bucket-name>', Key='my.json' ) filedata = fileobj['Body'].read() contents = filedata.decode('utf-8') json_content = json.loads(contents)
  1. 처음 몇 개의 항목을 인쇄하여에 예상 레코드가 json_content 포함되어 있는지 확인합니다.

앱 개발자, Python 개발자

데이터 값을 정리하고 레코드를 삽입합니다.

  1. 이 코드를 사용하여 데이터 값을 정리하고 호스팅 영역에 레코드를 삽입합니다. 를 이전에 구성된 호스팅 영역의 ID<hosted-zone-id>로 바꿉니다.

import unicodedata import time for item in json_content: fqn_name = unicodedata.normalize( "NFKD", item["FqdnName"].replace("u'", "'").replace('\xa0', '').strip() ) rec_type = item["RecordType"].replace('\xa0', '').strip() res_rec = {'Value': item["Value"].replace('\xa0', '').strip()} change_response = route53_client.change_resource_record_sets( HostedZoneId='<hosted-zone-id>', ChangeBatch={ 'Comment': 'Created by automation', 'Changes': [ { 'Action': 'UPSERT', 'ResourceRecordSet': { 'Name': fqn_name, 'Type': rec_type, 'TTL': item["TTL"], 'ResourceRecords': [res_rec] } } ] } ) time.sleep(1) # Delay to avoid PriorRequestNotComplete errors
  1. 출력을 모니터링하여 오류가 있는지 확인합니다. 제한이 발생하면 지연을 늘리거나 지수 백오프를 구현합니다.

앱 개발자, Python 기술

문제 해결

문제Solution

PriorRequestNotComplete 오류

change_resource_record_sets 호출 사이에 1~2초의 time.sleep() 지연 시간을 추가합니다. Route 53는 변경 사항을 비동기적으로 처리하며 이전 변경 사항은 계속 진행 중일 수 있습니다.

InvalidChangeBatch 오류

이 오류는 CREATE 작업을 사용하여 이미 존재하는 레코드를 생성하려고 할 때 발생합니다. UPSERT 대신를 사용하여 스크립트를 멱등성으로 만듭니다.

조절 오류(속도 제한 초과)

초당 5개의 API 요청을 초과했습니다. 지터를 사용하여 지수 백오프를 구현합니다. 자세한 내용은 오류 재시도 및 지수 백오프를 AWS 참조하세요.

레코드가 해결되지 않음

VPC가 호스팅 영역과 연결되어 있고 VPC에서 DNS 확인이 활성화되어 있는지 확인합니다. enableDnsSupport 및 모두 로 설정해야 enableDnsHostnames 합니다true.

InvalidInput 레코드 값에 대한 오류

데이터에는 중단되지 않는 공백(\xa0) 또는 선행/후행 공백이 포함됩니다. 삽입 전에 "데이터 값 정리 및 레코드 삽입" 작업의 데이터 정리 코드를 적용합니다.

관련 리소스

참조

자습서 및 동영상

Amazon Route 53을 사용한 DNS 설계(비디오)

추가 정보

NAPTR 및 SRV 레코드의 경우 Excel 워크시트의 Value 필드에는 단일 문자열로 연결된 모든 필수 구성 요소가 포함되어야 합니다. JSON으로 내보내기 전에 Excel의 CONCAT 함수를 사용하여 개별 속성(주문, 기본 설정, 플래그, 서비스, regexp, NAPTR 대체, 우선 순위, 가중치, 포트, SRV 대상)을 결합합니다.

마이그레이션에 1,000개 이상의 레코드가 포함된 경우 JSON 파일을 배치로 분할하고 각 배치를 개별적으로 처리하여 Route 53 API 제한 내에서 유지합니다. UPSERT 작업을 사용할 때 각 ResourceRecord 요소는 ChangeResourceRecordSets 요청당 최대 1,000개의 요소 수에 두 번 포함됩니다.

첨부

이 문서와 관련된 추가 콘텐츠에 액세스하려면 attachment.zip 파일의 압축을 풉니다.