Terraform AWS Provider 数据源深度解析:aws_ec2_local_gateway_virtual_interface 查询 EC2 本地网关虚拟接口详情
2026/9/18 6:41:14 网站建设 项目流程

Terraform AWS Provider 数据源深度解析:aws_ec2_local_gateway_virtual_interface 查询 EC2 本地网关虚拟接口详情

【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws

本文围绕 Terraform AWS Provider 的aws_ec2_local_gateway_virtual_interface数据源(位于 EC2 / Outposts 子类目),系统讲解其在 AWS Outposts 本地网络接入场景中的查询用法、过滤与标签匹配机制、全部参数与导出属性,并结合仓库源码与验收测试剖析底层DescribeLocalGatewayVirtualInterfaces调用链与单结果约束。读完本文,你将能在 Terraform 配置中通过 ID、filter 或 tags 三种方式精确检索本地网关虚拟接口(Local Gateway Virtual Interface),并与虚拟接口组、本地网关路由表资源联动完成网络编排。

数据源是什么:Outposts 网络组件中的虚拟接口

在 AWS Outposts 环境中,本地网关(Local Gateway)是 Outpost 上实例与本地数据中心网络通信的关键出口。本地网关与本地网络之间的连接通过Local Gateway Virtual Interface(本地网关虚拟接口)建立,虚拟接口再归属于Local Gateway Virtual Interface Group(虚拟接口组),用于与本地网关路由表建立关联。

aws_ec2_local_gateway_virtual_interface数据源的作用,就是读取单个Local Gateway Virtual Interface 的详细信息,供同一 Terraform 配置中的其他资源引用(例如配置本地网关路由表时指定下一跳虚拟接口)。数据源的完整实现位于 outposts_local_gateway_virtual_interface_data_source.go,其官方文档位于 website/docs/d/ec2_local_gateway_virtual_interface.html.markdown。

相关数据源与资源全景

该数据源并不是孤立存在的,围绕 Local Gateway 网络组件,仓库中提供了一组配套的数据源与资源,理解它们之间的关系有助于正确编排:

类型名称仓库文档路径
数据源aws_ec2_local_gateways(查询全部本地网关)d/ec2_local_gateways.html.markdown
数据源aws_ec2_local_gateway(查询单个本地网关)d/ec2_local_gateway.html.markdown
数据源aws_ec2_local_gateway_virtual_interface_group(查询单个虚拟接口组)d/ec2_local_gateway_virtual_interface_group.html.markdown
数据源aws_ec2_local_gateway_virtual_interface_groups(查询全部虚拟接口组)d/ec2_local_gateway_virtual_interface_groups.html.markdown
数据源aws_ec2_local_gateway_virtual_interface(本文主题,查询单个虚拟接口)d/ec2_local_gateway_virtual_interface.html.markdown
资源aws_ec2_local_gateway_route(本地网关路由)r/ec2_local_gateway_route.html.markdown
资源aws_ec2_local_gateway_route_table_virtual_interface_group_association(路由表-虚拟接口组关联)r/ec2_local_gateway_route_table_virtual_interface_group_association.html.markdown

典型的数据流是:aws_ec2_local_gatewaysaws_ec2_local_gateway_virtual_interface_group(拿到虚拟接口 ID 列表)→aws_ec2_local_gateway_virtual_interface(拿到单个虚拟接口详情)。

基础用法:遍历虚拟接口组,逐个查询虚拟接口

官方文档给出的示例展示了最常见的用法——基于虚拟接口组数据源导出的 ID 集合,配合for_each一次性查询组内所有虚拟接口:

data "aws_ec2_local_gateway_virtual_interface" "example" { for_each = data.aws_ec2_local_gateway_virtual_interface_group.example.local_gateway_virtual_interface_ids id = each.value }

这里的data.aws_ec2_local_gateway_virtual_interface_group.example.local_gateway_virtual_interface_ids是虚拟接口组数据源导出的、类型为 set(string) 的虚拟接口 ID 集合,其类型定义可见 outposts_local_gateway_virtual_interface_group_data_source.go(schema.TypeSet,元素为字符串)。for_each展开后,每个虚拟接口对应一个data.aws_ec2_local_gateway_virtual_interface.example["lgw-vif-xxx"]实例,可分别通过.id.peer_address.vlan等属性引用。

三种精确查询方式:id / filter / tags

该数据源是一个“单例查询”数据源:所有定位参数都是可选的,但最终必须且只能匹配到一个虚拟接口,否则会报错。仓库中的验收测试(见 outposts_local_gateway_virtual_interface_data_source_test.go)恰好覆盖了这三种定位方式,可直接作为配置范本。

方式一:按 id 精确查询

