使用boto3列出AWS Route 53中的CNAME记录

7

我想列出特定托管区域中的所有CNAME记录。假设我在托管区域中有超过400条记录。我正在使用boto3

response_per_zone = client.list_resource_record_sets(HostedZoneId=Id, MaxItems='100')

这个命令列出所有类型的100条记录。有很多CNAME记录缺失了。
我该如何遍历所有记录以便列出所有的CNAME记录?

4个回答

13

你应该使用AWS提供的官方分页方法: https://boto3.readthedocs.io/en/latest/reference/services/route53.html#Route53.Paginator.ListResourceRecordSets

列出CNAME记录的示例代码,无论记录数为多少:

#!/usr/bin/env python3

paginator = client.get_paginator('list_resource_record_sets')

try:
    source_zone_records = paginator.paginate(HostedZoneId='HostedZoneId')
    for record_set in source_zone_records:
        for record in record_set['ResourceRecordSets']:
            if record['Type'] == 'CNAME':
                print(record['Name'])

except Exception as error:
    print('An error occurred getting source zone records:')
    print(str(error))
    raise

1
根据AWS文档:响应中将设置一个标志以指示结果是否被截断(IsTruncated 将设置为 True)- 然后您可以查看响应中的 NextRecordName 的结果,作为 StartRecordName 的参数。如果需要,让我知道您是否需要我编写一个示例 :)

1

好的,我在仔细阅读文档后找到了答案。如果返回的最大记录数超过100条,则每100条记录将具有一个尾随的NextRecordType和NextRecordName字段。我们需要使用它们来获取下一个100个项目,以此类推。 这段代码对我有效,如果我的方法有误,请告诉我。

NextRecordName = 'a'
NextRecordType = 'CNAME'
while(NextRecordName is not None and NextRecordType is not None):
    response_per_zone = client.list_resource_record_sets(HostedZoneId=Id,StartRecordName=NextRecordName, StartRecordType=NextRecordType ,MaxItems='400')

    try:
        NextRecordName = response_per_zone['NextRecordName']
        NextRecordType = response_per_zone['NextRecordType']
    except Exception as e:
        NextRecordName = None
        NextRecordType = None



    print NextRecordType
    print NextRecordName
    #Since I need to find CNAME records, this is a function to check whether the record is CNAME, checking it is done using response_record = client.list_resource_record_sets(HostedZoneId=hostedzone, StartRecordName=cname_record, MaxItems='1')

    private_zone = resp['Config']['PrivateZone']
    if private_zone == False:
        find_record(response_per_zone, Id, record_stack)

1
大多数列表方法如果有更多的记录,将会返回NextToken。而list_resource_record_sets则会返回NextRecordName,你可以像使用NextToken一样使用它。以下是一个迭代所有记录的示例代码:
import boto3

aws_profile = '...'
zone_id = 'Z2A...'
max_records = 1000
session = boto3.Session(profile_name=aws_profile)
route53 = session.client('route53')
dns_records = []

dns_in_iteration = route53.list_resource_record_sets(HostedZoneId=zone_id)
dns_records.extend(dns_in_iteration['ResourceRecordSets'])

while len(dns_records) < max_records and 'NextRecordName' in dns_in_iteration.keys():
    next_record_name = dns_in_iteration['NextRecordName']
    print('listing next set: ' + next_record_name)
    dns_in_iteration = route53.list_resource_record_sets(HostedZoneId=zone_id, StartRecordName=next_record_name)
    dns_records.extend(dns_in_iteration['ResourceRecordSets'])

print('records found: ' + str(len(dns_records)))    
for record in dns_records:
    if record['Type'] == 'CNAME':
        print(record['Name'])

我添加了max_records来测试我的20k+记录,这样它就可以在较小的记录集上停止。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接