

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Migrer des enregistrements DNS en masse vers une zone hébergée privée Amazon Route 53
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone"></a>

*Ram Kandaswamy, Amazon Web Services*

## Résumé
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-summary"></a>

Ce modèle automatise la migration en masse des enregistrements DNS vers une zone hébergée Amazon Route 53. Il utilise un script Python associé au AWS SDK pour Python (Boto3) pour lire les données d'enregistrement d'un fichier JSON stocké dans Amazon Simple Storage Service (Amazon S3) et créer les enregistrements par programmation à l'aide de l'API Route 53.

Si votre système source exporte des fichiers de zone BIND standard, la fonctionnalité d'importation native de Route 53 ou [cli53](https://github.com/barnybug/cli53) (un outil CLI open source géré par la communauté et non AWS affilié) peut gérer la migration sans script personnalisé. Toutefois, dans de nombreux environnements d'entreprise, les enregistrements DNS se trouvent dans des feuilles de calcul Excel plutôt que dans des fichiers de zone. Les exportations Excel présentent souvent des problèmes de qualité des données, tels que des espaces non interrompus et des caractères Unicode, que les outils d'importation standard ne prennent pas en charge. Ce modèle comble cette lacune : il lit dans Excel et nettoie les données pour créer des enregistrements de bout en bout.

Utilisez ce modèle lorsque vous devez migrer un grand nombre d'enregistrements DNS d'un système existant vers une zone hébergée Route 53 sans créer chaque enregistrement manuellement via la console.

## Conditions préalables et limitations
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-prereqs"></a>

