使用 Terraform AWS Provider 的aws_networkmanager_connection数据源查询 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_connection数据源(Data Source):通过global_network_id与connection_id两个必填参数,即可读取 AWS Network Manager 全局网络中一条已存在的 Connection(设备间连接)的全部属性,包括 ARN、两端设备与链路 ID、描述与标签。读完本文,你将掌握该数据源的完整配置语法、参数与导出属性清单,并通过仓库源码理解其底层 API 调用、标签处理与状态等待机制,能够在基础设施即代码(IaC)中安全地引用既有连接而无需在状态中重复管理。
数据源定位:连接信息从哪来
在 AWS Network Manager 的体系中,Connection描述的是同一个全球网络(Global Network)内两台设备(Device)之间的连接关系,可选的link_id/connected_link_id进一步将连接绑定到具体的链路(Link)。aws_networkmanager_connection数据源用于查询已存在的连接信息,它与管理型资源 aws_networkmanager_connection 的区别在于:
- 资源(Resource):负责创建、更新、删除连接,会写入 Terraform 状态;
- 数据源(Data Source):只读地拉取某个连接的当前属性,供其他资源配置引用,例如将查询到的
connected_device_id传给监控、计费或自动化脚本相关配置。
文档对该数据源的定位是 "Provides details about an existing Network Manager connection",即"提供关于已有 Network Manager 连接的详细信息"。
基本用法
在 connection_data_source.go 中,该数据源注册为@SDKDataSource("aws_networkmanager_connection", name="Connection"),schema 中global_network_id与connection_id均为Required(必填),其余属性全部为Computed(只读导出)。最小可用配置如下:
data "aws_networkmanager_connection" "example" { global_network_id = var.global_network_id connection_id = var.connection_id }其中var.global_network_id与var.connection_id可由你自行通过变量传入,也可以直接引用仓库内其他 Terraform 资源的输出,例如:
data "aws_networkmanager_connection" "example" { global_network_id = aws_networkmanager_global_network.example.id connection_id = aws_networkmanager_connection.example.id }connection_id即连接在 AWS 侧的 ID(例如connection-07f6fd08867abc123格式),它同时会被用作数据源的内部 ID(源码中d.SetId(connectionID))。
参数参考(Argument Reference)
该数据源支持以下参数:
| 参数 | 必填 | 说明 |
|---|---|---|
global_network_id | 是(Required) | 待查询连接所属 Global Network(全球网络)的 ID |
connection_id | 是(Required) | 待查询的具体连接的 ID |
从源码看,这两个参数构成读取连接的"双键"(two-part key):findConnectionByTwoPartKey 会构造GetConnectionsInput{ConnectionIds: []string{connectionID}, GlobalNetworkId: aws.String(globalNetworkID)}调用 AWS 的GetConnectionsAPI,并在返回结果中再次校验GlobalNetworkId与ConnectionId与请求一致,作为最终一致性(eventual consistency)兜底;校验不通过时返回retry.NotFoundError。这意味着同一 connection_id 在不同 global network 下不会混淆,查询结果与查询条件严格对应。
导出属性参考(Attribute Reference)
除了上述两个参数本身,数据源还会导出以下只读属性:
| 属性 | 说明 |
|---|---|
arn | 连接的 ARN(Amazon 资源名称) |
connected_device_id | 连接中第二台设备的 ID |
connected_link_id | 第二台设备所关联链路的 ID |
description | 连接的描述信息 |
device_id | 连接中第一台设备的 ID |
link_id | 第一台设备所关联链路的 ID |
tags | 连接的键值标签(Key-value tags) |
这些属性在 dataSourceConnectionRead 中逐项从 AWS SDK 返回的awstypes.Connection结构体映射到 Terraform state:
d.Set(names.AttrARN, connection.ConnectionArn) d.Set("connected_device_id", connection.ConnectedDeviceId) d.Set("connected_link_id", connection.ConnectedLinkId) d.Set(names.AttrConnectionID, connection.ConnectionId) d.Set(names.AttrDescription, connection.Description) d.Set("device_id", connection.DeviceId) d.Set("global_network_id", connection.GlobalNetworkId) d.Set("link_id", connection.LinkId)标签的读取与过滤规则
tags属性走的是 provider 统一的标签读取链路:源码中d.Set(names.AttrTags, keyValueTags(ctx, connection.Tags).IgnoreAWS().IgnoreConfig(ignoreTagsConfig).Map()),其含义是:
.IgnoreAWS():过滤掉 AWS 自动添加的系统标签(如aws:前缀);.IgnoreConfig(ignoreTagsConfig):遵循 provider 级ignore_tags配置块,按用户的忽略规则剔除标签;- 最终以 Go map 形式写入
tags。
因此你在数据源中看到的tags是经过 provider 全局过滤规则清洗后的结果,这一点与资源侧的tags_all语义不同,引用时需注意。
与相关资源/数据源的配套使用
用资源创建、用数据源读取
典型的完整链路是先通过资源创建 Global Network、Device 与 Connection,再用数据源读取属性做校验或供下游使用:
resource "aws_networkmanager_global_network" "example" { description = "example" } resource "aws_networkmanager_device" "example1" { global_network_id = aws_networkmanager_global_network.example.id } resource "aws_networkmanager_device" "example2" { global_network_id = aws_networkmanager_global_network.example.id } resource "aws_networkmanager_connection" "example" { global_network_id = aws_networkmanager_global_network.example.id device_id = aws_networkmanager_device.example1.id connected_device_id = aws_networkmanager_device.example2.id } data "aws_networkmanager_connection" "example" { global_network_id = aws_networkmanager_global_network.example.id connection_id = aws_networkmanager_connection.example.id } output "connection_arn" { value = data.aws_networkmanager_connection.example.arn }资源侧补充说明(详见 资源文档):device_id、connected_device_id、global_network_id在资源中均为必填且ForceNew(修改即重建);connected_link_id、description、link_id为可选;description在源码中有validation.StringLenBetween(0, 256)的长度校验(见 connection.go);资源还提供create/update/delete默认 10 分钟的 Timeout,以及基于连接 ARN 的导入能力。
批量查询:aws_networkmanager_connections
如果你需要按device_id或标签批量获取连接 ID 列表,可配合使用列表数据源 aws_networkmanager_connections,它以global_network_id为必填参数,支持可选的device_id与tags过滤,导出ids列表;随后再对每个 ID 用本文的aws_networkmanager_connection数据源逐条查询详情,即可拼出"列表 + 明细"的完整查询方案。
底层原理:数据源的一次读取是如何完成的
结合源码可梳理出数据源完整的执行链路:
- 初始化客户端:
dataSourceConnectionRead通过meta.(*conns.AWSClient).NetworkManagerClient(ctx)获取 Network Manager 服务的 AWS SDK v2 客户端; - 构造查询条件:读取
global_network_id与connection_id,调用findConnectionByTwoPartKey; - 分页拉取:findConnections 使用
networkmanager.NewGetConnectionsPaginator对GetConnections结果分页聚合;若全局网络不存在,会将ResourceNotFoundException包装为retry.NotFoundError; - 唯一性断言:findConnection 通过
tfresource.AssertSingleValueResult断言必须恰好命中一条连接,多于一条则报错; - 一致性校验:校验返回的
GlobalNetworkId与ConnectionId与请求参数一致; - 写入 state:将各字段与清洗后的
tags写入 Terraform state,数据源 ID 设为connection_id。
这一"分页聚合 + 单值断言 + 最终一致性校验"的模式在仓库中属于通用惯例,与资源侧resourceConnectionRead复用的是同一套查找函数,保证了数据源与资源读到的是同一份事实。
测试验证:数据源与资源的属性一致性
仓库为数据源编写了接受度测试(Acceptance Test),见 connection_data_source_test.go。TestAccNetworkManagerConnectionDataSource_basic的核心思路是:
- 先用
testAccConnectionConfig_descriptionAndLinks创建带description、link_id、tags的完整资源场景; - 再叠加
data "aws_networkmanager_connection" "test"数据源配置; - 通过
resource.TestCheckResourceAttrPair逐一断言数据源每个导出属性与资源属性成对相等,包括arn、connected_device_id、connected_link_id、connection_id、description、global_network_id、link_id以及tags.%。
该测试同时验证了数据源在"资源带链路与描述"场景下的正确性,也与文档中"导出属性 = 参数 + 上述只读属性"的说明完全对应。若你想在本地复现,可按 running-and-writing-acceptance-tests.md 的指引设置 AWS 凭据与TF_ACC=1后运行(注意测试中PreCheck会先校验账号与区域可用性)。
常见疑问与注意事项
- 数据源查询不到连接会怎样?源码中
findConnectionByTwoPartKey在结果为空或一致性校验失败时返回NotFoundError,dataSourceConnectionRead会直接报错 "reading Network Manager Connection",不会静默返回空数据。 - 连接被删除后数据源会报错吗?会。数据源没有资源那样的"从 state 中移除"逻辑(资源在
Read时对非新建资源的NotFound会清空 ID,见 connection.go),数据源每次 plan/apply 都会实时调用 AWS 查询,因此被删连接会导致数据源引用失败,这恰恰是"详情实时可查"这一设计意图。 - 跨区域可用性:Network Manager 是全球服务,
global_network_id标识的是全局网络实体,连接数据不依赖具体区域端点;实际调用区域由 provider 配置决定。 - 标签差异:数据源的
tags是清洗后的结果,与资源导出的tags_all(含 provider 级default_tags继承)语义不同,做相等性比较时请选择正确的属性。
小结
aws_networkmanager_connection数据源以global_network_id+connection_id双键精确定位一条 Network Manager 连接,一次性导出 ARN、两端设备/链路 ID、描述与标签等全部元数据。其实现位于 connection_data_source.go,底层复用资源同款的GetConnections分页查询与最终一致性校验逻辑,并有 接受度测试 保证属性与资源完全对齐。无论是将既有连接信息注入其他资源,还是做状态审计与自动化校验,它都是连接aws_networkmanager_connections(批量列表)与资源(生命周期管理)之间的关键一环。
【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考