如何通过Python的boto3客户端验证Route 53注册域名适配AWS SES
SES域名验证Pending问题解决与代码示例
是的,你确实遗漏了关键步骤——调用verify_domain_identity接口只会生成DNS验证所需的记录信息,不会自动将记录添加到Route53托管区,而AWS控制台GUI操作会自动帮你完成这一步关联,这就是两者的核心差异。
完整操作步骤与代码示例
1. 调用SES接口获取验证记录
首先通过boto3调用SES的verify_domain_identity,获取验证所需的TXT记录信息:
import boto3 # 初始化SES客户端(域名验证建议用us-east-1区域) ses_client = boto3.client('ses', region_name='us-east-1') domain = "your-domain.com" response = ses_client.verify_domain_identity(Domain=domain) # 提取验证信息并构造DNS记录模板 verification_token = response['VerificationToken'] dns_record = { 'Name': f'_amazonses.{domain}', 'Type': 'TXT', 'TTL': 300, 'ResourceRecords': [{'Value': f'"{verification_token}"'}] }
2. 通过Route53 API添加验证记录到托管区
接下来需要将构造好的TXT记录添加到对应域名的Route53托管区:
# 初始化Route53客户端 route53_client = boto3.client('route53') # 获取域名对应的托管区ID(已知ID可直接填写) def get_hosted_zone_id(domain): response = route53_client.list_hosted_zones_by_name(DNSName=domain) for zone in response['HostedZones']: # 匹配精确域名(托管区域名末尾带点) if zone['Name'] == f"{domain}.": return zone['Id'] raise ValueError(f"找不到域名{domain}对应的Route53托管区") hosted_zone_id = get_hosted_zone_id(domain) # 提交DNS记录变更 change_response = route53_client.change_resource_record_sets( HostedZoneId=hosted_zone_id, ChangeBatch={ 'Comment': '添加SES域名验证TXT记录', 'Changes': [ { 'Action': 'UPSERT', # 存在则更新,不存在则添加 'ResourceRecordSet': dns_record } ] } ) print(f"记录提交成功,变更ID:{change_response['ChangeInfo']['Id']}")
关键注意事项
- 权限:确保执行代码的AWS身份(IAM用户/角色)拥有
ses:VerifyDomainIdentity和route53:ChangeResourceRecordSets权限 - DNS格式:TXT记录的值必须用双引号包裹,这是DNS规范要求,否则验证会失败
- 生效时间:DNS记录生效通常需要5-15分钟,无需等待72小时,若长时间未验证通过,可通过
nslookup或dig命令检查TXT记录是否正确解析 - 区域选择:SES域名验证优先使用
us-east-1区域,部分核心功能依赖该区域
内容的提问来源于stack exchange,提问作者J.Todd
相关产品推荐
相关产品推荐