data "aws_ec2_local_gateways" "test" {} data "aws_ec2_local_gateway_virtual_interface_group" "test" { local_gateway_id = tolist(data.aws_ec2_local_gateways.test.ids)[0] } data "aws_ec2_local_gateway_virtual_interface" "test" { id = tolist(data.aws_ec2_local_gateway_virtual_interface_group.test.local_gateway_virtual_interface_ids)[0] }

虚拟接口 ID 的格式为lgw-vif-前缀,测试中通过正则^lgw-vif-校验(见 测试用例第 28 行)。

方式二:按 filter 过滤查询

filter块支持基于 EC2DescribeLocalGatewayVirtualInterfacesAPI 支持的任意过滤条件进行查询:

data "aws_ec2_local_gateways" "test" {} data "aws_ec2_local_gateway_virtual_interface_group" "test" { local_gateway_id = tolist(data.aws_ec2_local_gateways.test.ids)[0] } data "aws_ec2_local_gateway_virtual_interface" "test" { filter { name = "local-gateway-virtual-interface-id" values = [tolist(data.aws_ec2_local_gateway_virtual_interface_group.test.local_gateway_virtual_interface_ids)[0]] } }

方式三:按 tags 精确匹配查询

可以通过标签定位虚拟接口,标签的 key/value 必须与目标虚拟接口上的标签完全一致。测试用例先给虚拟接口打上测试标签,再按标签查询(见 测试用例第 130-153 行):

data "aws_ec2_local_gateway_virtual_interface" "source" { id = tolist(data.aws_ec2_local_gateway_virtual_interface_group.test.local_gateway_virtual_interface_ids)[0] } resource "aws_ec2_tag" "test" { key = "TerraformAccTest-aws_ec2_local_gateway_virtual_interface" resource_id = data.aws_ec2_local_gateway_virtual_interface.source.id value = "test-value" } data "aws_ec2_local_gateway_virtual_interface" "test" { tags = { (aws_ec2_tag.test.key) = aws_ec2_tag.test.value } }

Argument Reference:全部查询参数

以下参数全部为可选,数据源通过它们的组合来唯一定位一个虚拟接口:

参数类型说明
regionstring该数据源所属的 AWS 区域。默认为 Provider 配置中设置的区域,可用于跨区域查询。
idstring目标 EC2 Local Gateway Virtual Interface 的标识符(形如lgw-vif-xxx)。
filterblock set一个或多个 name-values 过滤块,对应 EC2DescribeLocalGatewayVirtualInterfacesAPI 支持的过滤条件,用于表达难以用标量属性表达的组合条件。
tagsmap(string)标签键值映射,每对标签都必须与目标虚拟接口上的标签完全匹配。

filter 块内部参数

filterTypeSet类型的块集合(其 Schema 定义见 filters.go),每个块包含两个必填参数:

参数类型必填说明
namestring过滤条件名称,例如local-gateway-virtual-interface-id
valuesset(string)该过滤条件的一个或多个取值,同一条件的多个值之间是“或”的关系。

filter 与idtags可以组合使用:源码在构造 API 输入时会依次追加 ID 查询条件、tags 过滤条件与自定义 filter(见 outposts_local_gateway_virtual_interface_data_source.go 第 91-106 行)。

Attribute Reference:查询结果导出的属性

查询成功后,除了上述参数(idtagsregion等会被回填为计算值),数据源还会导出以下只读属性:

属性类型含义
local_addressstring本地网关侧的 IP 地址(CIDR 形式,如10.0.0.1/30,测试用正则^\d+\.\d+\.\d+\.\d+/\d+$校验)。
local_bgp_asnint本地网关侧的 BGP 自治系统号(ASN)。
local_gateway_idstring所属本地网关的标识符(lgw-前缀)。
local_gateway_virtual_interface_group_idstring所属虚拟接口组的标识符。
outpost_lag_idstring关联的 Outpost LAG(链路聚合组)标识符。
peer_addressstring对端(本地数据中心侧)的 IP 地址(CIDR 形式)。
peer_bgp_asnint对端的 BGP 自治系统号(ASN)。
vlanint虚拟接口使用的 VLAN 编号。

这些属性与 EC2 API 返回的LocalGatewayVirtualInterface结构体字段一一对应,可在 outposts_local_gateway_virtual_interface_data_source.go 第 42-80 行 的 Schema 定义中核实。其中local_address/peer_address与两侧bgp_asn是配置本地网关路由、排查 BGP 邻居建立问题的关键信息。

Timeouts:读取超时配置

该数据源支持在配置中显式覆盖操作超时:

