據(jù)源:為 Route 53 Alias 記錄獲取 ELB Classic 托管區(qū)域 ID)
Terraform AWS Provider 中的 aws_elb_hosted_zone_id 數(shù)據(jù)源為 Route 53 Alias 記錄獲取 ELB Classic 托管區(qū)域 ID【免費(fèi)下載鏈接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws本指南圍繞 terraform-provider-aws 倉庫中的aws_elb_hosted_zone_id數(shù)據(jù)源展開講解如何按區(qū)域查詢 AWS Elastic Load BalancingELB Classic的 HostedZoneId并將其用于 Route 53 Alias 記錄避免在配置中硬編碼區(qū)域?qū)?yīng)的托管區(qū)域 ID。讀完本文你將掌握該數(shù)據(jù)源的使用姿勢、region參數(shù)的覆蓋規(guī)則、返回值id的含義以及它背后基于源碼維護(hù)的分區(qū)/區(qū)域映射表與真實(shí)測試驗(yàn)證。數(shù)據(jù)源的價(jià)值為什么需要托管區(qū)域 ID在 Route 53 中為 ELB 創(chuàng)建A記錄時(shí)Alias 記錄要求同時(shí)指定負(fù)載均衡器的 DNS 名稱dns_name和它所屬的托管區(qū)域 IDzone_id。ELB 的托管區(qū)域 ID 是按區(qū)域固定的靜態(tài)值例如us-east-1對應(yīng)Z35SXDOTRQ7X7K、eu-west-1對應(yīng)Z32O12XQLNTSW2。這些值雖然公開但分散在 AWS 官方區(qū)域表中手工抄寫容易出錯(cuò)且新增區(qū)域時(shí)需要人工同步。aws_elb_hosted_zone_id數(shù)據(jù)源正是為了解決這一問題它把「區(qū)域 → HostedZoneId」的映射內(nèi)置在 Provider 中只需聲明數(shù)據(jù)源并按需傳入region即可在計(jì)劃階段解析出正確的托管區(qū)域 ID讓 Route 53 Alias 配置可移植、可維護(hù)。快速開始完整可運(yùn)行示例以下示例來自 官方數(shù)據(jù)源文檔完整展示了「查詢托管區(qū)域 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 } }配置要點(diǎn)aws_route53_record的alias塊中zone_id直接引用數(shù)據(jù)源的id屬性而不是寫死某個(gè)區(qū)域常量name取aws_elb.main.dns_name即 Classic Load Balancer 的 DNS 名稱與數(shù)據(jù)源返回的托管區(qū)域 ID 配套使用evaluate_target_health true表示 Alias 記錄按目標(biāo) ELB 的健康狀態(tài)參與 DNS 解析。當(dāng) Provider 的默認(rèn)區(qū)域即為負(fù)載均衡器所在區(qū)域時(shí)aws_elb_hosted_zone_id可省略region參數(shù)直接使用如上例所示。參數(shù)與屬性參考參數(shù)Arguments數(shù)據(jù)源僅支持一個(gè)可選參數(shù)參數(shù)類型必填說明regionstring否需要查詢 AWS ELB HostedZoneId 的區(qū)域名稱默認(rèn)使用 Provider 配置 中設(shè)置的區(qū)域。region的存在使得「負(fù)載均衡器區(qū)域」與「Provider 默認(rèn)區(qū)域」可以解耦例如 Provider 配置在us-east-1但 ELB 部署在eu-west-1時(shí)可通過region eu-west-1單獨(dú)取數(shù)。屬性Attributes數(shù)據(jù)源導(dǎo)出以下屬性屬性說明id所選區(qū)域的 AWS ELB HostedZoneId 字符串值也是本數(shù)據(jù)源唯一有意義的輸出。注意該數(shù)據(jù)源的 Schema 本身不聲明任何字段region通過 Provider 側(cè)的區(qū)域解析注入id則在 Read 階段直接寫入屬于典型的「僅輸出一個(gè) ID」的數(shù)據(jù)源。指定區(qū)域查詢顯式 region 用法當(dāng)需要跨區(qū)域查詢時(shí)顯式傳入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 }該用法在倉庫的 數(shù)據(jù)源測試 中有直接印證測試用例testAccHostedZoneIDDataSourceConfig_explicitRegion傳入region eu-west-1并斷言結(jié)果等于Z32O12XQLNTSW2。另一個(gè)用例不傳region則斷言結(jié)果等于HostedZoneIDPerRegionMap[acctest.Region()]即測試運(yùn)行區(qū)域在映射表中對應(yīng)的值。源碼級(jí)實(shí)現(xiàn)區(qū)域映射表與讀取邏輯核心映射表數(shù)據(jù)源的實(shí)現(xiàn)位于 internal/service/elb/hosted_zone_id_data_source.go。文件頂部定義了一個(gè)包級(jí)變量hostedZoneIDPerRegionMap以endpoints.RegionRegionID常量為鍵、托管區(qū)域 ID 為值覆蓋商業(yè)分區(qū)、中國分區(qū)與 GovCloud 分區(qū)共 38 個(gè)區(qū)域區(qū)域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源碼注釋表明該表依據(jù) AWS 官方區(qū)域文檔維護(hù)// See https://docs.aws.amazon.com/general/latest/gr/elb.html#elb_region.任何新區(qū)域上線都需同步更新此表這正是把「靜態(tài)知識(shí)」收編進(jìn) Provider 的好處。讀取流程dataSourceHostedZoneIDRead是整個(gè)數(shù)據(jù)源的讀取核心hosted_zone_id_data_source.go從meta.(*conns.AWSClient).Region(ctx)取當(dāng)前生效區(qū)域——region參數(shù)未指定時(shí)即 Provider 默認(rèn)區(qū)域指定時(shí)則為覆蓋后的區(qū)域在hostedZoneIDPerRegionMap中按區(qū)域名查表命中則調(diào)用d.SetId(v)將映射值寫入id屬性未命中則通過sdkdiag.AppendErrorf返回unsupported ELB Region (%s)錯(cuò)誤??梢钥闯鲈摂?shù)據(jù)源不發(fā)起任何 AWS API 調(diào)用完全依賴內(nèi)置靜態(tài)映射表因此速度快、無額外成本也不受 API 權(quán)限影響。數(shù)據(jù)源注冊與區(qū)域語義在 internal/service/elb/service_package_gen.go 中該數(shù)據(jù)源被注冊為aws_elb_hosted_zone_id其區(qū)域配置使用inttypes.ResourceRegionNoPartitionValidation()。對照 internal/types/service_package.go 的定義這表示允許按資源覆蓋區(qū)域但覆蓋值不校驗(yàn)是否屬于當(dāng)前分區(qū)。這正是中國區(qū)、GovCloud 等分區(qū)能正常取數(shù)的基礎(chǔ)——例如cn-north-1與us-gov-east-1都能通過映射表返回各自分區(qū)的托管區(qū)域 ID。測試驗(yàn)證hosted_zone_id_data_source_test.go 中的TestAccELBHostedZoneIDDataSource_basic覆蓋了兩個(gè)關(guān)鍵場景不傳region時(shí)斷言id等于HostedZoneIDPerRegionMap[acctest.Region()]即與當(dāng)前測試區(qū)域映射一致顯式傳region eu-west-1時(shí)斷言id精確等于Z32O12XQLNTSW2。測試通過tfelb.HostedZoneIDPerRegionMap引用映射表——該變量由 internal/service/elb/exports_test.go 從包內(nèi)導(dǎo)出僅供測試使用。運(yùn)行測試的命令為make testacc TESTSTestAccELBHostedZoneIDDataSource_basic PKGelb實(shí)戰(zhàn)建議與注意事項(xiàng)優(yōu)先使用數(shù)據(jù)源而非硬編碼即使你知道所在區(qū)域的 HostedZoneId也建議用本數(shù)據(jù)源引用以便未來區(qū)域表更新如新增區(qū)域、調(diào)整值時(shí)配置自動(dòng)跟隨 Provider 版本演進(jìn)區(qū)分 ELB Classic 與 ELB 新版本aws_elb_hosted_zone_id面向的是 Classic Load Balanceraws_elb如果你使用的是 ALB/NLBaws_lb其托管區(qū)域 ID 可直接從aws_lb資源或?qū)?yīng)數(shù)據(jù)源的zone_id屬性獲取不必使用本數(shù)據(jù)源關(guān)注區(qū)域覆蓋語義region覆蓋不校驗(yàn)分區(qū)跨分區(qū)取數(shù)也能返回結(jié)果但請確保取值符合實(shí)際資源所在區(qū)域避免 Alias 指向錯(cuò)誤的托管區(qū)域識(shí)別不可用區(qū)域當(dāng)請求的區(qū)域不在映射表中時(shí)數(shù)據(jù)源會(huì)直接報(bào)錯(cuò)unsupported ELB Region屬于預(yù)期的顯式失敗便于盡早發(fā)現(xiàn)配置錯(cuò)誤。小結(jié)aws_elb_hosted_zone_id是一個(gè)體積小巧但非常實(shí)用的數(shù)據(jù)源它以倉庫源碼中維護(hù)的 38 個(gè)區(qū)域映射表為數(shù)據(jù)基礎(chǔ)把「區(qū)域 → ELB 托管區(qū)域 ID」的靜態(tài)知識(shí)固化進(jìn) Provider配合aws_route53_record的alias塊即可完成 Route 53 到 ELB Classic 的穩(wěn)定解析。無論 Provider 默認(rèn)區(qū)域是否與 ELB 一致都能通過可選的region參數(shù)精確取數(shù)并用單元/驗(yàn)收測試保障映射正確性是理解 terraform-provider-aws「以數(shù)據(jù)源消除硬編碼」設(shè)計(jì)思路的典型范例?!久赓M(fèi)下載鏈接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.項(xiàng)目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考