View a markdown version of this page

Migre registros de DNS em massa para uma zona hospedada privada do Amazon Route 53 - Recomendações da AWS

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Migre registros de DNS em massa para uma zona hospedada privada do Amazon Route 53

Ram Kandaswamy, Amazon Web Services

Resumo

Esse padrão automatiza a migração em massa de registros DNS para uma zona hospedada do Amazon Route 53. Ele usa um script Python com o AWS SDK for Python (Boto3) para ler dados de registro de um arquivo JSON armazenado no Amazon Simple Storage Service (Amazon S3) e criar os registros programaticamente usando a API Route 53.

Se seu sistema de origem exporta arquivos de zona BIND padrão, o recurso de importação nativa do Route 53 ou cli53 (uma ferramenta CLI de código aberto mantida pela comunidade e não afiliada) pode lidar AWS com a migração sem scripts personalizados. No entanto, em muitos ambientes corporativos, os registros DNS residem em planilhas do Excel em vez de arquivos de zona. As exportações do Excel geralmente contêm problemas de qualidade de dados, como espaços não separáveis e caracteres Unicode, que as ferramentas de importação padrão não tratam. Esse padrão resolve essa lacuna: ele lê do Excel e limpa os dados para criar registros de ponta a ponta.

Use esse padrão quando precisar migrar um grande número de registros DNS de um sistema existente para uma zona hospedada do Route 53 sem criar cada registro manualmente por meio do console.

Pré-requisitos e limitações

Pré-requisitos

  • Uma conta AWS ativa

  • Uma planilha do Excel que contém registros de zona hospedada com colunas para nome de domínio totalmente qualificado (FQDN), tipo de registro, tempo de vida (TTL) e valor

  • Python 3.12 ou posterior (consulte Baixar Python)

  • A biblioteca Python pandas instalada () pip3 install pandas

  • Familiaridade com os tipos de registro DNS, como registros A, NAPTR e SRV (consulte Tipos de registro DNS compatíveis)

  • Familiaridade com a linguagem Python e suas bibliotecas

Limitações

  • Esse padrão não usa todas as propriedades disponíveis da chamada de change_resource_record_sets API. Estenda o código conforme necessário para seu caso de uso.

  • Na planilha do Excel, o valor em cada linha é considerado exclusivo. Espera-se que vários valores para cada FQDN apareçam na mesma linha. Se esse não for o caso, modifique o código para concatenar vários valores para o mesmo FQDN.

  • Esse padrão chama a API do Route 53 diretamente usando o Boto3. Você pode aprimorar o código para usar um AWS CloudFormation wrapper para os update_stack comandos create_stack e e usar os valores JSON para preencher os recursos do modelo.

  • Se seu sistema de origem puder exportar registros no formato de arquivo de zona BIND, considere usar o recurso de importação do Route 53.

  • Alguns AWS serviços não estão disponíveis em todos Regiões da AWS. Para ver a disponibilidade da região, consulte AWSos serviços por região. Para endpoints específicos, consulte a página Cotas e endpoints de serviços e clique no link correspondente ao serviço desejado.

Arquitetura

  1. O usuário carrega uma planilha do Excel com dados de registro DNS em um bucket do Amazon S3.

  2. Um script Python executado localmente (ou em um IDE como o Kiro) lê o arquivo JSON do bucket do Amazon S3 usando o Boto3.

  3. O script processa os registros e chama a operação da change_resource_record_sets API do Route 53 para criar registros na zona hospedada.

Ferramentas

Serviços da AWS

  • Route 53 — Fornece a zona hospedada onde os registros DNS são criados. Esse padrão usa as operações de change_resource_record_sets API create_hosted_zone e.

  • Amazon S3 — armazena o arquivo JSON que contém os dados do registro DNS a serem migrados.

Outras ferramentas

  • Kiro — Um IDE com recursos de IA agentes, usado para desenvolver e executar o script de migração do Python. Para obter mais informações, consulte Kiro.

  • pandas — Uma biblioteca de análise de dados do Python, usada para converter a planilha do Excel para o formato JSON.

Práticas recomendadas

  • Teste com um pequeno subconjunto de 5 a 10 registros antes de executar o script em todos os registros para verificar a formatação dos dados e a criação correta do registro.

  • Use a UPSERT ação em vez deCREATE. A UPSERT ação cria um registro se ele não existir ou o atualiza se existir. Isso torna o script idempotente e seguro para ser executado novamente.

  • Batch suas alterações em lotes para permanecer dentro dos limites da ChangeResourceRecordSets solicitação. Quando você usa a UPSERT ação, cada ResourceRecord elemento conta duas vezes para o máximo de 1.000 elementos.

  • Valide os dados antes da inserção. Verifique se os FQDNs terminam com um ponto (.), se os valores TTL são números inteiros positivos e se os tipos de registro correspondem aos tipos de registro DNS compatíveis.

  • Faça backup dos registros existentes antes de fazer alterações em massa. Exporte os registros atuais da zona hospedada usando list_resource_record_sets para fornecer um ponto de reversão.

  • Implemente a lógica de repetição com recuo exponencial para lidar com os limites de taxa da API Route 53. Para obter mais informações, consulte Tentativas de erro e recuo exponencial em. AWS

  • Respeite o princípio de privilégio mínimo, garantindo somente as permissões estritamente necessárias para a execução de uma tarefa. Para obter mais informações, consulte Conceder privilégios mínimos e melhores práticas de segurança na documentação AWS Identity and Access Management (IAM).