data "aws_ec2_local_gateway_virtual_interface" "example" { # ...定位参数 timeouts { read = "10m" } }
超时项默认值
read20m

默认值20m定义于源码的Timeouts字段(见 outposts_local_gateway_virtual_interface_data_source.go 第 30-32 行)。

底层实现原理:从 Terraform 配置到 EC2 API

该数据源的实现路径清晰地展示了 AWS Provider 数据源的标准架构,核心读取函数为dataSourceLocalGatewayVirtualInterfaceRead(见 outposts_local_gateway_virtual_interface_data_source.go 第 85-127 行):

  1. 构造输入:初始化ec2.DescribeLocalGatewayVirtualInterfacesInput;若配置了id,则填充LocalGatewayVirtualInterfaceIds切片(第 91-93 行)。
  2. 合并过滤条件:将配置的tagsfilter分别转换为 EC2 Filter 列表并追加到输入(第 95-101 行);若最终过滤列表为空则置为nil,因为 EC2 API 不接受空过滤列表(第 103-106 行)。
  3. 调用查询函数:调用findLocalGatewayVirtualInterface,其内部先通过findLocalGatewayVirtualInterfaces使用官方分页器NewDescribeLocalGatewayVirtualInterfacesPaginator遍历所有分页结果(见 find.go 第 1099-1124 行),再经tfresource.AssertSingleValueResult强制校验结果唯一性。
  4. 单结果约束:如果匹配结果不是恰好一个,tfresource.SingularDataSourceFindError会生成明确报错,提示“找到了 0 个或多个 EC2 Local Gateway Virtual Interface”(第 108-112 行),这正是要求id/filter/tags必须唯一定位的原因。
  5. 写入状态:以虚拟接口 ID 作为数据源的id,并将其余属性逐一d.Set写入 Terraform 状态,标签通过setTagsOut导出(第 114-124 行)。

实战联动:虚拟接口、路由表与本地网关路由编排

将本文数据源与同仓库的本地网关路由资源组合,即可构建一条从 Outposts 本地网络到本地网关的完整数据面配置。典型编排如下:

data "aws_ec2_local_gateway_virtual_interface_group" "example" { local_gateway_id = data.aws_ec2_local_gateway.example.id } data "aws_ec2_local_gateway_virtual_interface" "example" { for_each = data.aws_ec2_local_gateway_virtual_interface_group.example.local_gateway_virtual_interface_ids id = each.value } # 将虚拟接口组关联到本地网关路由表(对应 aws_ec2_local_gateway_route_table_virtual_interface_group_association) # 再将查询到的虚拟接口地址用于 aws_ec2_local_gateway_route 的路由配置

其中aws_ec2_local_gateway_route与关联资源的完整参数说明可分别参考 r/ec2_local_gateway_route.html.markdown 与 r/ec2_local_gateway_route_table_virtual_interface_group_association.html.markdown。

测试与验证:数据源行为的质量保障

仓库为每个数据源维护了配套的验收测试,本数据源的测试位于 outposts_local_gateway_virtual_interface_data_source_test.go,覆盖三种定位路径:

  • TestAccEC2OutpostsLocalGatewayVirtualInterfaceDataSource_filter:按local-gateway-virtual-interface-idfilter 查询,并校验idlocal_addresslocal_bgp_asnlocal_gateway_idpeer_addresspeer_bgp_asnvlan等全部核心属性的格式(第 16-41 行)。
  • TestAccEC2OutpostsLocalGatewayVirtualInterfaceDataSource_id:按id查询(第 43-68 行)。
  • TestAccEC2OutpostsLocalGatewayVirtualInterfaceDataSource_tags:先写入标签再按 tags 查询,并通过TestCheckResourceAttrPair逐一比对 source 与 test 两个数据源的导出属性(第 70-97 行)。

所有测试均在PreCheck中调用acctest.PreCheckOutpostsOutposts,即测试运行环境必须真实存在 Outposts 资源(本地网关、虚拟接口组等),这是该数据源使用前提的有力佐证——它只适用于已部署 Outposts 并与本地网络完成虚拟接口配置的账户。

使用注意事项小结

  • 结果必须唯一:该数据源是单例查询,idfiltertags组合后若匹配到 0 个或多个结果都会直接报错;不确定唯一性时,可先用aws_ec2_local_gateway_virtual_interface_groupaws_ec2_local_gateway_virtual_interface_groups(后者查询全部)定位 ID,再精确查询。
  • 依赖 Outposts 环境:未部署 Outposts 的普通 AWS 区域不存在本地网关与虚拟接口,查询会失败。
  • 超时可按需覆盖:默认read超时为 20 分钟,常规查询远快于此,仅当 API 侧异常时才会触及。
  • 跨区域查询:可通过region参数指定目标区域,否则使用 Provider 配置的默认区域。

【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

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

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

立即咨询