**Conditions préalables**
+ Un compte AWS actif
+ Feuille de calcul Excel contenant des enregistrements de zone hébergée avec des colonnes pour le nom de domaine complet (FQDN), le type d'enregistrement, la durée de vie (TTL) et la valeur
+ Python 3.12 ou version ultérieure (voir [Télécharger Python](https://www.python.org/downloads/))
+ La bibliothèque Python Pandas installée () `pip3 install pandas`
+ Connaissance des types d'enregistrement DNS tels que les enregistrements A, NAPTR et SRV (voir Types d'enregistrements [DNS pris en charge](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/ResourceRecordTypes.html))
+ Connaissance du langage Python et de ses bibliothèques

**Limites**
+ Ce modèle n'utilise pas toutes les propriétés disponibles de l'appel `change_resource_record_sets` d'API. Étendez le code selon les besoins de votre cas d'utilisation.
+ Dans la feuille de calcul Excel, la valeur de chaque ligne est supposée être unique. Plusieurs valeurs pour chaque FQDN devraient apparaître dans la même ligne. Si ce n'est pas le cas, modifiez le code pour concaténer plusieurs valeurs pour le même FQDN.
+ Ce modèle appelle l'API Route 53 directement à l'aide de Boto3. Vous pouvez améliorer le code pour utiliser un AWS CloudFormation wrapper pour les `update_stack` commandes `create_stack` et et utiliser les valeurs JSON pour renseigner les ressources du modèle.
+ Si votre système source peut exporter des enregistrements au format de fichier de zone BIND, pensez plutôt à utiliser la fonctionnalité d'importation Route 53.
+ Certains AWS services ne sont pas disponibles dans tous les cas Régions AWS. Pour connaître la disponibilité par région, consultez la section AWS[Services par région](https://aws.amazon.com/about-aws/global-infrastructure/regional-product-services/). Pour des points de terminaison spécifiques, consultez la page [Points de terminaison et quotas du service](https://docs.aws.amazon.com/general/latest/gr/aws-service-information.html), puis choisissez le lien vers le service.

## Architecture
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-architecture"></a>



![](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/images/pattern-img/a81c29ea-f0c5-4d4a-ba87-93111a0f1ee9/images/e5c65fa5-346e-4a24-bddf-a523f30afa95.png)


1. L'utilisateur télécharge une feuille de calcul Excel contenant les données d'enregistrement DNS dans un compartiment Amazon S3.

1. Un script Python exécuté localement (ou dans un IDE tel que Kiro) lit le fichier JSON depuis le compartiment Amazon S3 à l'aide de Boto3.

1. Le script traite les enregistrements et appelle l'opération d'`change_resource_record_sets`API Route 53 pour créer des enregistrements dans la zone hébergée.

## Outils
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-tools"></a>

*Services AWS*
+ [Route 53](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/Welcome.html) — Indique la zone hébergée dans laquelle les enregistrements DNS sont créés. Ce modèle utilise les opérations de `change_resource_record_sets` l'API `create_hosted_zone` et.
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) : stocke le fichier JSON qui contient les données d'enregistrement DNS à migrer.

*Autres outils*
+ **Kiro** — Un IDE doté de fonctionnalités d'intelligence artificielle, utilisé pour développer et exécuter le script de migration Python. Pour plus d'informations, consultez [Kiro.](https://kiro.dev/)
+ **pandas** — Une bibliothèque d'analyse de données Python, utilisée pour convertir la feuille de calcul Excel au format JSON.

## Bonnes pratiques
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-best-practices"></a>
+ Testez avec un petit sous-ensemble de 5 à 10 enregistrements avant d'exécuter le script sur tous les enregistrements afin de vérifier le formatage des données et la création correcte des enregistrements.
+ Utilisez l'`UPSERT`action au lieu de`CREATE`. L'`UPSERT`action crée un enregistrement s'il n'existe pas ou le met à jour s'il existe. Cela rend le script idempotent et peut être réexécuté en toute sécurité.
+ [Batch vos modifications](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DNSLimitations.html#limits-api-requests-changeresourcerecordsets) pour respecter les limites des `ChangeResourceRecordSets` demandes. Lorsque vous utilisez cette `UPSERT` action, chaque `ResourceRecord` élément compte deux fois dans le calcul du maximum de 1 000 éléments.
+ [Validez les données avant de les insérer](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/ResourceRecordTypes.html). Vérifiez que les noms de domaine complets se terminent par un point (`.`), que les valeurs TTL sont des entiers positifs et que les types d'enregistrement correspondent aux types d'enregistrements DNS pris en charge.
+ [Sauvegardez les enregistrements existants](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/route53.html#Route53.Client.list_resource_record_sets) avant d'apporter des modifications groupées. Exportez les enregistrements actuels de la zone hébergée en utilisant `list_resource_record_sets` pour fournir un point de restauration.
+ Implémentez une logique de nouvelle tentative avec un ralentissement exponentiel pour gérer les limites de débit de l'API Route 53. Pour plus d'informations, consultez la section [Rétentatives d'erreur et recul exponentiel dans](https://docs.aws.amazon.com/general/latest/gr/api-retries.html). AWS
+ Respectez le principe du moindre privilège et accordez les autorisations minimales requises pour effectuer une tâche. Pour plus d'informations, consultez les sections [Accorder le moindre privilège](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege) et [Bonnes pratiques de sécurité](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html) dans la documentation Gestion des identités et des accès AWS (IAM).

## Épopées
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-epics"></a>

### Préparer les données pour l'automatisation
<a name="prepare-data-for-automation"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Créez un fichier Excel pour vos dossiers. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html)Exemple de ligne : [See the AWS documentation website for more details](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html) | Ingénieur de données | 
| Convertissez les données de la feuille de calcul Excel en JSON. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html)<pre>import pandas as pd<br /><br />data=pd.read_excel('./Book1.xls')<br />data.to_json(path_or_buf='my.json',orient='records')</pre>[See the AWS documentation website for more details](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html) | Ingénieur de données, développeur Python | 
| Téléchargez le fichier JSON dans un compartiment Amazon S3. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html) | Développeur d’applications | 
| FqdnName | RecordType | Value | TTL | 
| something.exemple.org | A | 192.0.2.1 | 900 | 

### Insérer des enregistrements dans la zone hébergée
<a name="insert-records-into-the-hosted-zone"></a>


| Sous-tâche | Description | Compétences requises | 
| --- | --- | --- | 
| Créez une zone hébergée. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html)<pre>import boto3<br />import random<br /><br />hostedZoneName ="xxx"<br />vpcRegion = "us-east-1"<br />vpcId="vpc-xxxx"<br />route53_client = boto3.client('route53')<br />response = route53_client.create_hosted_zone(<br />        Name= hostedZoneName,<br />        VPC={<br />            'VPCRegion': vpcRegion,<br />            'VPCId': vpcId<br />        },<br />        CallerReference=str(random.random()*100000),<br />        HostedZoneConfig={<br />            'Comment': "private hosted zone created by automation",<br />            'PrivateZone': True<br />        }<br />    )<br /><br /> print(response)</pre>[See the AWS documentation website for more details](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html)Vous pouvez également utiliser un outil d'infrastructure en tant que code (IaC) AWS CloudFormation pour remplacer ces étapes par un modèle qui crée une pile avec les ressources et les propriétés appropriées. Pour plus d'informations, consultez [AWS Route 53 : : HostedZone](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-route53-hostedzone.html) dans la CloudFormation documentation. | Architecte cloud, administrateur réseau, compétences en Python | 
| Lisez les données JSON depuis Amazon S3. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html)<pre>import json<br />import boto3<br /><br />s3_client = boto3.client('s3')<br />fileobj = s3_client.get_object(<br />    Bucket='<your-bucket-name>',<br />    Key='my.json'<br />)<br /><br />filedata = fileobj['Body'].read()<br />contents = filedata.decode('utf-8')<br />json_content = json.loads(contents)</pre>[See the AWS documentation website for more details](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html) | Développeur d'applications, développeur Python | 
| Nettoyez les valeurs des données et insérez des enregistrements. | [See the AWS documentation website for more details](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html)<pre>import unicodedata<br />import time<br /><br />for item in json_content:<br />    fqn_name = unicodedata.normalize(<br />        "NFKD",<br />        item["FqdnName"].replace("u'", "'").replace('\xa0', '').strip()<br />    )<br />    rec_type = item["RecordType"].replace('\xa0', '').strip()<br />    res_rec = {'Value': item["Value"].replace('\xa0', '').strip()}<br /><br />    change_response = route53_client.change_resource_record_sets(<br />        HostedZoneId='<hosted-zone-id>',<br />        ChangeBatch={<br />            'Comment': 'Created by automation',<br />            'Changes': [<br />                {<br />                    'Action': 'UPSERT',<br />                    'ResourceRecordSet': {<br />                        'Name': fqn_name,<br />                        'Type': rec_type,<br />                        'TTL': item["TTL"],<br />                        'ResourceRecords': [res_rec]<br />                    }<br />                }<br />            ]<br />        }<br />    )<br /><br />    time.sleep(1)  # Delay to avoid PriorRequestNotComplete errors</pre>[See the AWS documentation website for more details](http://docs.aws.amazon.com/fr_fr/prescriptive-guidance/latest/patterns/migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone.html) | Développeur d'applications, compétences en Python | 

