news 2026/9/18 23:31:10

深入解读 Terraform AWS Provider 的 aws_ec2_local_gateway_virtual_interface_group 数据源

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入解读 Terraform AWS Provider 的 aws_ec2_local_gateway_virtual_interface_group 数据源

深入解读 Terraform AWS Provider 的 aws_ec2_local_gateway_virtual_interface_group 数据源

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

aws_ec2_local_gateway_virtual_interface_group是 Terraform AWS Provider 提供的 EC2 数据源,用于按 ID、所属 Local Gateway、标签或过滤器精确查询 AWS Outposts 上的 Local Gateway Virtual Interface Group,并获取其包含的 Virtual Interface 标识集合。读完本文,你将掌握该数据源的完整参数语义、filter 过滤块用法、底层DescribeLocalGatewayVirtualInterfaceGroupsAPI 调用链与测试验证方式,能够在 Outposts 网络编排场景中正确引用该数据源。

背景:Local Gateway Virtual Interface Group 在 Outposts 网络中的角色

在 AWS Outposts 的本地网络组件中,Local Gateway 用于在 Outpost 上提供本地路由与网络连接能力,而Local Gateway Virtual Interface Group将一组 Virtual Interface(VIF)聚合成一个逻辑组,供 Local Gateway 路由表等组件引用。该数据源对应 EC2 API 的DescribeLocalGatewayVirtualInterfaceGroups,官方定位与详细介绍可参见 Outposts 用户指南中的网络组件与路由章节。

在该 Provider 的源码中,该数据源位于 EC2 服务的 Outposts 相关文件内,文件路径为 internal/service/ec2/outposts_local_gateway_virtual_interface_group_data_source.go,并在 service_package_gen.go 中完成注册(源码注释标记为@SDKDataSource("aws_ec2_local_gateway_virtual_interface_group"))。

基础用法示例

官方文档给出的最小用法是:先通过aws_ec2_local_gateway数据源取得 Local Gateway 的 ID,再以该 ID 查询对应的 Virtual Interface Group:

