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

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

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

작성자: Ram Kandaswamy(AWS)

환경: 프로덕션

기술: 네트워킹;; 인프라 CloudNative DevOps

AWS 서비스: AWS Cloud9, Amazon Route 53, Amazon S3

요약

네트워크 엔지니어와 클라우드 관리자는 Amazon Route 53의 프라이빗 호스팅 영역에 도메인 이름 시스템(DNS) 레코드를 추가할 수 있는 효율적이고 간단한 방법이 필요합니다. 수동 접근 방식을 사용하여 Microsoft Excel 워크시트의 항목을 Route 53 콘솔의 적절한 위치로 복사하는 것은 번거롭고 오류가 발생하기 쉽습니다. 이 패턴은 여러 레코드를 추가하는 데 필요한 시간과 노력을 줄이는 자동화된 접근 방식을 설명합니다. 또한 여러 호스팅 영역을 생성할 수 있는 반복 가능한 일련의 단계를 제공합니다.

이 패턴은 개발 및 테스트에는 AWS Cloud9 통합 개발 환경(IDE)을 사용하고 레코드를 저장하기 위해 Amazon Simple Storage Service(S3)를 사용합니다. 데이터를 효율적으로 처리하기 위해 패턴은 단순하고 Python 사전 (dict 데이터 유형) 을 지원하는 기능 때문에 JSON 형식을 사용합니다.

참고: 시스템에서 영역 파일을 생성할 수 있다면 Route 53 가져오기 기능을 대신 사용해 보십시오.

사전 조건 및 제한 사항

사전 조건 

  • 프라이빗 호스팅 영역 레코드가 포함된 Excel 워크시트

  • A 레코드, NAPTR (이름 기관 포인터) 레코드, SRV 레코드와 같은 다양한 유형의 DNS 레코드에 대한 지식 (지원되는 DNS 레코드 유형 참조)

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

제한 사항

  • 이 패턴은 모든 사용 사례 시나리오에 대한 광범위한 범위를 제공하지는 않습니다. 예를 들어 change_resource_record_sets 호출은 API의 사용 가능한 모든 속성을 사용하지 않습니다.

  • Excel 워크시트에서는 각 행의 값이 고유한 것으로 간주됩니다. 각 FQDN(Fulalified Domain Name)에 대한 여러 값이 동일한 행에 표시될 것으로 예상됩니다. 그렇지 않은 경우 이 패턴에 제공된 코드를 수정하여 필요한 연결을 수행해야 합니다.

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

아키텍처

기술 스택

  • 트래픽 라우팅을 위한 Route 53 프라이빗 호스팅 영역

  • 개발 및 테스트를 위한 AWS Cloud9 IDE

  • 출력 JSON 파일을 저장하기 위한 Amazon S3

DNS 레코드를 Route 53 프라이빗 호스팅 영역으로 대량으로 마이그레이션하기 위한 워크플로.

워크플로는 이전 다이어그램에 나와 있고 에픽 섹션에서 설명한 대로 다음 단계로 구성됩니다.

  1. 레코드 세트 정보가 있는 Excel 워크시트를 S3 버킷에 업로드합니다.

  2. Excel 데이터를 JSON 형식으로 변환하는 Python 스크립트를 만들고 실행합니다.

  3. S3 버킷에서 레코드를 읽고 데이터를 정리합니다.

  4. 프라이빗 호스팅 영역에서 레코드 세트를 생성합니다.

도구

  • Route 53 — Amazon Route 53은 도메인 등록, DNS 라우팅 및 상태 확인을 처리하는 가용성과 확장성이 뛰어난 DNS 웹 서비스입니다.

  • AWS Cloud9 – AWS Cloud9은 여러 프로그래밍 언어와 런타임 디버거, 내장 터미널을 지원하여 풍부한 코드 편집 환경을 제공하는 IDE입니다. 소프트웨어를 코딩, 빌드, 실행, 테스트 및 디버깅하기 위한 도구 모음을 갖추고 있으며 클라우드에 소프트웨어를 릴리스하는 데에도 도움이 됩니다.

  • Amazon S3-Amazon Simple Storage Service(S3)는 객체 스토리지 서비스입니다. Amazon S3를 사용하면 인터넷을 통해 언제 어디서든 원하는 양의 데이터를 저장하고 검색할 수 있습니다.