## Résolution des problèmes
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-troubleshooting"></a>


| Problème | Solution | 
| --- | --- | 
| `PriorRequestNotComplete`Erreur  | Ajoutez un `time.sleep()` délai de 1 à 2 secondes entre les `change_resource_record_sets` appels. Route 53 traite les modifications de manière asynchrone, et une modification précédente est peut-être toujours en cours. | 
| `InvalidChangeBatch`Erreur  | Cette erreur se produit lorsque vous essayez de créer un enregistrement qui existe déjà en utilisant l'`CREATE`action. Utilisez-le `UPSERT` plutôt pour rendre le script idempotent. | 
| Erreur de régulation (limite de débit dépassée)  | Vous avez dépassé les cinq demandes d'API par seconde. Implémentez un recul exponentiel avec instabilité. Pour plus d'informations, consultez la section [Rétentatives d'erreur et recul exponentiel dans](https://docs.aws.amazon.com/general/latest/gr/api-retries.html). AWS | 
| Les dossiers ne sont pas résolus | Vérifiez que le VPC est associé à la zone hébergée et que la résolution DNS est activée sur le VPC. Les deux `enableDnsSupport` et `enableDnsHostnames` doivent être paramétrés sur`true`. | 
| `InvalidInput`erreur sur les valeurs d'enregistrement | Les données contiennent des espaces non interrompus (`\xa0`) ou des espaces leading/trailing blancs. Appliquez le code de nettoyage des données issu de la tâche « Nettoyer les valeurs des données et insérer des enregistrements » avant l'insertion. | 

## Ressources connexes
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-resources"></a>

**Références**
+ [Création d'enregistrements en important un fichier de zone](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/resource-record-sets-creating-import.html) (documentation Route 53)
+ [create\_hosted\_zone](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/route53/client/create_hosted_zone.html) (documentation de Boto3)
+ [change\_resource\_record\_sets (documentation de Boto3](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/route53/client/change_resource_record_sets.html))
+ [Types d'enregistrements DNS pris](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/ResourceRecordTypes.html) en charge (documentation Route 53)
+ [Nouvelles tentatives d'erreur et ralentissement exponentiel dans AWS](https://docs.aws.amazon.com/general/latest/gr/api-retries.html)

**Tutoriels et vidéos**

[Conception de DNS à l'aide d'Amazon Route 53](https://www.youtube.com/watch?v=example) (vidéo)

## Informations supplémentaires
<a name="migrate-dns-records-in-bulk-to-an-amazon-route-53-private-hosted-zone-additional"></a>

Pour les enregistrements NAPTR et SRV, le `Value` champ de la feuille de calcul Excel doit contenir tous les composants requis concaténés en une seule chaîne. Utilisez la fonction CONCAT d'Excel pour combiner les propriétés individuelles (ordre, préférence, drapeaux, service, expression régulière, remplacement de NAPTR ; priorité, poids, port, cible pour SRV) avant d'exporter au format JSON.

Si votre migration implique plus de 1 000 enregistrements, divisez le fichier JSON en lots et traitez chaque lot séparément pour respecter les limites de l'API Route 53. Lorsque vous utilisez l'`UPSERT`action, chaque `ResourceRecord` élément compte deux fois dans le calcul du maximum de 1 000 éléments par demande. `ChangeResourceRecordSets`

## Pièces jointes
<a name="attachments-a81c29ea-f0c5-4d4a-ba87-93111a0f1ee9"></a>

[Pour accéder au contenu supplémentaire associé à ce document, téléchargez et décompressez le fichier suivant : attachment.zip](samples/p-attach/a81c29ea-f0c5-4d4a-ba87-93111a0f1ee9/attachments/attachment.zip)