AWS Boto3调用Route53创建DNS记录无生效问题求助
问题描述
原本运行正常的代码,通过AWS API获取ECS容器信息,查询Route53现有记录后调用Boto3的change_resource_record_sets接口更新DNS区域以匹配ECS信息,现在出现异常:调用返回HTTP 200且无异常抛出,但DNS区域未产生预期变更。
相关代码:
try: r = get_primary_client('route53').change_resource_record_sets( HostedZoneId=dns_zone['Id'], ChangeBatch={'Changes': changes} ) processing_info['r'] = copy.deepcopy(r) assert r['ResponseMetadata']['HTTPStatusCode'] == 200 except Exception as ex: return str(ex)
dns_zone的JSON内容:
{ "CallerReference": "RISWorkflow-3bdd50ce72fe59acd56ed296752aab38", "Config": { "Comment": "HostedZone created by Route53 Registrar", "PrivateZone": false }, "Id": "/hostedzone/Z30M8MWTQXQ2O2", "Name": "ourdomain.com.", "ResourceRecordSetCount": 54 }
changes参数的JSON内容:
[ { "Action": "CREATE", "ResourceRecordSet": { "Name": "appserver2h.devqa.ourdomain.com", "ResourceRecords": [ { "Value": "10.13.11.98" } ], "TTL": 60, "Type": "A" } }, { "Action": "CREATE", "ResourceRecordSet": { "Name": "grinder2h.devqa.ourdomain.com", "ResourceRecords": [ { "Value": "10.13.12.172" } ], "TTL": 60, "Type": "A" } } ]
调用返回结果显示变更状态为PENDING,后续通过AWS CLI查询变更状态为INSYNC,但appserver2h.devqa.ourdomain.com和grinder2h.devqa.ourdomain.com仍未在DNS区域中创建记录。
排查方向
- 域名后缀格式错误:Route53要求记录的
Name字段必须以带点的域名后缀结尾。当前changes中的域名未带末尾的点,Route53会自动补全托管区域名,最终生成appserver2h.devqa.ourdomain.com.ourdomain.com.这类错误域名,导致你在预期位置找不到记录。需将Name修正为appserver2h.devqa.ourdomain.com.(末尾加一个点)。 - CREATE动作无法覆盖已有记录:如果这些记录之前已存在(哪怕值不同),使用
CREATE动作不会触发更新,只会返回成功但无实际变更。建议改用UPSERT动作,它会自动判断是创建新记录还是更新已有记录。 - 托管区ID不匹配:确认
dns_zone['Id']对应的确实是ourdomain.com.的托管区,避免因误传入其他托管区ID,导致记录创建到了非目标区域。 - 控制台显示延迟:即使变更状态为
INSYNC,Route53控制台可能存在几分钟的显示延迟。可通过CLI直接查询托管区记录集确认:
查询时注意带末尾的点,避免匹配错误。aws route53 list-resource-record-sets --hosted-zone-id Z30M8MWTQXQ2O2 --query "ResourceRecordSets[?Name=='appserver2h.devqa.ourdomain.com.']" - IAM权限隐性限制:虽然调用返回200,仍需确认执行代码的IAM角色是否有完整的
route53:ChangeResourceRecordSets权限,且权限范围包含目标托管区。部分场景下权限配置存在前缀限制,会导致操作成功但无实际效果。
内容的提问来源于stack exchange,提问作者CryptoFool
相关产品推荐
相关产品推荐

