terraform-provider-aws 数据源 aws_lb_hosted_zone_id 完全指南为 Route 53 别名记录动态获取 ELB Hosted Zone 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_lb_hosted_zone_id展开讲解如何在不同区域为 Application Load BalancerALB与 Network Load BalancerNLB动态获取 AWS 托管的 Hosted Zone ID并将其应用于 Route 53 别名Alias记录的zone_id字段。读完本文你将掌握该数据源的参数语义、输出属性、底层实现原理区域映射表与读取逻辑以及如何避免在配置中硬编码区域化 Zone ID。数据源的作用与适用场景AWS 的弹性负载均衡服务Elastic Load Balancing在创建时会为每个区域分配一组固定的、由 AWS 托管的 Hosted Zone ID形如Z35SXDOTRQ7X7K、Z2IFOLAFXWLO4F。当你需要为负载均衡器创建 Route 53 别名记录Alias Record时别名块的zone_id字段必须填写负载均衡器所在区域的这个 ID。由于该 ID 随区域与负载均衡器类型不同而变化直接在配置中硬编码会导致配置难以跨区域复用。aws_lb_hosted_zone_id数据源正是为此设计它由官方文档定义见 website/docs/d/lb_hosted_zone_id.html.markdown可以根据当前 Provider 配置的区域或显式指定的region与负载均衡器类型application或network返回对应的 Hosted Zone ID。示例用法与 Route 53 别名记录组合文档给出了最典型的使用方式——在aws_route53_record的alias块中引用数据源的iddata aws_lb_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_lb.main.dns_name zone_id data.aws_lb_hosted_zone_id.main.id evaluate_target_health true } }要点说明zone_id指向数据源导出的id即 ALB 在当前区域对应的 Hosted Zone IDname使用aws_lb.main.dns_name即负载均衡器的 DNS 名称默认情况下数据源按application类型取值若负载均衡器是 NLB需要显式声明load_balancer_type network。Argument Reference参数与默认行为该数据源支持以下参数来源website/docs/d/lb_hosted_zone_id.html.markdown参数类型必选说明regionstring否需要查询 Hosted Zone ID 的 AWS 区域名称。默认使用 Provider 配置 中设置的区域。load_balancer_typestring否负载均衡器类型可选值为application或network默认值为application。region的默认取值机制当不指定region时数据源读取 Provider 上下文中配置的区域。从源码实现看读取逻辑位于 internal/service/elbv2/hosted_zone_id_data_source.gofunc dataSourceHostedZoneIDRead(ctx context.Context, d *schema.ResourceData, meta any) diag.Diagnostics { lbType : awstypes.LoadBalancerTypeEnumApplication if v, ok : d.GetOk(load_balancer_type); ok { lbType awstypes.LoadBalancerTypeEnum(v.(string)) } switch region : meta.(*conns.AWSClient).Region(ctx); lbType { case awstypes.LoadBalancerTypeEnumApplication: ... case awstypes.LoadBalancerTypeEnumNetwork: ... } return diags }meta.(*conns.AWSClient).Region(ctx)取自 Provider 运行时上下文internal/conns包因此默认区域与 Provider 配置一致。同时该数据源标注了// Region(validateOverrideInPartitionfalse)允许显式覆盖区域并跳过分区校验这正是测试用例中显式指定eu-west-1能够生效的原因。load_balancer_type的取值约束数据源 schema 在 internal/service/elbv2/hosted_zone_id_data_source.go 中定义了类型约束load_balancer_type: { Type: schema.TypeString, Optional: true, Default: awstypes.LoadBalancerTypeEnumApplication, ValidateDiagFunc: validation.ToDiagFunc(validation.StringInSlice( enum.Slice(awstypes.LoadBalancerTypeEnumApplication, awstypes.LoadBalancerTypeEnumNetwork), false)), },即该参数仅接受application与network两个取值传入其他值会在校验阶段直接报错不传时默认为application。Attribute Reference导出属性该数据源在参数之外导出一个属性id—— 所选区域下对应负载均衡器类型的 AWS ELB Hosted Zone ID如Z35SXDOTRQ7X7K。需要注意文档明确指出该数据源导出属性仅id一个实际用法中应通过data.aws_lb_hosted_zone_id.xxx.id引用。源码级原理区域 → Hosted Zone ID 映射表该数据源的实现不调用任何 AWS API而是基于一组内置的静态映射表完成查询。ALB 与 NLB 各自拥有一张独立的映射表来源internal/service/elbv2/hosted_zone_id_data_source.gohostedZoneIDPerRegionALBMapALB 在每个区域对应的 Hosted Zone IDhostedZoneIDPerRegionNLBMapNLB 在每个区域对应的 Hosted Zone ID。从源码结构可以推断其查询流程根据load_balancer_type选择对应的映射表再以当前区域或显式指定的region为键查表命中则写入id未命中则返回错误unsupported ELBv2 Region (%s)。值得留意的是同一区域内 ALB 与 NLB 的 Zone ID 往往不同。例如在eu-west-1ALBZ32O12XQLNTSW2NLBZ2IFOLAFXWLO4F这意味着在为 NLB 创建别名记录时若忘记设置load_balancer_type network将拿到错误的 Zone ID导致 DNS 解析指向错误的托管区。这也是该参数存在的核心价值。与经典负载均衡Classic ELB数据源的差异本仓库还提供一个面向 Classic ELB 的数据源aws_elb_hosted_zone_id文档见 website/docs/d/elb_hosted_zone_id.html.markdown实现见 internal/service/elb/hosted_zone_id_data_source.go。两者核心差异如下对比项aws_lb_hosted_zone_idaws_elb_hosted_zone_id适用对象ALB / NLBELBv2Classic ELBload_balancer_type参数支持application/network不支持映射表ALB 与 NLB 各一张单一映射表未命中区域时错误信息unsupported ELBv2 Regionunsupported ELB Region从 internal/service/elb/hosted_zone_id_data_source.go 可以看到 Classic 版本仅维护一张hostedZoneIDPerRegionMap其部分区域取值与 ALB 相同如us-east-1均为Z35SXDOTRQ7X7K但不能覆盖 NLB 的差异化取值。如果你的基础设施使用 NLB请务必选择aws_lb_hosted_zone_id并显式声明类型。测试验证行为如何被保障仓库为数据源编写了完整的 acceptance test见 internal/service/elbv2/hosted_zone_id_data_source_test.go。测试用例覆盖了四种组合可作为最佳实践参考# 1. 默认场景当前区域 application默认类型 data aws_lb_hosted_zone_id main {} # 2. 显式指定区域eu-west-1的 ALB data aws_lb_hosted_zone_id regional { region eu-west-1 } # 3. 当前区域的 NLB data aws_lb_hosted_zone_id network { load_balancer_type network } # 4. 显式指定区域eu-west-1的 NLB data aws_lb_hosted_zone_id network-regional { region eu-west-1 load_balancer_type network }测试断言如TestAccELBV2HostedZoneIDDataSource_basic会校验默认调用返回的id等于HostedZoneIDPerRegionALBMap[acctest.Region()]显式region eu-west-1时 ALB 返回Z32O12XQLNTSW2、NLB 返回Z2IFOLAFXWLO4F。为保证测试可访问内部映射表仓库在 internal/service/elbv2/exports_test.go 中导出了HostedZoneIDPerRegionALBMap与HostedZoneIDPerRegionNLBMap注释明确说明“Exports for use in tests only”仅用于测试。使用注意事项与最佳实践NLB 必须显式声明类型默认值为application为 NLB 建别名记录时务必添加load_balancer_type network否则 Zone ID 错误区域自动跟随 Provider若你的 Provider 配置了region可省略数据源的region参数需要跨区域引用时再显式指定优先使用数据源而非硬编码不同区域、不同类型的 Zone ID 取值不同使用数据源可保持配置可移植region覆盖不校验分区数据源标注了validateOverrideInPartitionfalse允许指定任意区域值但未被映射表收录的区域会返回unsupported ELBv2 Region错误仅有一个导出属性该数据源导出id属性不要在配置中引用不存在的属性名。将上述要点与 示例用法 中的配置组合即可在任意区域稳定地为 ALB/NLB 生成正确的 Route 53 别名记录彻底告别手抄区域 Zone ID 的维护负担。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考