You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过脚本批量更新Amazon Route 53现有DNS记录的TTL?

Amazon Route 53批量修改上万条记录TTL的实现方案

完全可以实现批量修改Route53托管区域中上万条记录的TTL,核心是利用AWS CLI或SDK(如Python的boto3)结合分页、批量提交的方式处理,以下是具体方法:

实现步骤

  • 导出所有记录集:由于记录数量超过单页返回上限,必须使用分页机制获取全部记录。用boto3的分页器可自动处理分页逻辑,也可通过AWS CLI的route53 list-resource-record-sets命令配合--starting-token参数循环获取。
  • 过滤目标记录:建议排除托管区域默认的NS和SOA记录(这类记录一般无需修改TTL),若需修改所有记录则跳过此步骤。
  • 批量提交变更:Route53的change-resource-record-sets接口单次最多支持1000条变更请求,因此需要将记录按每1000条分组,每组生成包含UPSERT操作的ChangeBatch(UPSERT会更新现有记录,保留除TTL外的所有参数)。

Python示例代码(boto3)

import boto3
from botocore.config import Config

def batch_update_route53_ttl(hosted_zone_id, new_ttl):
    # 配置重试机制,处理API限流
    config = Config(
        retries={
            'max_attempts': 10,
            'mode': 'standard'
        }
    )
    client = boto3.client('route53', config=config)
    paginator = client.get_paginator('list_resource_record_sets')

    record_sets = []
    # 分页获取所有记录,排除NS和SOA
    for page in paginator.paginate(HostedZoneId=hosted_zone_id):
        for rs in page['ResourceRecordSets']:
            if rs['Type'] not in ['NS', 'SOA']:
                record_sets.append(rs)

    batch_size = 1000
    total_batches = (len(record_sets) + batch_size - 1) // batch_size

    for batch_num in range(total_batches):
        start_idx = batch_num * batch_size
        end_idx = start_idx + batch_size
        current_batch = record_sets[start_idx:end_idx]
        changes = []

        for rs in current_batch:
            change = {
                'Action': 'UPSERT',
                'ResourceRecordSet': {
                    'Name': rs['Name'],
                    'Type': rs['Type']
                }
            }
            # 区分普通记录和别名记录
            if 'AliasTarget' in rs:
                change['ResourceRecordSet']['AliasTarget'] = rs['AliasTarget']
            else:
                change['ResourceRecordSet']['TTL'] = new_ttl
                change['ResourceRecordSet']['ResourceRecords'] = rs['ResourceRecords']
            
            changes.append(change)
        
        # 提交变更
        response = client.change_resource_record_sets(
            HostedZoneId=hosted_zone_id,
            ChangeBatch={'Changes': changes}
        )
        print(f"批次 {batch_num+1}/{total_batches} 提交完成,变更ID: {response['ChangeInfo']['Id']}")

# 替换为你的托管区域ID和目标TTL
batch_update_route53_ttl('ZXXXXXXXXXXXXXXX', 300)

注意事项

  • 测试先行:先选取少量记录(比如前10条)测试脚本,确认修改逻辑正确后再全量执行。
  • 别名记录处理:别名记录没有独立TTL,其TTL继承自目标资源,脚本中已自动跳过这类记录的TTL修改。
  • API限流处理:Route53有API速率限制,示例中配置了重试机制,避免因限流导致操作失败。
  • 状态跟踪:每个批次的变更ID可用于通过get-change接口查询变更状态,确保所有修改生效。

内容的提问来源于stack exchange,提问作者Andreea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 08:35:22