data "aws_ec2_local_gateway" "example" { # 可在实际配置中通过 filter 指定要匹配的 Local Gateway } data "aws_ec2_local_gateway_virtual_interface_group" "example" { local_gateway_id = data.aws_ec2_local_gateway.example.id }

注意:示例中直接引用了未定义的data.aws_ec2_local_gateway.example,实际使用时需要先行定义该数据源(可参考 ec2_local_gateway.html.markdown),或者改用下方介绍的idfiltertags三种查询路径之一。

参数参考(Argument Reference)

该数据源的参数全部为可选(Optional),按查询策略可分为以下四类:

参数类型必填性说明
regionString可选该数据源执行查询的 AWS 区域,默认使用 Provider 配置中设定的区域;仅需跨区域查询时才需要显式指定
idString可选EC2 Local Gateway Virtual Interface Group 的标识符(形如lgw-vif-grp-xxxxxxxx
local_gateway_idString可选所属 EC2 Local Gateway 的标识符(形如lgw-xxxxxxxx
filterBlock可选一个或多个 name-value 过滤块,支持的过滤器以 EC2 API 的DescribeLocalGatewayVirtualInterfaceGroups文档为准
tagsMap可选资源的标签键值映射,必须与目标 Local Gateway Route Table 上的标签键值完全一致才能命中

以上四类参数在源码的 Schema 定义中均体现为Optional且大多为Optional + Computed(见 outposts_local_gateway_virtual_interface_group_data_source.go),也就是说:不提供该参数时数据源也能通过其他条件查询并回填该值。

filter 过滤块

filter配置块支持以下两个子参数:

  • name-(必填)过滤器名称,例如local-gateway-idtag-keytag-value等,以 EC2 API 官方支持的过滤器为准;
  • values-(必填)该过滤器的一个或多个取值列表。

示例(同时指定过滤块):

data "aws_ec2_local_gateway_virtual_interface_group" "example" { filter { name = "local-gateway-id" values = ["lgw-0123456789abcdef0"] } }

属性参考(Attribute Reference)

除上述参数(在查询后可回填为属性)外,该数据源导出以下属性:

  • local_gateway_virtual_interface_ids- EC2 Local Gateway Virtual Interface 标识符的集合(Set),即该 Group 下聚合的所有 VIF ID 列表。

结合源码可见,local_gateway_virtual_interface_ids在 Schema 中被定义为TypeSet且仅 Computed(源码第 47-51 行),最终从 API 返回的LocalGatewayVirtualInterfaceIds字段整体写入。同时,id会被设置为 API 返回的LocalGatewayVirtualInterfaceGroupIdlocal_gateway_idtags也都会在读取后被回填。

该数据源与单个 VIF 数据源aws_ec2_local_gateway_virtual_interface(文档见 ec2_local_gateway_virtual_interface.html.markdown)互为补充:前者返回 Group 下的 VIF ID 集合,后者可进一步查询单个 VIF 的 BGP ASN、VLAN、对端地址等细节,二者常组合使用以完成 Outposts 网络参数的自动发现。

Timeouts 超时配置

该数据源支持read操作超时,默认值为20m(20 分钟):

data "aws_ec2_local_gateway_virtual_interface_group" "example" { local_gateway_id = data.aws_ec2_local_gateway.example.id timeouts { read = "30m" } }

该默认值在源码中通过schema.DefaultTimeout(20 * time.Minute)设置(outposts_local_gateway_virtual_interface_group_data_source.go)。

源码实现:查询调用链与单结果约束

从源码可以还原该数据源的完整读取流程(outposts_local_gateway_virtual_interface_group_data_source.go#L58-L101):

  1. 构造 API 请求:若配置了id,则将其填入DescribeLocalGatewayVirtualInterfaceGroupsInputLocalGatewayVirtualInterfaceGroupIds字段;
  2. 合并三类过滤器local_gateway_id会被自动转换成local-gateway-id过滤器,tags会被转换成标签过滤器,二者再与用户显式声明的filter块合并;
  3. 空过滤器保护:如果合并后过滤器列表为空,源码会显式将其置为nil,因为 EC2 API 不接受空过滤器列表(源码第 82-85 行的注释明确说明了这一点);
  4. 分页查询与单结果断言:实际查询由 find.go 中的findLocalGatewayVirtualInterfaceGroup完成——它先调用findLocalGatewayVirtualInterfaceGroups通过DescribeLocalGatewayVirtualInterfaceGroupsPaginator翻页拉取全部结果,再交给tfresource.AssertSingleValueResult断言必须恰好命中一条记录
  5. 写入状态:命中后将LocalGatewayVirtualInterfaceGroupId设为资源 ID,并回填local_gateway_idlocal_gateway_virtual_interface_ids与标签。

需要特别留意的是第 4 步的单结果约束:这是一个"单一(singular)"数据源,若查询条件过宽导致命中多条记录,会通过tfresource.SingularDataSourceFindError返回错误。因此实际使用时,idlocal_gateway_idfiltertags应组合出能唯一定位的条件。若业务上需要一次性枚举所有 Group,应改用复数版数据源aws_ec2_local_gateway_virtual_interface_groups(文档见 ec2_local_gateway_virtual_interface_groups.html.markdown),其实现位于 outposts_local_gateway_virtual_interface_groups_data_source.go,会返回所有 Group 的 ID 列表。

接受性测试:三种查询路径的验证

仓库提供了完整的接受性测试来验证该数据源的三条查询路径,见 outposts_local_gateway_virtual_interface_group_data_source_test.go:

  • TestAccEC2OutpostsLocalGatewayVirtualInterfaceGroupDataSource_filter:通过filter块按local-gateway-id过滤,断言id匹配^lgw-vif-grp-前缀、local_gateway_id匹配^lgw-前缀,且local_gateway_virtual_interface_ids.#等于2
  • TestAccEC2OutpostsLocalGatewayVirtualInterfaceGroupDataSource_localGatewayID:直接使用local_gateway_id参数查询,断言内容同上;
  • TestAccEC2OutpostsLocalGatewayVirtualInterfaceGroupDataSource_tags:先用aws_ec2_tag资源给源 Group 打标签,再通过tags参数反向命中该 Group,并断言两个数据源的idlocal_gateway_id一致。

测试中的配置片段也展示了生产可用的动态用法——借助aws_ec2_local_gateways复数数据源先列出可用 Local Gateway,再取第一个 ID 进行查询:

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

这些测试统一通过acctest.PreCheckOutpostsOutposts前置检查,意味着运行前提是当前测试账号/区域存在可用的 Outposts 环境。

典型配套场景

该数据源通常与其他 Outposts 网络资源配合使用,形成完整的数据链路:

  1. aws_ec2_local_gateway/aws_ec2_local_gateways定位 Local Gateway;
  2. aws_ec2_local_gateway_virtual_interface_group定位 Virtual Interface Group;
  3. aws_ec2_local_gateway_virtual_interface深入查询单个 VIF 的 BGP 与 VLAN 参数;
  4. 资源侧(如 ec2_local_gateway_route_table_virtual_interface_group_association.html.markdown)将该 Group 与 Local Gateway 路由表建立关联,从而驱动 Outpost 上的本地路由。

总结

aws_ec2_local_gateway_virtual_interface_group数据源提供了idlocal_gateway_idfiltertags四条相互补充的查询路径,并在源码层面通过过滤器合并、分页拉取与单结果断言保证了查询的严谨性。理解其"单结果约束"与local_gateway_virtual_interface_ids集合语义,是正确编写 Outposts 本地网络自动化配置的关键。

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

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/18 23:30:43

用 kohya_ss 训练你的 AI 画师:零基础 LoRA 训练完整教程

用 kohya_ss 训练你的 AI 画师:零基础 LoRA 训练完整教程 【免费下载链接】kohya_ss 项目地址: https://gitcode.com/GitHub_Trending/ko/kohya_ss 你手里有 20 张喜欢的图,想让 AI 学会其中的"味道",再生成同风格的新图。…

作者头像 李华
网站建设 2026/9/18 23:30:20

IDEA+HBuilderX全栈开发:Spring Boot与uni-app打包

这套组合拳我打了不下几十个项目了——IntelliJ IDEA 负责后端(Java/Spring Boot 那一摊),HBuilderX 负责前端(uni-app 这一摊),两边各自启动、各自打包,最后在服务器或者手机上拼成一个完整产品…

作者头像 李华
网站建设 2026/9/18 23:29:41

Ubuntu 18.04 安装 Docker:官方 APT 源配置与排错实战

上周有个读者发来一段报错,说他在一台 Ubuntu 18.04 的机器上装 Docker,apt install docker.io装完之后docker info里一堆警告,跑docker run hello-world直接卡住不动。这类问题我这两年遇到过不下十次,几乎每一次的根因都不一样&…

作者头像 李华
网站建设 2026/9/18 23:27:54

2026年靠谱的红木回收公司推荐,一诺红木家具回收上榜

红木回收市场现状近年来,随着红木家具市场的发展,红木回收行业也逐渐兴起。然而,市场上红木回收公司良莠不齐,消费者在选择时往往面临诸多困惑。如何找到一家靠谱的红木回收公司成为了许多人关心的问题。一诺红木家具回收的优势 专…

作者头像 李华