使用Python Boto3创建Route53别名记录映射S3静态网站报错
问题分析
错误提示明确指向两个核心问题:
- 别名目标不在指定的托管区域内
- 无法找到该别名目标
根本原因是你在AliasTarget配置中错误使用了自身域名的托管区ID,而S3静态网站端点的别名记录必须使用AWS为对应区域S3服务分配的固定托管区ID,而非你自己域名的托管区ID。
解决方案
1. 获取对应区域的S3托管区ID
每个AWS区域的S3静态网站服务都有固定的托管区ID,例如ap-south-1区域对应的ID为Z32UQ3MIXQ8Y4H(不同区域的ID可通过AWS官方文档确认)。
2. 修改代码关键配置
将AliasTarget中的HostedZoneId替换为S3对应区域的托管区ID,同时确保DNSName以.结尾(符合Route53的DNS规范)。
修改后的完整代码
import boto3 def create_route53_alias_record(domain_name, record_name, s3_website_endpoint, my_hosted_zone_id, s3_hosted_zone_id): try: # 推荐使用IAM角色或环境变量管理凭证,避免硬编码密钥 route53_client = boto3.client('route53') print(s3_website_endpoint) changes = [{ 'Action': 'CREATE', 'ResourceRecordSet': { 'Name': f'{record_name}.{domain_name}.', 'Type': 'A', 'AliasTarget': { 'DNSName': f"{s3_website_endpoint}.", 'EvaluateTargetHealth': False, 'HostedZoneId': s3_hosted_zone_id, # 使用S3的托管区ID }, }, }] response = route53_client.change_resource_record_sets( HostedZoneId=my_hosted_zone_id, # 自身域名的托管区ID ChangeBatch={ 'Changes': changes } ) print(f"A record '{record_name}.{domain_name}' created successfully.") return True except Exception as e: print(f"Error creating A record: {e}") return False # 配置参数 domain_name = "domainname.com" record_name = "sp19" AWS_REGION = "ap-south-1" s3_bucket_name = "sp19.domainname.com" my_hosted_zone_id = "Z32UXXX" # 自身域名托管区ID s3_hosted_zone_id = "Z32UQ3MIXQ8Y4H" # ap-south-1区域S3托管区ID # 生成S3网站端点 s3_website_endpoint = f"{s3_bucket_name}.s3-website-{AWS_REGION}.amazonaws.com" # 执行创建操作 create_route53_alias_record(domain_name, record_name, s3_website_endpoint, my_hosted_zone_id, s3_hosted_zone_id)
额外注意事项
- 避免硬编码AWS密钥,优先使用IAM角色(如在EC2/ECS等AWS服务中运行)或环境变量管理凭证,提升安全性。
- 确保S3桶名称与待创建的子域名完全一致(示例中
sp19.domainname.com符合要求),这是S3绑定自定义域名的必要条件。 - 确认S3桶已正确启用静态网站托管,若需公共访问需配置对应的桶权限策略。
内容的提问来源于stack exchange,提问作者psp
相关产品推荐
相关产品推荐

