View a markdown version of this page

Massenmigrieren von DNS-Einträgen in eine private gehostete Zone von Amazon Route 53 - AWS Prescriptive Guidance

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Massenmigrieren von DNS-Einträgen in eine private gehostete Zone von Amazon Route 53

Ram Kandaswamy, Amazon Web Services

Zusammenfassung

Dieses Muster automatisiert die Massenmigration von DNS-Einträgen in eine von Amazon Route 53 gehostete Zone. Es verwendet ein Python-Skript mit dem AWS SDK für Python (Boto3), um Datensatzdaten aus einer in Amazon Simple Storage Service (Amazon S3) gespeicherten JSON-Datei zu lesen und die Datensätze mithilfe der Route 53-API programmgesteuert zu erstellen.

Wenn Ihr Quellsystem standardmäßige BIND-Zonendateien exportiert, kann die native Importfunktion von Route 53 oder cli53 (ein von der Community verwaltetes Open-Source-CLI-Tool, zu dem nicht gehört AWS) die Migration ohne benutzerdefiniertes Scripting durchführen. In vielen Unternehmensumgebungen befinden sich DNS-Einträge jedoch eher in Excel-Arbeitsblättern als in Zonendateien. Excel-Exporte enthalten häufig Probleme mit der Datenqualität, wie z. B. geschützte Leerzeichen und Unicode-Zeichen, die mit Standard-Importtools nicht behoben werden können. Dieses Muster behebt diese Lücke: Es liest aus Excel und bereinigt die Daten, sodass durchgehend Datensätze erstellt werden.

Verwenden Sie dieses Muster, wenn Sie eine große Anzahl von DNS-Einträgen von einem vorhandenen System in eine Route 53-Hosting-Zone migrieren müssen, ohne jeden Eintrag manuell über die Konsole erstellen zu müssen.

Voraussetzungen und Einschränkungen

Voraussetzungen

  • Ein aktives AWS-Konto

  • Ein Excel-Arbeitsblatt, das Datensätze für gehostete Zonen mit Spalten für den vollqualifizierten Domainnamen (FQDN), den Datensatztyp, die Gültigkeitsdauer (TTL) und den Wert enthält

  • Python 3.12 oder höher (siehe Python herunterladen)

  • Die Pandas-Python-Bibliothek ist installiert () pip3 install pandas

  • Vertrautheit mit DNS-Eintragstypen wie A-, NAPTR- und SRV-Einträgen (siehe Unterstützte DNS-Eintragstypen)

  • Vertrautheit mit der Sprache Python und ihren Bibliotheken

Einschränkungen

  • Dieses Muster verwendet nicht alle verfügbaren Eigenschaften des change_resource_record_sets API-Aufrufs. Erweitern Sie den Code nach Bedarf für Ihren Anwendungsfall.

  • Im Excel-Arbeitsblatt wird davon ausgegangen, dass der Wert in jeder Zeile eindeutig ist. Es wird erwartet, dass mehrere Werte für jeden FQDN in derselben Zeile erscheinen. Ist dies nicht der Fall, ändern Sie den Code, um mehrere Werte für denselben FQDN zu verketten.

  • Dieses Muster ruft die Route 53-API direkt mithilfe von Boto3 auf. Sie können den Code so erweitern, dass er einen AWS CloudFormation Wrapper für die update_stack Befehle create_stack und verwendet und die JSON-Werte zum Auffüllen von Vorlagenressourcen verwenden.

  • Wenn Ihr Quellsystem Datensätze im BIND-Zonendateiformat exportieren kann, sollten Sie stattdessen die Route 53-Importfunktion verwenden.

  • Einige AWS Dienste sind nicht in allen verfügbar AWS-Regionen. Informationen zur Verfügbarkeit in den einzelnen Regionen finden Sie unter AWSDienste nach Regionen. Informationen zu bestimmten Endpunkten finden Sie auf der Seite Dienstendpunkte und Kontingente. Wählen Sie dort den Link für den Dienst aus.

Architektur

  1. Der Benutzer lädt ein Excel-Arbeitsblatt mit DNS-Datensatzdaten in einen Amazon S3 S3-Bucket hoch.

  2. Ein Python-Skript, das lokal (oder in einer IDE wie Kiro) ausgeführt wird, liest die JSON-Datei mithilfe von Boto3 aus dem Amazon S3 S3-Bucket.

  3. Das Skript verarbeitet die Datensätze und ruft den change_resource_record_sets Route-53-API-Vorgang auf, um Datensätze in der Hosting-Zone zu erstellen.

Tools

