ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

使用 aws_networkmanager_site 数据源查询 AWS Network Manager 站点详情

2026/9/19 4:43:31 拓冰建站 浏览量
使用 aws_networkmanager_site 数据源查询 AWS Network Manager 站点详情 使用 aws_networkmanager_site 数据源查询 AWS Network Manager 站点详情【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws本篇指南面向使用 Terraform AWS Provider 管理云网络资源的开发者系统讲解aws_networkmanager_site数据源的完整用法如何通过global_network_id与site_id两个必填参数精确读取某个已存在 Network Manager 站点的 ARN、描述、地理位置与标签等属性并深入源码层面剖析其底层读取流程GetSitesAPI 调用、事件一致性校验、location 展开逻辑帮助读者在 Terraform 配置中安全、高效地引用已有站点数据避免硬编码 ID 与重复管理。Network Manager Site 是什么在 AWS Network Manager 的模型体系中Global Network全球网络是承载企业整个云网络拓扑的顶层容器而 Site站点则代表其中的一个物理部署位置例如某地办公室、分支机构或数据中心。一个 Global Network 下可以挂载多个 Site每个 Site 下再关联 Device设备与 Link链路从而把分散的基础设施抽象成一张可统一管理的逻辑网络。aws_networkmanager_site数据源Data Source的作用就是在不创建或修改任何资源的前提下读取一个已存在站点的全部详情并把它们暴露为 Terraform 属性供其他配置引用。这一点与同名的aws_networkmanager_site资源负责创建、更新、删除站点形成互补——数据源只读资源可写。从本仓库的注册文件 internal/service/networkmanager/service_package_gen.go 可以看到Network Manager 服务包同时注册了数据源aws_networkmanager_siteDataSources 段与资源aws_networkmanager_siteResources 段二者共享同一套底层查询逻辑只是入口与语义不同。数据源参数参考Argument Reference该数据源支持的参数非常简单全部为必填项参数是否必填说明global_network_id必填目标站点所属 Global Network 的 IDsite_id必填要读取的具体站点 ID在源码 site_data_source.go 中这两个参数均被定义为Required: true的字符串类型。之所以两者都必填是因为站点 ID 本身只在所属 Global Network 的命名空间内唯一——AWS 的GetSitesAPI 要求同时提供GlobalNetworkId与SiteIds才能精确定位站点这一点在下面的底层实现部分会进一步说明。属性参考Attribute Reference除了上述两个参数会被原样回显外数据源还会导出以下计算属性属性说明arn站点的 ARNAmazon Resource Namedescription站点的描述信息location站点地理位置为嵌套对象字段见下表tags站点的键值标签location嵌套对象包含以下字段字段说明address位置的街道地址latitude位置的纬度longitude位置的经度注意latitude与longitude在源码中的类型为字符串schema.TypeString因此即使传入的是数值在 Terraform 侧也会以字符串形式呈现引用时如需参与计算应使用tonumber()转换。从源码的 Schema 定义site_data_source.go可以看到arn、description、location、tags均被声明为Computed: true且location是一个MaxItems不受限的TypeList列表对象实际最多返回 1 个元素tags使用tftags.TagsSchemaComputed()声明为计算型标签集合。完整示例用法最小示例原文档给出的是最精简的调用方式两个必填参数直接引用变量data aws_networkmanager_site example { global_network_id var.global_network_id site_id var.site_id }创建后回读资源 数据源联动实际项目中最常见的场景是先由资源创建站点再通过数据源在同一次 plan/apply 内读取其完整属性。仓库中的接受性测试 site_data_source_test.go 就完整演示了这一联动模式包括描述、经纬度与标签的配置resource aws_networkmanager_global_network test { tags { Name example-site } } resource aws_networkmanager_site test { description test global_network_id aws_networkmanager_global_network.test.id location { latitude 18.0029784 longitude -76.7897987 } tags { Name example-site } } data aws_networkmanager_site test { global_network_id aws_networkmanager_global_network.test.id site_id aws_networkmanager_site.test.id }测试还通过TestCheckResourceAttrPair断言数据源的arn、description、global_network_id、location.#、site_id、tags.%与对应资源属性完全一致site_data_source_test.go验证了数据源回读数据的完整性。你也可以把aws_networkmanager_site.test.id换成aws_networkmanager_site.test.arn中解析出的站点 ID或在变量中直接传入已知 ID。与其他数据源配合先列出、再查详情如果不知道确切的site_id可以先使用配套的列表数据源aws_networkmanager_sites实现见 sites_data_source.go按 Global Network 与标签过滤出所有站点 ID再逐个读取详情data aws_networkmanager_sites example { global_network_id aws_networkmanager_global_network.test.id tags { Environment prod } } data aws_networkmanager_site example { global_network_id aws_networkmanager_global_network.test.id site_id data.aws_networkmanager_sites.example.ids[0] } output site_arn { value data.aws_networkmanager_site.example.arn }aws_networkmanager_sites列表数据源在tags非空时会逐站点做标签包含匹配ContainsAll只保留满足条件的站点 ID非常适合按标签发现站点的场景。底层实现原理读取流程从 Schema 到 AWS API数据源的读取入口是dataSourceSiteReadsite_data_source.go整体流程如下从 Provider 元数据中获取 Network Manager 客户端NetworkManagerClient与IgnoreTagsConfig从配置中取出global_network_id与site_id两个字符串调用findSiteByTwoPartKey执行查询将站点 ID 写入d.SetId(siteID)作为该数据源在 Terraform 状态中的唯一标识依次回填arn、description、global_network_id、location、site_id、tags属性若 AWS 侧返回错误通过sdkdiag.AppendErrorf组装诊断信息返回。findSiteByTwoPartKey查询与事件一致性校验真正的查询逻辑位于 site.go 的findSiteByTwoPartKey。它构造GetSitesInput{GlobalNetworkId, SiteIds: []string{siteID}}调用GetSitesAPI并对返回结果做两层保护通过findSites使用 AWS SDK 的分页器NewGetSitesPaginator遍历全部页site.go避免站点数量多时漏数据返回后再做一次事件一致性校验如果返回站点的GlobalNetworkId或SiteId与请求不一致则视为 NotFound。这是因为 AWS 控制面存在最终一致性刚写入的数据未必立即能按预期键读回。若查询不到数据源会返回形如reading Network Manager Site (xxx): ...的报错这一点与同名资源的行为不同——资源在Read时若发现站点被删除会主动将 ID 置空并从状态中移除site.go而数据源没有自我清理的语义站点不存在时直接报错。location 的展开与回填AWS API 返回的Location结构体含Address、Latitude、Longitude三个字符串指针通过flattenLocation转成 Terraform 的 mapsite.go只回填非空字段。在dataSourceSiteRead中若 API 返回Location nil则显式把location设置为nil保证配置中不会残留上一次的空对象。tags 的处理tags属性在回填时经过了.IgnoreAWS().IgnoreConfig(ignoreTagsConfig)处理site_data_source.go即过滤掉 AWS 保留标签如aws:前缀以及 Provider 配置中ignore_tags指定的标签最终以 map 形式写入状态。这意味着数据源返回的tags是用户可见的标签集合不含系统内部标签。状态机与资源侧能力配套参考虽然数据源本身只读但它读取的站点会经历PENDING → AVAILABLE的生命周期。资源侧定义了等待逻辑site.go创建时等待站点从PENDING变为AVAILABLE更新时等待从UPDATING回到AVAILABLE删除时等待进入删除完成态创建、更新、删除的默认超时均为 10 分钟。了解这些状态有助于理解资源创建成功后数据源立即可查的前提——通常资源侧已经完成了可用性等待。此外aws_networkmanager_site资源还支持通过站点 ARN 导入site.go导入器会解析 ARN 中的资源段格式为site/global_network_id/site_id自动拆出global_network_id与站点 ID。因此你完全可以把资源管理交给 Terraform把读交给aws_networkmanager_site数据源两者协作而不重复。常见问题与最佳实践站点不存在时如何处理数据源不提供create_before_destroy之类的容错站点被删除后terraform plan/apply会直接报错。若站点可能不存在建议先用aws_networkmanager_sites列表数据源 count/for_each做存在性判断再按索引读取详情。location字段可能为空。站点创建时未配置location时数据源返回的location为null使用data.aws_networkmanager_site.example.location[0].latitude这类索引访问前应先用try()或长度判断保护。ID 是字符串而非数字。site_id、global_network_id及location下的latitude/longitude在 Schema 中都是字符串类型与 AWS API 的定义保持一致进行地理计算前请使用tonumber()。优先引用而不是硬编码。无论是站点 ID 还是 ARN都应通过数据源或资源属性引用如aws_networkmanager_site.test.id避免在配置里写死site-444555aaabbb11223之类的字面量这样 Terraform 才能在资源变更后自动跟踪。结合 Provider 默认标签使用。数据源的tags与资源的tags_all语义不同前者返回站点当前的标签快照后者包含 Providerdefault_tags继承的标签。若你需要在数据源场景下也拿到继承标签应读取同名的资源属性而非数据源。进一步阅读数据源完整实现internal/service/networkmanager/site_data_source.go站点资源完整实现查询/等待/导入共用逻辑internal/service/networkmanager/site.go数据源接受性测试含完整联动配置internal/service/networkmanager/site_data_source_test.go站点列表数据源aws_networkmanager_sitesinternal/service/networkmanager/sites_data_source.go站点资源使用文档创建、location、时间与导入说明website/docs/r/networkmanager_site.html.markdown服务注册清单数据源与资源类型汇总internal/service/networkmanager/service_package_gen.go【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考