拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Terraform AWS Provider 中的 aws_elb_hosted_zone_id 数据源:为 Route 53 Alias 记录获取 ELB Classic 托管区域 ID

Terraform AWS Provider 中的 aws_elb_hosted_zone_id 数据源为 Route 53 Alias 记录获取 ELB Classic 托管区域 ID【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws本指南围绕 terraform-provider-aws 仓库中的aws_elb_hosted_zone_id数据源展开讲解如何按区域查询 AWS Elastic Load BalancingELB Classic的 HostedZoneId并将其用于 Route 53 Alias 记录避免在配置中硬编码区域对应的托管区域 ID。读完本文你将掌握该数据源的使用姿势、region参数的覆盖规则、返回值id的含义以及它背后基于源码维护的分区/区域映射表与真实测试验证。数据源的价值为什么需要托管区域 ID在 Route 53 中为 ELB 创建A记录时Alias 记录要求同时指定负载均衡器的 DNS 名称dns_name和它所属的托管区域 IDzone_id。ELB 的托管区域 ID 是按区域固定的静态值例如us-east-1对应Z35SXDOTRQ7X7K、eu-west-1对应Z32O12XQLNTSW2。这些值虽然公开但分散在 AWS 官方区域表中手工抄写容易出错且新增区域时需要人工同步。aws_elb_hosted_zone_id数据源正是为了解决这一问题它把「区域 → HostedZoneId」的映射内置在 Provider 中只需声明数据源并按需传入region即可在计划阶段解析出正确的托管区域 ID让 Route 53 Alias 配置可移植、可维护。快速开始完整可运行示例以下示例来自 官方数据源文档完整展示了「查询托管区域 ID → 配合aws_elb与aws_route53_record建立 Alias 记录」的典型链路data aws_elb_hosted_zone_id main {} resource aws_route53_record www { zone_id aws_route53_zone.primary.zone_id name example.com type A alias { name aws_elb.main.dns_name zone_id data.aws_elb_hosted_zone_id.main.id evaluate_target_health true } }配置要点aws_route53_record的alias块中zone_id直接引用数据源的id属性而不是写死某个区域常量name取aws_elb.main.dns_name即 Classic Load Balancer 的 DNS 名称与数据源返回的托管区域 ID 配套使用evaluate_target_health true表示 Alias 记录按目标 ELB 的健康状态参与 DNS 解析。当 Provider 的默认区域即为负载均衡器所在区域时aws_elb_hosted_zone_id可省略region参数直接使用如上例所示。参数与属性参考参数Arguments数据源仅支持一个可选参数参数类型必填说明regionstring否需要查询 AWS ELB HostedZoneId 的区域名称默认使用 Provider 配置 中设置的区域。region的存在使得「负载均衡器区域」与「Provider 默认区域」可以解耦例如 Provider 配置在us-east-1但 ELB 部署在eu-west-1时可通过region eu-west-1单独取数。属性Attributes数据源导出以下属性属性说明id所选区域的 AWS ELB HostedZoneId 字符串值也是本数据源唯一有意义的输出。注意该数据源的 Schema 本身不声明任何字段region通过 Provider 侧的区域解析注入id则在 Read 阶段直接写入属于典型的「仅输出一个 ID」的数据源。指定区域查询显式 region 用法当需要跨区域查询时显式传入regiondata aws_elb_hosted_zone_id regional { region eu-west-1 } output elb_hz_id { value data.aws_elb_hosted_zone_id.regional.id # Z32O12XQLNTSW2 }该用法在仓库的 数据源测试 中有直接印证测试用例testAccHostedZoneIDDataSourceConfig_explicitRegion传入region eu-west-1并断言结果等于Z32O12XQLNTSW2。另一个用例不传region则断言结果等于HostedZoneIDPerRegionMap[acctest.Region()]即测试运行区域在映射表中对应的值。源码级实现区域映射表与读取逻辑核心映射表数据源的实现位于 internal/service/elb/hosted_zone_id_data_source.go。文件顶部定义了一个包级变量hostedZoneIDPerRegionMap以endpoints.RegionRegionID常量为键、托管区域 ID 为值覆盖商业分区、中国分区与 GovCloud 分区共 38 个区域区域HostedZoneIdaf-south-1Z268VQBMOI5EKXap-east-1Z3DQVH9N71FHZ0ap-east-2Z02789141MW7T1WBU19POap-northeast-1Z14GRHDCWA56QTap-northeast-2ZWKZPGTI48KDXap-northeast-3Z5LXEXXYW11ESap-south-1ZP97RAFLXTNZKap-south-2Z0173938T07WNTVAEPZNap-southeast-1Z1LMS91P8CMLE5ap-southeast-2Z1GM3OXH4ZPM65ap-southeast-3Z08888821HLRG5A9ZRTERap-southeast-4Z09517862IB2WZLPXG76Fap-southeast-5Z06010284QMVVW7WO5Jap-southeast-6Z023301818UFJ50CIO0MVap-southeast-7Z0390008CMBRTHFGWBCBca-central-1ZQSVJUPU6J1EYca-west-1Z06473681N0SF6OS049SDcn-north-1Z1GDH35T77C1KEcn-northwest-1ZM7IZAIOVVDZFeu-central-1Z215JYRZR1TBD5eu-central-2Z06391101F2ZOEP8P5EB3eu-north-1Z23TAZ6LKFMNIOeu-south-1Z3ULH7SSC9OV64eu-south-2Z0956581394HF5D5LXGAPeu-west-1Z32O12XQLNTSW2eu-west-2ZHURV8PSTC4K8eu-west-3Z3Q77PNBQS71R4il-central-1Z09170902867EHPV2DABUme-central-1Z08230872XQRWHG2XF6Ime-south-1ZS929ML54UICDmx-central-1Z023552324OKD1BB28BH5sa-east-1Z2P70J7HTTTPLUus-east-1Z35SXDOTRQ7X7Kus-east-2Z3AADJGX6KTTL2us-gov-east-1Z166TLBEWOO7G0us-gov-west-1Z33AYJ8TM3BH4Jus-west-1Z368ELLRRE2KJ0us-west-2Z1H1FL5HABSF5源码注释表明该表依据 AWS 官方区域文档维护// See https://docs.aws.amazon.com/general/latest/gr/elb.html#elb_region.任何新区域上线都需同步更新此表这正是把「静态知识」收编进 Provider 的好处。读取流程dataSourceHostedZoneIDRead是整个数据源的读取核心hosted_zone_id_data_source.go从meta.(*conns.AWSClient).Region(ctx)取当前生效区域——region参数未指定时即 Provider 默认区域指定时则为覆盖后的区域在hostedZoneIDPerRegionMap中按区域名查表命中则调用d.SetId(v)将映射值写入id属性未命中则通过sdkdiag.AppendErrorf返回unsupported ELB Region (%s)错误。可以看出该数据源不发起任何 AWS API 调用完全依赖内置静态映射表因此速度快、无额外成本也不受 API 权限影响。数据源注册与区域语义在 internal/service/elb/service_package_gen.go 中该数据源被注册为aws_elb_hosted_zone_id其区域配置使用inttypes.ResourceRegionNoPartitionValidation()。对照 internal/types/service_package.go 的定义这表示允许按资源覆盖区域但覆盖值不校验是否属于当前分区。这正是中国区、GovCloud 等分区能正常取数的基础——例如cn-north-1与us-gov-east-1都能通过映射表返回各自分区的托管区域 ID。测试验证hosted_zone_id_data_source_test.go 中的TestAccELBHostedZoneIDDataSource_basic覆盖了两个关键场景不传region时断言id等于HostedZoneIDPerRegionMap[acctest.Region()]即与当前测试区域映射一致显式传region eu-west-1时断言id精确等于Z32O12XQLNTSW2。测试通过tfelb.HostedZoneIDPerRegionMap引用映射表——该变量由 internal/service/elb/exports_test.go 从包内导出仅供测试使用。运行测试的命令为make testacc TESTSTestAccELBHostedZoneIDDataSource_basic PKGelb实战建议与注意事项优先使用数据源而非硬编码即使你知道所在区域的 HostedZoneId也建议用本数据源引用以便未来区域表更新如新增区域、调整值时配置自动跟随 Provider 版本演进区分 ELB Classic 与 ELB 新版本aws_elb_hosted_zone_id面向的是 Classic Load Balanceraws_elb如果你使用的是 ALB/NLBaws_lb其托管区域 ID 可直接从aws_lb资源或对应数据源的zone_id属性获取不必使用本数据源关注区域覆盖语义region覆盖不校验分区跨分区取数也能返回结果但请确保取值符合实际资源所在区域避免 Alias 指向错误的托管区域识别不可用区域当请求的区域不在映射表中时数据源会直接报错unsupported ELB Region属于预期的显式失败便于尽早发现配置错误。小结aws_elb_hosted_zone_id是一个体积小巧但非常实用的数据源它以仓库源码中维护的 38 个区域映射表为数据基础把「区域 → ELB 托管区域 ID」的静态知识固化进 Provider配合aws_route53_record的alias块即可完成 Route 53 到 ELB Classic 的稳定解析。无论 Provider 默认区域是否与 ELB 一致都能通过可选的region参数精确取数并用单元/验收测试保障映射正确性是理解 terraform-provider-aws「以数据源消除硬编码」设计思路的典型范例。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门