Épicos

TarefaDescriptionHabilidades necessárias

Crie um arquivo Excel para seus registros.

  1. Exporte registros do seu sistema DNS atual.

  2. Crie uma planilha do Excel com estas colunas:FqdnName,, RecordTypeValue,TTL.

  3. Para registros NAPTR e SRV, use a função CONCAT do Excel para combinar vários valores de propriedades na coluna. Value

  4. Verifique se cada FQDN termina com um ponto (.) e se os valores TTL são números inteiros positivos.

Exemplo de linha:

FqdnName

RecordType

Valor

TTL

something.example.org

A

192.0.2.1

900

Engenheiro de dados

Converta os dados da planilha do Excel em JSON.

  1. Verifique se o Python 3.12 ou posterior está instalado executando python3 --version no terminal.

  2. Instale a biblioteca pandas executando pip3 install pandas --user no terminal.

  3. Crie um arquivo Python com o código a seguir para converter a planilha do Excel em JSON:

import pandas as pd data=pd.read_excel('./Book1.xls') data.to_json(path_or_buf='my.json',orient='records')
  1. Executar o script. Verifique se o arquivo de saída my.json contém os registros esperados.

Engenheiro de dados, desenvolvedor de Python

Faça upload do arquivo JSON em um bucket do Amazon S3.

  1. Crie um bucket do Amazon S3, caso ainda não exista um. Para obter mais informações, consulte Criar um bucket na documentação do Amazon S3.

  2. Faça o upload my.json do arquivo para o bucket.

Desenvolvedor de aplicativos
TarefaDescriptionHabilidades necessárias

Crie uma zona hospedada.

  1. Crie um arquivo Python com o código a seguir para criar uma zona hospedada. Substitua <hosted-zone-name><vpc-region>,, e <vpc-id> por seus valores.

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. Execute o script e anote o ID da zona hospedada na resposta.

Você também pode usar uma ferramenta de infraestrutura como código (IaC) AWS CloudFormation para substituir essas etapas por um modelo que cria uma pilha com os recursos e propriedades apropriados. Para obter mais informações, consulte AWS Route 53:: HostedZone na CloudFormation documentação.

Arquiteto de nuvem, administrador de rede, habilidades em Python

Leia os dados JSON do Amazon S3.

  1. Use esse código para ler do bucket do Amazon S3 e carregá-lo como um dicionário 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. Verifique se json_content contém os registros esperados imprimindo as primeiras entradas.

Desenvolvedor de aplicativos, desenvolvedor de Python

Limpe os valores dos dados e insira registros.

  1. Use esse código para limpar valores de dados e inserir registros na zona hospedada. <hosted-zone-id>Substitua pelo ID da zona hospedada configurada anteriormente.

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. Verifique se há erros na saída. Se ocorrer limitação, aumente o atraso ou implemente um recuo exponencial.

Desenvolvedor de aplicativos, habilidades em Python

Solução de problemas

ProblemaSolução

Erro PriorRequestNotComplete

Adicione um time.sleep() atraso de 1 a 2 segundos entre as change_resource_record_sets chamadas. O Route 53 processa as alterações de forma assíncrona, e uma alteração anterior ainda pode estar em andamento.

Erro InvalidChangeBatch

Esse erro ocorre quando você tenta criar um registro que já existe usando a CREATE ação. UPSERTEm vez disso, use para tornar o script idempotente.

Erro de limitação (limite de taxa excedido)

Você excedeu cinco solicitações de API por segundo. Implemente o recuo exponencial com instabilidade. Para obter mais informações, consulte Tentativas de erro e recuo exponencial em. AWS

Os registros não estão sendo resolvidos

Verifique se a VPC está associada à zona hospedada e se a resolução de DNS está ativada na VPC. Ambos enableDnsSupport e enableDnsHostnames devem ser configurados comotrue.

InvalidInputerro nos valores do registro

Os dados contêm espaços inseparáveis (\xa0) ou espaços em leading/trailing branco. Aplique o código de limpeza de dados da tarefa “Limpar valores de dados e inserir registros” antes da inserção.

Recursos relacionados

Referências

Tutoriais e vídeos

Design de DNS usando o Amazon Route 53 (vídeo)

Mais informações

Para registros NAPTR e SRV, o Value campo na planilha do Excel deve conter todos os componentes necessários concatenados em uma única string. Use a função CONCAT do Excel para combinar as propriedades individuais (ordem, preferência, sinalizadores, serviço, expressão regular, substituição do NAPTR; prioridade, peso, porta, destino para SRV) antes de exportar para JSON.

Se sua migração envolver mais de 1.000 registros, divida o arquivo JSON em lotes e processe cada lote separadamente para permanecer dentro dos limites da API do Route 53. Quando você usa a UPSERT ação, cada ResourceRecord elemento conta duas vezes para o máximo de 1.000 elementos por solicitação. ChangeResourceRecordSets

Anexos

Para acessar o conteúdo adicional associado a este documento, descompacte o seguinte arquivo: attachment.zip