ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

terraform-provider-aws 之 aws_availability_zone 数据源:AZ 校验、名称拆分与跨区域网络规划实战

terraform-provider-aws 之 aws_availability_zone 数据源:AZ 校验、名称拆分与跨区域网络规划实战 terraform-provider-aws 之 aws_availability_zone 数据源AZ 校验、名称拆分与跨区域网络规划实战【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws本文围绕 HashiCorp terraform-provider-aws 中aws_availability_zone单数数据源展开讲解如何按名称或 Zone ID 精确查询当前 Region 内某个可用区Availability Zone简称 AZ的详细信息并利用其返回的region、name_suffix等属性完成“AZ 名称 → Region 字母后缀”的拆分进而驱动 VPC/子网 CIDR 的系统化编号等场景。读完本文你将掌握该数据源全部参数、导出属性、超时配置并理解其底层DescribeAvailabilityZonesAPI 调用与name_suffix计算逻辑可直接在配置中落地使用。数据源定位单数与复数数据源的分工aws_availability_zone数据源用于获取某一个特定可用区的详情适用于需要精确锁定单个 AZ 的场景。它通过name或zone_id等条件查询 EC2 的可用区信息并可同时配合filter、state、all_availability_zones等参数进一步限定匹配范围。它与复数版aws_availability_zones数据源实现见 ec2_availability_zones_data_source.go有明显分工复数版返回的是当前 Region 内可用区的列表names、zone_ids等属性而单数版返回单个 AZ 的完整元数据分组、网络边界组、父区域、区域类型等。实际使用中两者经常配合先用复数数据源枚举可用区再按需用单数数据源深入查询其中一个。该数据源的典型用途有两个校验校验变量中给定的 AZ 名称是否真实存在、状态是否满足要求避免配置拼写错误或使用不可用区域拆分名称将形如eu-central-1a的 AZ 名称拆分为 Regioneu-central-1与 AZ 字母后缀a两部分从而在多个 Region 间实现一致的子网编号方案——例如将 Region 与子网字母分别映射为网络号参与 VPC/子网 CIDR 的系统化推导。实战示例由 AZ 名称系统化推导 VPC 与子网 CIDR文档提供了一个完整的实战示例先为 Region 名和 AZ 字母分别建立编号映射表再通过aws_availability_zone数据源拿到 AZ 的region与name_suffix最后用cidrsubnet函数推导出 VPC 与子网的 CIDR 前缀。variable region_number { # Arbitrary mapping of region name to number to use in # a VPCs CIDR prefix. default { us-east-1 1 us-west-1 2 us-west-2 3 eu-central-1 4 ap-northeast-1 5 } } variable az_number { # Assign a number to each AZ letter used in our configuration default { a 1 b 2 c 3 d 4 e 5 f 6 } } # Retrieve the AZ where we want to create network resources # This must be in the region selected on the AWS provider. data aws_availability_zone example { name eu-central-1a } # Create a VPC for the region associated with the AZ resource aws_vpc example { cidr_block cidrsubnet(10.0.0.0/8, 4, var.region_number[data.aws_availability_zone.example.region]) } # Create a subnet for the AZ within the regional VPC resource aws_subnet example { vpc_id aws_vpc.example.id cidr_block cidrsubnet(aws_vpc.example.cidr_block, 4, var.az_number[data.aws_availability_zone.example.name_suffix]) }整个推导链路清晰data.aws_availability_zone.example.region返回eu-central-1data.aws_availability_zone.example.name_suffix返回a分别作为region_number与az_number两个映射表的键外层cidrsubnet(10.0.0.0/8, 4, ...)从10.0.0.0/8大网段中切出第region_number号/12网段内层再按az_number在/12内切出/16子网段。只要各 Region 与 AZ 字母的编号映射保持一致跨 Region 的网络规划就能自动对齐无需为每个环境手写 CIDR。Argument Reference查询参数详解该数据源支持以下参数均可选但至少应提供一个能唯一定位的条件例如name或zone_id参数类型说明all_availability_zonesbool设为true时查询范围扩展至所有可用区以及无论你是否已 opt-in 的 Local Zones 和 Wavelength Zones。适用于边缘站点场景。filter块过滤配置块可声明多个多个过滤器之间按“与”关系叠加。详见下方 filter 块说明。namestring要查询的可用区完整名称例如eu-central-1a。regionstring数据源管理的目标 Region默认取 AWS Provider 配置中设置的 Region。statestring要求的可用区状态取值可为available、information或impaired。zone_idstring要查询的可用区Zone ID例如eue1-az1。其中name、zone_id是互斥但等价的两种定位方式state、filter、all_availability_zones则用于在可能命中多条记录时收窄范围。从源码看见 ec2_availability_zone_data_source.go这些参数的 Schema 定义中name、state、zone_id均为Optional Computed即未显式指定时也会回填查询结果all_availability_zones与filter则仅Optional。filter 块filter块支持以下两个参数name-必填过滤器字段名。合法取值可参考 EC2DescribeAvailabilityZonesAPI 文档中支持的过滤器例如zone-name、zone-type、opt-in-status、group-name、region-name等具体以 AWS API 实际支持列表为准。values-必填该过滤字段可接受的取值集合只要命中其中任意一个值即视为匹配。filter常用于替代或增强state、name等参数例如同时按zone-typelocal-zone与opt-in-statusopted-in过滤出已开通的边缘站点。测试文件 ec2_availability_zone_data_source_test.go 中即展示了以zone-name为过滤字段、以复数数据源返回的第一个 AZ 名称作为values的用法。Attribute Reference导出属性详解除上述参数外该数据源还导出以下属性均为Computed由 AWS 查询结果回填属性类型说明group_long_namestring可用区组、Local Zone 组或 Wavelength Zone 组的长名称。group_namestring区域组的名称例如us-east-1-zg-1、us-west-2-lax-1、us-east-1-wl1-bos-wlz-1。name_suffixstringAZ 名称中位于 Region 名之后的部分用于在 Region 内唯一标识该 AZ。对普通可用区通常为单个字母例如us-west-2a的a对 Local Zone / Wavelength Zone 则为更长的字符串例如us-west-2-wl1-sfo-wlz-1的wl1-sfo-wlz-1。network_border_groupstring地址被通告的位置网络边界组名称。opt_in_statusstring开通状态。普通可用区恒为opt-in-not-requiredLocal Zone 等边缘站点则为opted-in或not-opted-in。parent_zone_idstring负责 Local Zone 或 Wavelength Zone 部分控制面操作如 API 调用的父可用区 ID。普通可用区为空字符串。parent_zone_namestring负责上述控制面操作的父可用区名称。普通可用区为空字符串。zone_typestring区域类型取值为availability-zone、local-zone或wavelength-zone。此外文档所列参数中的name、region、state、zone_id在查询后也会作为可引用属性回填实际值源码中通过d.Set写回见 ec2_availability_zone_data_source.go。测试用例 ec2_availability_zone_data_source_test.go 对这些属性做了系统断言普通可用区的zone_type为availability-zone、opt_in_status为opt-in-not-required、parent_zone_id/parent_zone_name为空、network_border_group等于当前测试 Region而 Local Zone / Wavelength Zone 场景下则断言opt_in_status为opted-in、parent_zone_id与parent_zone_name非空。Timeouts读取超时该数据源支持read操作的超时配置默认值为20m20 分钟。超时配置语法与 Terraform 资源的 operation timeouts 一致data aws_availability_zone example { name eu-central-1a timeouts { read 20m } }源码中该超时通过 SDKv2 的schema.ResourceTimeout声明见 ec2_availability_zone_data_source.go即Read默认20 * time.Minute。实际生产中查询极快此超时主要作为极端情况下的兜底保护。源码级实现数据源背后的调用链要深入理解该数据源的行为可以顺藤摸瓜阅读 EC2 服务模块中的三处实现。1. Schema 与读取入口。数据源定义于 ec2_availability_zone_data_source.go通过SDKDataSource(aws_availability_zone, ...)注解注册采用 SDKv2 实现ReadWithoutTimeout指向dataSourceAvailabilityZoneRead。2. 参数到 API 请求的映射。读取函数ec2_availability_zone_data_source.go将 Terraform 参数映射为 EC2DescribeAvailabilityZones请求字段all_availability_zones→input.AllAvailabilityZoneszone_id→input.ZoneIdsname→input.ZoneNamesstate→ 通过newAttributeFilterList构造state过滤器filter块 → 通过newCustomFilterList追加自定义过滤器值得注意的一个细节如果最终过滤条件为空代码会显式将input.Filters置为nil因为 EC2 API 不接受空的 filters 列表见 ec2_availability_zone_data_source.go。3. 单一结果断言与name_suffix计算。查询通过 find.go 中的findAvailabilityZone完成先调用DescribeAvailabilityZones再用tfresource.AssertSingleValueResult断言必须恰好命中一条记录若命中 0 条或多条会返回tfresource.SingularDataSourceFindErrorTerraform 会给出明确的多选/未找到错误提示。随后在读取函数中计算name_suffix取ZoneName去掉RegionName前缀后的剩余部分并针对 Local Zone / Wavelength Zone 的长后缀TrimLeft去掉前导-见 ec2_availability_zone_data_source.go。最终数据源的 ID 被设置为 AZ 完整名称az.ZoneName第 138 行因此data.aws_availability_zone.example.id即形如eu-central-1a的字符串。测试覆盖属性契约如何被验证该数据源的行为由一组并行验收测试锁定见 ec2_availability_zone_data_source_test.go分别覆盖六种典型查询路径TestAccEC2AvailabilityZoneDataSource_allAvailabilityZones通过all_availability_zones true查询TestAccEC2AvailabilityZoneDataSource_filter通过filter块按zone-name查询TestAccEC2AvailabilityZoneDataSource_name按name查询TestAccEC2AvailabilityZoneDataSource_zoneID按zone_id查询TestAccEC2AvailabilityZoneDataSource_localZone/wavelengthZone查询 Local Zone 与 Wavelength Zone 边缘站点。测试断言中几个关键点值得注意普通可用区的name_suffix匹配正则^[a-z]$单字母而 Local / Wavelength Zone 的name_suffix匹配^[0-9a-z][0-9a-z-]$长后缀region属性等于当前测试 Regionname、zone_id与复数数据源返回的第一个条目严格配对TestCheckResourceAttrPair。这些断言与文档中的属性说明一一对应可以作为该数据源行为契约的权威参考。实践要点小结定位单个 AZ优先使用name或zone_id精确指定若不确定确切名称可先用aws_availability_zones复数数据源枚举后再引用两者可组合出“先列表、后深入”的模式。状态与范围控制生产配置建议同时给出state available避免引用impaired状态的可用区涉及 Local Zone / Wavelength Zone 时需设置all_availability_zones true并注意opt_in_status会如实反映开通状态。错误信息可读性当匹配结果不唯一或为空时AssertSingleValueResult会生成明确的单数数据源错误这要求查询条件必须收敛到唯一 AZ。跨 Region 网络规划充分利用regionname_suffix的组合配合cidrsubnet与编号映射表可实现多 Region 多 AZ 子网 CIDR 的自动化推导这是该数据源最具代表性的工程用法。如需进一步阅读可继续查看数据源文档原文 availability_zone.html.markdown、复数数据源实现 ec2_availability_zones_data_source.go、查询辅助函数 find.go以及完整的验收测试 ec2_availability_zone_data_source_test.go。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表