AWS-Services

  • Route 53 — Stellt die gehostete Zone bereit, in der DNS-Einträge erstellt werden. Dieses Muster verwendet die change_resource_record_sets API-Operationen create_hosted_zone und.

  • Amazon S3 — Speichert die JSON-Datei, die die zu migrierenden DNS-Datensatzdaten enthält.

Andere Tools

  • Kiro — Eine IDE mit agentischen KI-Funktionen, die zur Entwicklung und Ausführung des Python-Migrationsskripts verwendet wird. Weitere Informationen finden Sie unter Kiro.

  • pandas — Eine Python-Datenanalysebibliothek, die verwendet wird, um das Excel-Arbeitsblatt in das JSON-Format zu konvertieren.

Best Practices

  • Testen Sie mit einer kleinen Teilmenge von 5—10 Datensätzen, bevor Sie das Skript für alle Datensätze ausführen, um die Datenformatierung zu überprüfen und die Datensatzerstellung zu korrigieren.

  • Verwenden Sie die UPSERT Aktion anstelle von. CREATE Die UPSERT Aktion erstellt einen Datensatz, falls er nicht existiert, oder aktualisiert ihn, falls dies der Fall ist. Dadurch ist das Skript idempotent und kann sicher erneut ausgeführt werden.

  • Batch Sie Ihre Änderungen, um innerhalb der ChangeResourceRecordSets Anforderungslimits zu bleiben. Wenn Sie die UPSERT Aktion verwenden, zählt jedes ResourceRecord Element zweimal zum Maximum von 1.000 Elementen.

  • Überprüfen Sie die Daten vor dem Einfügen. Stellen Sie sicher, dass FQDNs mit einem Punkt (.) enden, dass TTL-Werte positive Ganzzahlen sind und dass die Eintragstypen mit den unterstützten DNS-Eintragstypen übereinstimmen.

  • Erstellen Sie eine Sicherungskopie vorhandener Datensätze, bevor Sie Massenänderungen vornehmen. Exportieren Sie die aktuellen Datensätze der Hosting-Zone, indem Sie list_resource_record_sets die Option zur Bereitstellung eines Rollback-Punkts verwenden.

  • Implementieren Sie eine Wiederholungslogik mit exponentiellem Backoff, um die Route-53-API-Ratenbegrenzungen zu handhaben. Weitere Informationen finden Sie unter Fehlerwiederholungen und exponentielles Backoff in. AWS

  • Folgen Sie dem Prinzip der geringsten Rechte und gewähren Sie die für die Ausführung einer Aufgabe erforderlichen Mindestberechtigungen. Weitere Informationen finden Sie in der AWS Identity and Access Management (IAM-) Dokumentation unter Gewährung der geringsten Rechte und bewährte Methoden zur Sicherheit.

Epen

AufgabeDescriptionErforderliche Fähigkeiten

Erstellen Sie eine Excel-Datei für Ihre Unterlagen.

  1. Exportieren Sie Datensätze aus Ihrem aktuellen DNS-System.

  2. Erstellen Sie ein Excel-Arbeitsblatt mit den folgenden Spalten: FqdnNameRecordType,,Value,TTL.

  3. Verwenden Sie für NAPTR- und SRV-Datensätze die CONCAT-Funktion von Excel, um mehrere Eigenschaftswerte in der Spalte zu kombinieren. Value

  4. Stellen Sie sicher, dass jeder FQDN mit einem Punkt (.) endet und dass TTL-Werte positive Ganzzahlen sind.

Beispielzeile:

FqdnName

RecordType

Wert

TTL

something.example.org

A

192.0.2.1

900

Dateningenieur

Konvertiert die Daten des Excel-Arbeitsblatts in JSON.

  1. Stellen Sie sicher, dass Python 3.12 oder höher installiert ist, indem Sie es python3 --version im Terminal ausführen.

  2. Installieren Sie die Pandas-Bibliothek, indem Sie sie pip3 install pandas --user im Terminal ausführen.

  3. Erstellen Sie eine Python-Datei mit dem folgenden Code, um das Excel-Arbeitsblatt in JSON zu konvertieren:

import pandas as pd data=pd.read_excel('./Book1.xls') data.to_json(path_or_buf='my.json',orient='records')
  1. Führen Sie das Skript aus. Stellen Sie sicher, dass die Ausgabedatei die erwarteten Datensätze my.json enthält.

Dateningenieur, Python-Entwickler

Laden Sie die JSON-Datei in einen Amazon S3 S3-Bucket hoch.

  1. Erstellen Sie einen Amazon S3 S3-Bucket, falls noch keiner vorhanden ist. Weitere Informationen finden Sie unter Bucket erstellen in der Amazon S3 S3-Dokumentation.

  2. Laden Sie die my.json Datei in den Bucket hoch.

