使用 Terraform AWS Provider 的 `aws_networkmanager_connection` 数据源查询 Network Manager 连接详情
2026/9/19 20:31:37 网站建设 项目流程

使用 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_idconnection_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_idconnection_id均为Required(必填),其余属性全部为Computed(只读导出)。最小可用配置如下:

data "aws_networkmanager_connection" "example" { global_network_id = var.global_network_id connection_id = var.connection_id }

其中var.global_network_idvar.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,并在返回结果中再次校验GlobalNetworkIdConnectionId与请求一致,作为最终一致性(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_idconnected_device_idglobal_network_id在资源中均为必填且ForceNew(修改即重建);connected_link_iddescriptionlink_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_idtags过滤,导出ids列表;随后再对每个 ID 用本文的aws_networkmanager_connection数据源逐条查询详情,即可拼出"列表 + 明细"的完整查询方案。

底层原理:数据源的一次读取是如何完成的

结合源码可梳理出数据源完整的执行链路:

  1. 初始化客户端dataSourceConnectionRead通过meta.(*conns.AWSClient).NetworkManagerClient(ctx)获取 Network Manager 服务的 AWS SDK v2 客户端;
  2. 构造查询条件:读取global_network_idconnection_id,调用findConnectionByTwoPartKey
  3. 分页拉取:findConnections 使用networkmanager.NewGetConnectionsPaginatorGetConnections结果分页聚合;若全局网络不存在,会将ResourceNotFoundException包装为retry.NotFoundError
  4. 唯一性断言:findConnection 通过tfresource.AssertSingleValueResult断言必须恰好命中一条连接,多于一条则报错;
  5. 一致性校验:校验返回的GlobalNetworkIdConnectionId与请求参数一致;
  6. 写入 state:将各字段与清洗后的tags写入 Terraform state,数据源 ID 设为connection_id

这一"分页聚合 + 单值断言 + 最终一致性校验"的模式在仓库中属于通用惯例,与资源侧resourceConnectionRead复用的是同一套查找函数,保证了数据源与资源读到的是同一份事实。

测试验证:数据源与资源的属性一致性

仓库为数据源编写了接受度测试(Acceptance Test),见 connection_data_source_test.go。TestAccNetworkManagerConnectionDataSource_basic的核心思路是:

  1. 先用testAccConnectionConfig_descriptionAndLinks创建带descriptionlink_idtags的完整资源场景;
  2. 再叠加data "aws_networkmanager_connection" "test"数据源配置;
  3. 通过resource.TestCheckResourceAttrPair逐一断言数据源每个导出属性与资源属性成对相等,包括arnconnected_device_idconnected_link_idconnection_iddescriptionglobal_network_idlink_id以及tags.%

该测试同时验证了数据源在"资源带链路与描述"场景下的正确性,也与文档中"导出属性 = 参数 + 上述只读属性"的说明完全对应。若你想在本地复现,可按 running-and-writing-acceptance-tests.md 的指引设置 AWS 凭据与TF_ACC=1后运行(注意测试中PreCheck会先校验账号与区域可用性)。

常见疑问与注意事项

  • 数据源查询不到连接会怎样?源码中findConnectionByTwoPartKey在结果为空或一致性校验失败时返回NotFoundErrordataSourceConnectionRead会直接报错 "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),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询