将 DNS 记录批量迁移至 Amazon Route 53 私有托管区 - AWS Prescriptive Guidance

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将 DNS 记录批量迁移至 Amazon Route 53 私有托管区

创建者:Ram Kandaswamy (AWS)

环境:生产

技术:网络;; CloudNative DevOps;基础架构

Amazon Web Services:AWS Cloud9;Amazon Route 53;Amazon S3

Summary

网络工程师和云管理员需要一种高效且简单的方法将域名系统(DNS)记录添加到 Amazon Route 53 中的私有托管区。使用手动方法将 Microsoft Excel 工作表中的条目复制到 Route 53 控制台中的适当位置非常繁琐且容易出错。此模式描述了一种自动化方法,可减少添加多个记录所需时间和精力。它还提供了一组可重复的步骤来创建多个托管区域。

这种模式使用 AWS Cloud9 集成式开发环境(IDE)进行开发和测试,使用 Amazon Simple Storage Service (Amazon S3) 来存储记录。为了有效地处理数据,该模式使用 JSON 格式,因为它简单且能够支持 Python 字典(dict 数据类型)。

注意:如果可以从系统生成区域文件,请考虑改用 Route 53 导入功能

先决条件和限制

先决条件

  • 包含私有托管区记录的 Excel 工作表

  • 熟悉不同类型的 DNS 记录,例如 A 记录、域名授权指针 (NAPTR) 记录和 SRV 记录(请参阅支持的 DNS 记录类型

  • 熟悉 Python 语言及其库

限制

  • 该模式并未广泛覆盖所有用例场景。例如,change_resource_record_sets 调用并未使用 API 的所有可用属性。

  • 在 Excel 工作表中,假定每行中的值是唯一的。每个完全限定域名 (FQDN) 的多个值应出现在同一行。如果情况并非如此,您应该修改此模式中提供的代码以执行必要的串联。

  • 该模式使用适用于 Python 的 Amazon SDK (Boto3) 直接调用 Route 53 服务。您可以增强代码以使用create_stackupdate_stack命令的 AWS CloudFormation 封装器,并使用 JSON 值填充模板资源。

架构

技术堆栈

  • Route 53 私有托管区,用于路由流量

  • AWS Cloud9 IDE,用于开发和测试

  • Amazon S3,用于存储输出 JSON 文件

将 DNS 记录批量迁移到 Route 53 私有托管区域的工作流程。

工作流由以下步骤组成,如上图所示,并在操作说明部分中进行了讨论:

  1. 将包含记录集信息的 Excel 工作表上传至 S3 存储桶。

  2. 创建并运行 Python 脚本,将 Excel 数据转换为 JSON 格式。

  3. 从 S3 存储桶读取记录并清理数据。

  4. 在您的私有托管区中创建记录集。

工具

  • Route 53 — Amazon Route 53 是高度可用且可扩展的 DNS 网络服务,用于处理域注册、DNS 路由和运行状况检查。

  • AWS Cloud9 – AWS Cloud9 是一个集成式开发环境 (IDE),提供丰富的代码编辑体验,对多种编程语言和运行时系统调试程序的支持以及内置终端。它包含一套工具,可用于对软件进行编码、构建、运行、测试和调试,并帮助您将软件发布到云中。

  • Amazon S3 – Amazon Simple Storage Service (Amazon S3) 是一项对象存储服务。您可以通过 Amazon S3 随时在 Web 上的任何位置存储和检索的任意大小的数据。

操作说明

任务描述所需技能

创建一个 Excel 文件作为记录。

使用从当前系统导出的记录创建一个 Excel 工作表,其中包含记录所需列,例如完全限定域名 (FQDN)、记录类型、生存时间 (TTL) 和值。对于 NAPTR 和 SRV 记录,该值是多个属性的组合,因此请使用 Excel concat 方法来组合这些属性。

FqdnName

RecordType

TTL

something.example.org

A

1.1.1.1

900

数据工程师、Excel 技能

验证工作环境。

在 AWS Cloud9 IDE 中,创建一个 Python 文件以将 Excel 输入工作表转换为 JSON 格式。(你也可以使用亚马逊 SageMaker 笔记本来处理 Python 代码,而不是 AWS Cloud9。)

确认您使用的 Python 版本是 3.7 或更高版本。

python3 --version

安装 pandas 程序包。

pip3 install pandas --user
常规 AWS

将 Excel 工作表数据转换为 JSON。

创建一个包含以下代码的 Python 文件,以将 Excel 转换为 JSON。

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 示例代码创建私有托管区。将 hostedZoneNamevpcRegionvpcId 参数值替换为您自己的值。

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)

您也可以使用诸如 AWS 之类的基础设施即代码 (IaC) 工具, CloudFormation 将这些步骤替换为使用适当资源和属性的堆栈创建堆栈的模板。

云架构师、网络管理员、Python 技能

从 Amazon S3 以字典形式检索详细信息。

使用以下代码从 S3 存储桶中读取数据并获取 Python 字典形式的 JSON 值。 

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 技能

清理空格和 Unicode 字符数据值。

作为确保数据正确性的安全措施,请使用以下代码对 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 技能

相关资源

参考

教程和视频