에픽

작업설명필요한 기술

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

현재 시스템에서 내보낸 레코드를 사용하여 FQDN (정규화된 도메인 이름), 레코드 유형, TTL (TTL), 값 등 레코드에 필요한 열이 있는 Excel 워크시트를 만드십시오. NAPTR 및 SRV 레코드의 경우 값은 여러 속성의 조합이므로 Excel의 concat 방법을 사용하여 이러한 속성을 결합하십시오.

FqdnName

RecordType

TTL

something.example.org

A

1.1.1.1

900

데이터 엔지니어, 엑셀 스킬

작업 환경을 확인하세요.

AWS Cloud9 IDE에서 Python 파일을 생성하여 엑셀 입력 워크시트를 JSON 형식으로 변환합니다. (AWS Cloud9 대신 SageMaker Amazon 노트북을 사용하여 Python 코드로 작업할 수도 있습니다.)

사용 중인 Python 버전이 버전 3.7 이상인지 확인하십시오.

python3 --version

pandas 패키지를 설치합니다.

pip3 install pandas --user
일반 AWS

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

Excel에서 JSON으로 변환하는 다음 코드가 포함된 Python 파일을 생성합니다.

import pandas as pd data=pd.read_excel('./Book1.xls') data.to_json(path_or_buf='my.json',orient='records')

여기서 Book1은(는) Excel 워크시트의 이름이고 my.json은(는) 출력 JSON 파일의 이름입니다.

데이터 엔지니어, Python 스킬

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

my.json 파일을 S3 버킷에 업로드합니다. 자세한 내용은 Amazon S3 설명서의 버킷 생성을 참조하세요.

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

프라이빗 호스팅 영역을 생성합니다.

create_hosted_zone API와 다음 Python 샘플 코드를 사용하여 프라이빗 호스팅 영역을 생성합니다. 파라미터 hostedZoneName, vpcRegionvpcId를 사용자의 값으로 바꿉니다.

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)

또한 CloudFormation AWS와 같은 IaC (코드형 인프라) 도구를 사용하여 이러한 단계를 적절한 리소스 및 속성으로 스택을 생성하는 템플릿으로 대체할 수 있습니다.

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

Amazon S3에서 세부 정보를 사전으로 검색합니다.

다음 코드를 사용하여 S3 버킷에서 읽고 JSON 값을 Python 사전으로 가져옵니다. 

fileobj = s3_client.get_object( Bucket=bucket_name, Key='my.json' ) filedata = fileobj['Body'].read() contents = filedata.decode('utf-8') json_content=json.loads(contents) print(json_content)

json_content은(는) Python 사전이 들어 있습니다.

앱 개발자, Python 기술

공백 및 유니코드 문자의 데이터 값을 정리합니다.

데이터의 정확성을 보장하기 위한 안전 조치로 다음 코드를 사용하여 json_content의 값에 대해 제거 작업을 수행하십시오. 이 코드는 각 문자열의 앞과 끝에 있는 공백 문자를 제거합니다. 또한 replace 메서드를 사용하여 고정된 (끊어지지 않는) 공백 (\xa0 문자) 을 제거합니다.

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() }
앱 개발자, Python 기술

레코드를 삽입합니다.

이전 for 루프의 일부로 다음 코드를 사용합니다.

change_response = route53_client.change_resource_record_sets( HostedZoneId="xxxxxxxx", ChangeBatch={ 'Comment': 'Created by automation', 'Changes': [ { 'Action': 'UPSERT', 'ResourceRecordSet': { 'Name': fqn_name, 'Type': rec_type, 'TTL': item["TTL"], 'ResourceRecords': res_rec } } ] } )

이 에픽의 첫 번째 단계에 있는 호스팅 영역 xxxxxxx ID는 어디에 있습니까?

앱 개발자, Python 기술

관련 리소스

참조

자습서 및 동영상