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_gateways→aws_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:全部查询参数
以下参数全部为可选,数据源通过它们的组合来唯一定位一个虚拟接口:
| 参数 | 类型 | 说明 |
|---|---|---|
region | string | 该数据源所属的 AWS 区域。默认为 Provider 配置中设置的区域,可用于跨区域查询。 |
id | string | 目标 EC2 Local Gateway Virtual Interface 的标识符(形如lgw-vif-xxx)。 |
filter | block set | 一个或多个 name-values 过滤块,对应 EC2DescribeLocalGatewayVirtualInterfacesAPI 支持的过滤条件,用于表达难以用标量属性表达的组合条件。 |
tags | map(string) | 标签键值映射,每对标签都必须与目标虚拟接口上的标签完全匹配。 |
filter 块内部参数
filter是TypeSet类型的块集合(其 Schema 定义见 filters.go),每个块包含两个必填参数:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
name | string | 是 | 过滤条件名称,例如local-gateway-virtual-interface-id。 |
values | set(string) | 是 | 该过滤条件的一个或多个取值,同一条件的多个值之间是“或”的关系。 |
filter 与id、tags可以组合使用:源码在构造 API 输入时会依次追加 ID 查询条件、tags 过滤条件与自定义 filter(见 outposts_local_gateway_virtual_interface_data_source.go 第 91-106 行)。
Attribute Reference:查询结果导出的属性
查询成功后,除了上述参数(id、tags、region等会被回填为计算值),数据源还会导出以下只读属性:
| 属性 | 类型 | 含义 |
|---|---|---|
local_address | string | 本地网关侧的 IP 地址(CIDR 形式,如10.0.0.1/30,测试用正则^\d+\.\d+\.\d+\.\d+/\d+$校验)。 |
local_bgp_asn | int | 本地网关侧的 BGP 自治系统号(ASN)。 |
local_gateway_id | string | 所属本地网关的标识符(lgw-前缀)。 |
local_gateway_virtual_interface_group_id | string | 所属虚拟接口组的标识符。 |
outpost_lag_id | string | 关联的 Outpost LAG(链路聚合组)标识符。 |
peer_address | string | 对端(本地数据中心侧)的 IP 地址(CIDR 形式)。 |
peer_bgp_asn | int | 对端的 BGP 自治系统号(ASN)。 |
vlan | int | 虚拟接口使用的 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" } }| 超时项 | 默认值 |
|---|---|
read | 20m |
默认值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 行):
- 构造输入:初始化
ec2.DescribeLocalGatewayVirtualInterfacesInput;若配置了id,则填充LocalGatewayVirtualInterfaceIds切片(第 91-93 行)。 - 合并过滤条件:将配置的
tags与filter分别转换为 EC2 Filter 列表并追加到输入(第 95-101 行);若最终过滤列表为空则置为nil,因为 EC2 API 不接受空过滤列表(第 103-106 行)。 - 调用查询函数:调用
findLocalGatewayVirtualInterface,其内部先通过findLocalGatewayVirtualInterfaces使用官方分页器NewDescribeLocalGatewayVirtualInterfacesPaginator遍历所有分页结果(见 find.go 第 1099-1124 行),再经tfresource.AssertSingleValueResult强制校验结果唯一性。 - 单结果约束:如果匹配结果不是恰好一个,
tfresource.SingularDataSourceFindError会生成明确报错,提示“找到了 0 个或多个 EC2 Local Gateway Virtual Interface”(第 108-112 行),这正是要求id/filter/tags必须唯一定位的原因。 - 写入状态:以虚拟接口 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 查询,并校验id、local_address、local_bgp_asn、local_gateway_id、peer_address、peer_bgp_asn、vlan等全部核心属性的格式(第 16-41 行)。TestAccEC2OutpostsLocalGatewayVirtualInterfaceDataSource_id:按id查询(第 43-68 行)。TestAccEC2OutpostsLocalGatewayVirtualInterfaceDataSource_tags:先写入标签再按 tags 查询,并通过TestCheckResourceAttrPair逐一比对 source 与 test 两个数据源的导出属性(第 70-97 行)。
所有测试均在PreCheck中调用acctest.PreCheckOutpostsOutposts,即测试运行环境必须真实存在 Outposts 资源(本地网关、虚拟接口组等),这是该数据源使用前提的有力佐证——它只适用于已部署 Outposts 并与本地网络完成虚拟接口配置的账户。
使用注意事项小结
- 结果必须唯一:该数据源是单例查询,
id、filter、tags组合后若匹配到 0 个或多个结果都会直接报错;不确定唯一性时,可先用aws_ec2_local_gateway_virtual_interface_group或aws_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),仅供参考