View a markdown version of this page

Migración de registros DNS de forma masiva a una zona alojada privada de Amazon Route 53 - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Migración de registros DNS de forma masiva a una zona alojada privada de Amazon Route 53

Ram Kandaswamy, Amazon Web Services

Resumen

Este patrón automatiza la migración masiva de registros DNS a una zona alojada en Amazon Route 53. Utiliza un script de Python con el AWS SDK para Python (Boto3) para leer los datos de los registros de un archivo JSON almacenado en Amazon Simple Storage Service (Amazon S3) y crear los registros mediante programación mediante la API de Route 53.

Si su sistema de origen exporta archivos de zona BIND estándar, la función de importación nativa de Route 53 o cli53 (una herramienta CLI de código abierto mantenida por la comunidad y a la que no está AWS afiliada) pueden gestionar la migración sin necesidad de crear scripts personalizados. Sin embargo, en muchos entornos empresariales, los registros de DNS se encuentran en hojas de cálculo de Excel y no en archivos de zona. Las exportaciones de Excel suelen contener problemas de calidad de los datos, como espacios que no se dividen y caracteres Unicode, que las herramientas de importación estándar no resuelven. Este patrón corrige ese vacío: lee datos de Excel y limpia los datos para crear registros de principio a fin.

Utilice este patrón cuando necesite migrar una gran cantidad de registros DNS de un sistema existente a una zona alojada de Route 53 sin tener que crear cada registro manualmente a través de la consola.

Requisitos previos y limitaciones

Requisitos previos 

  • Una cuenta de AWS activa

  • Hoja de cálculo de Excel que contiene registros de zonas alojadas con columnas para el nombre de dominio completo (FQDN), el tipo de registro, el tiempo de vida (TTL) y el valor

  • Python 3.12 o posterior (consulte Descargar Python)

  • La biblioteca Python de pandas instalada () pip3 install pandas

  • Familiaridad con los tipos de registros DNS, como los registros A, NAPTR y SRV (consulte Tipos de registros DNS compatibles)

  • Familiaridad con el lenguaje Python y sus bibliotecas

Limitaciones

  • Este patrón no utiliza todas las propiedades disponibles de la llamada a la change_resource_record_sets API. Amplíe el código según sea necesario para su caso de uso.

  • En la hoja de cálculo de Excel, se supone que el valor de cada fila es único. Se espera que aparezcan varios valores para cada FQDN en la misma fila. Si no es así, modifique el código para concatenar varios valores para el mismo FQDN.

  • Este patrón llama directamente a la API de Route 53 mediante Boto3. Puede mejorar el código para utilizar un AWS CloudFormation contenedor para los update_stack comandos create_stack y, además, utilizar los valores de JSON para rellenar los recursos de la plantilla.

  • Si su sistema de origen puede exportar registros en formato de archivo de zona BIND, considere utilizar la función de importación de Route 53 en su lugar.

  • Algunos AWS servicios no están disponibles en todos Regiones de AWS. Para conocer la disponibilidad regional, consulta AWSlos servicios por región. Para ver los puntos de conexión específicos, consulte la página Service endpoints and quotas y elija el enlace del servicio.

Arquitectura

  1. El usuario carga una hoja de cálculo de Excel con los datos del registro de DNS en un bucket de Amazon S3.

  2. Un script de Python que se ejecuta localmente (o en un IDE como Kiro) lee el archivo JSON del bucket de Amazon S3 mediante Boto3.

  3. El script procesa los registros y llama a la operación de la change_resource_record_sets API de Route 53 para crear registros en la zona alojada.

Tools (Herramientas)

Servicios de AWS

  • Route 53: proporciona la zona hospedada donde se crean los registros DNS. Este patrón utiliza las operaciones create_hosted_zone y change_resource_record_sets API.

  • Amazon S3: almacena el archivo JSON que contiene los datos del registro DNS que se van a migrar.

Otras herramientas

  • Kiro: un IDE con capacidades de inteligencia artificial para agentes, que se utiliza para desarrollar y ejecutar el script de migración de Python. Para obtener más información, consulte Kiro.

  • pandas: una biblioteca de análisis de datos de Python que se utiliza para convertir la hoja de trabajo de Excel al formato JSON.

Prácticas recomendadas

  • Pruebe con un pequeño subconjunto de 5 a 10 registros antes de ejecutar el script en todos los registros para comprobar el formato de los datos y corregir la creación de registros.

  • Utilice la UPSERT acción en lugar de. CREATE La UPSERT acción crea un registro si no existe o lo actualiza si existe. Esto hace que el script sea idempotente y seguro para volver a ejecutarlo.

  • Batch tus cambios para mantenerlos dentro de los límites de las ChangeResourceRecordSets solicitudes. Cuando usas la UPSERT acción, cada ResourceRecord elemento cuenta dos veces para alcanzar el máximo de 1000 elementos.

  • Valide los datos antes de insertarlos. Compruebe que los FQDN terminan con un punto (.), que los valores TTL son enteros positivos y que los tipos de registro coinciden con los tipos de registros DNS admitidos.

  • Realice una copia de seguridad de los registros existentes antes de realizar cambios masivos. Exporte los registros de la zona alojada actual utilizándolos list_resource_record_sets para proporcionar un punto de reversión.

  • Implemente una lógica de reintentos con un retraso exponencial para gestionar los límites de velocidad de las API de Route 53. Para obtener más información, consulte Reintentos de error y retrocesos exponenciales en. AWS

  • Siga el principio de privilegio mínimo y conceda los permisos mínimos necesarios para llevar a cabo una tarea. Para obtener más información, consulte las mejores prácticas de seguridad y conceder privilegios mínimos en la documentación AWS Identity and Access Management (IAM).