App-Developer
AufgabeDescriptionErforderliche Fähigkeiten

Erstellen Sie eine gehostete Zone.

  1. Erstellen Sie eine Python-Datei mit dem folgenden Code, um eine gehostete Zone zu erstellen. Ersetzen Sie <hosted-zone-name><vpc-region>, und <vpc-id> durch Ihre Werte.

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. Führen Sie das Skript aus und notieren Sie sich die Hosting-Zonen-ID aus der Antwort.

Sie können auch ein IaC-Tool (Infrastructure as Code) verwenden, AWS CloudFormation um diese Schritte durch eine Vorlage zu ersetzen, die einen Stack mit den entsprechenden Ressourcen und Eigenschaften erstellt. Weitere Informationen finden Sie HostedZone in der CloudFormation Dokumentation unter AWS Route 53::.

Cloud-Architekt, Netzwerkadministrator, Python-Kenntnisse

Lesen Sie die JSON-Daten aus Amazon S3.

  1. Verwenden Sie diesen Code, um aus dem Amazon S3 S3-Bucket zu lesen und ihn als Python-Wörterbuch zu laden. 

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. Stellen Sie sicher, dass es die erwarteten Datensätze json_content enthält, indem Sie die ersten Einträge drucken.

App-Entwickler, Python-Entwickler

Datenwerte bereinigen und Datensätze einfügen.

  1. Verwenden Sie diesen Code, um Datenwerte zu bereinigen und Datensätze in die gehostete Zone einzufügen. <hosted-zone-id>Ersetzen Sie es durch die ID aus der zuvor konfigurierten Hosting-Zone.

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. Überwachen Sie die Ausgabe auf Fehler. Wenn es zu einer Drosselung kommt, erhöhen Sie die Verzögerung oder implementieren Sie einen exponentiellen Backoff.

App-Entwickler, Python-Kenntnisse

Fehlerbehebung

ProblemLösung

PriorRequestNotComplete-Fehler

Fügen Sie eine time.sleep() Verzögerung von 1—2 Sekunden zwischen change_resource_record_sets Anrufen hinzu. Route 53 verarbeitet Änderungen asynchron, und eine vorherige Änderung ist möglicherweise noch im Gange.

InvalidChangeBatch-Fehler

Dieser Fehler tritt auf, wenn Sie versuchen, mithilfe der CREATE Aktion einen Datensatz zu erstellen, der bereits vorhanden ist. Verwenden Sie UPSERT stattdessen, um das Skript idempotent zu machen.

Drosselungsfehler (Ratenlimit überschritten)

Sie haben fünf API-Anfragen pro Sekunde überschritten. Implementieren Sie exponentiellen Backoff mit Jitter. Weitere Informationen finden Sie unter Error Retries and exponential backoff in. AWS

Datensätze werden nicht aufgelöst

Stellen Sie sicher, dass die VPC der Hosting-Zone zugeordnet ist und dass die DNS-Auflösung auf der VPC aktiviert ist. Beides enableDnsSupport und enableDnsHostnames muss auf eingestellt sein. true

InvalidInputFehler bei den Datensatzwerten

Die Daten enthalten geschützte Leerzeichen (\xa0) oder leading/trailing Leerzeichen. Wenden Sie vor dem Einfügen den Datenbereinigungscode aus der Aufgabe „Datenwerte bereinigen und Datensätze einfügen“ an.

Zugehörige Ressourcen

Referenzen

Tutorials und Videos

DNS-Design mit Amazon Route 53 (Video)

Zusätzliche Informationen

Bei NAPTR- und SRV-Datensätzen muss das Value Feld im Excel-Arbeitsblatt alle erforderlichen Komponenten enthalten, die zu einer einzigen Zeichenfolge verkettet sind. Verwenden Sie die CONCAT-Funktion von Excel, um die einzelnen Eigenschaften (Reihenfolge, Präferenz, Flags, Service, Regexp, Ersatz für NAPTR; Priorität, Gewicht, Port, Ziel für SRV) zu kombinieren, bevor Sie nach JSON exportieren.

Wenn Ihre Migration mehr als 1.000 Datensätze umfasst, teilen Sie die JSON-Datei in Batches auf und verarbeiten Sie jeden Stapel separat, um die API-Grenzwerte für Route 53 einzuhalten. Wenn Sie die UPSERT Aktion verwenden, wird jedes ResourceRecord Element zweimal auf das Maximum von 1.000 Elementen pro Anfrage angerechnet. ChangeResourceRecordSets

Anlagen

Um auf zusätzliche Inhalte zuzugreifen, die mit diesem Dokument verknüpft sind, entpacken Sie die folgende Datei: attachment.zip