Epics

TareaDescripciónHabilidades requeridas

Cree un archivo de Excel para sus registros.

  1. Exporte los registros de su sistema DNS actual.

  2. Cree una hoja de cálculo de Excel con estas columnas: FqdnNameRecordType,,Value,TTL.

  3. Para los registros NAPTR y SRV, utilice la función CONCAT de Excel para combinar varios valores de propiedades en la columna. Value

  4. Compruebe que cada FQDN termine con un punto (.) y que los valores TTL sean enteros positivos.

Fila de ejemplo:

FqdnName

RecordType

Valor

TTL

something.example.org

A

192.0.2.1

900

Ingeniero de datos

Convierta los datos de la hoja de cálculo de Excel a JSON.

  1. Compruebe que Python 3.12 o posterior esté instalado ejecutándolo python3 --version en el terminal.

  2. Instala la biblioteca de pandas ejecutándola pip3 install pandas --user en la terminal.

  3. Cree un archivo Python con el siguiente código para convertir la hoja de cálculo de Excel a JSON:

import pandas as pd data=pd.read_excel('./Book1.xls') data.to_json(path_or_buf='my.json',orient='records')
  1. Ejecute el script. Compruebe que el archivo de salida my.json contiene los registros esperados.

Ingeniero de datos, desarrollador de Python

Cargue el archivo JSON en un bucket de Amazon S3.

  1. Cree un bucket de Amazon S3 si aún no existe uno. Para obtener más información, consulte Crear un bucket en la documentación de Amazon S3.

  2. Sube el my.json archivo al bucket.

Desarrollador de aplicaciones
TareaDescripciónHabilidades requeridas

Cree una zona alojada.

  1. Cree un archivo Python con el siguiente código para crear una zona alojada. Reemplace <hosted-zone-name><vpc-region>, y <vpc-id> con sus 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. Ejecute el script y anote el ID de la zona hospedada de la respuesta.

También puede utilizar una herramienta de infraestructura como código (IaC), por ejemplo, AWS CloudFormation para reemplazar estos pasos por una plantilla que cree una pila con los recursos y propiedades adecuados. Para obtener más información, consulte AWS Route 53:: HostedZone en la CloudFormation documentación.

Ingeniero en la nube, administrador de redes, con habilidades de Python

Lea los datos de JSON de Amazon S3.

  1. Utilice este código para leer el bucket de Amazon S3 y cargarlo como un diccionario de 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. Compruebe que json_content contiene los registros esperados imprimiendo las primeras entradas.

Desarrollador de aplicaciones, desarrollador de Python

Limpie los valores de los datos e inserte registros.

  1. Utilice este código para limpiar los valores de los datos e insertar registros en la zona alojada. <hosted-zone-id>Sustitúyalo por el ID de la zona alojada 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. Monitorice la salida en busca de errores. Si se produce una limitación, aumente el retraso o implemente un retroceso exponencial.

Desarrollador de aplicaciones, con conocimientos de Python

Resolución de problemas

ProblemaSolución

Error PriorRequestNotComplete

Añada un time.sleep() retraso de 1 a 2 segundos entre llamadas. change_resource_record_sets Route 53 procesa los cambios de forma asíncrona y es posible que aún se esté realizando un cambio anterior.

Error InvalidChangeBatch

Este error se produce al intentar crear un registro que ya existe mediante la acción. CREATE Úselo UPSERT en su lugar para hacer que el script sea idempotente.

Error de regulación (se ha superado el límite de velocidad)

Has superado las cinco solicitudes de API por segundo. Implemente un retroceso exponencial con fluctuación de fase. Para obtener más información, consulte Reintentos de error y retroceso exponencial en. AWS

Los registros no se resuelven

Compruebe que la VPC esté asociada a la zona alojada y que la resolución de DNS esté habilitada en la VPC. Ambos enableDnsSupport y enableDnsHostnames deben estar configurados en. true

InvalidInputerror en los valores de registro

Los datos contienen espacios ininterrumpidos (\xa0) o espacios en leading/trailing blanco. Aplique el código de limpieza de datos de la tarea «Limpiar valores de datos e insertar registros» antes de insertarlos.

Recursos relacionados

Referencias

Tutoriales y videos

Diseño de DNS con Amazon Route 53 (vídeo)

Información adicional

En el caso de los registros NAPTR y SRV, el Value campo de la hoja de cálculo de Excel debe contener todos los componentes necesarios concatenados en una sola cadena. Utilice la función CONCAT de Excel para combinar las propiedades individuales (orden, preferencia, indicadores, servicio, expresión regular, reemplazo para NAPTR; prioridad, peso, puerto, objetivo para SRV) antes de exportar a JSON.

Si la migración incluye más de 1000 registros, divida el archivo JSON en lotes y procese cada lote por separado para mantenerse dentro de los límites de la API de Route 53. Al usar la UPSERT acción, cada ResourceRecord elemento cuenta dos veces para el máximo de 1000 elementos por solicitud. ChangeResourceRecordSets

Conexiones

Para acceder al contenido adicional asociado a este documento, descomprima el archivo: attachment.zip