深入解读 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),或者改用下方介绍的id、filter、tags三种查询路径之一。
参数参考(Argument Reference)
该数据源的参数全部为可选(Optional),按查询策略可分为以下四类:
| 参数 | 类型 | 必填性 | 说明 |
|---|---|---|---|
region | String | 可选 | 该数据源执行查询的 AWS 区域,默认使用 Provider 配置中设定的区域;仅需跨区域查询时才需要显式指定 |
id | String | 可选 | EC2 Local Gateway Virtual Interface Group 的标识符(形如lgw-vif-grp-xxxxxxxx) |
local_gateway_id | String | 可选 | 所属 EC2 Local Gateway 的标识符(形如lgw-xxxxxxxx) |
filter | Block | 可选 | 一个或多个 name-value 过滤块,支持的过滤器以 EC2 API 的DescribeLocalGatewayVirtualInterfaceGroups文档为准 |
tags | Map | 可选 | 资源的标签键值映射,必须与目标 Local Gateway Route Table 上的标签键值完全一致才能命中 |
以上四类参数在源码的 Schema 定义中均体现为Optional且大多为Optional + Computed(见 outposts_local_gateway_virtual_interface_group_data_source.go),也就是说:不提供该参数时数据源也能通过其他条件查询并回填该值。
filter 过滤块
filter配置块支持以下两个子参数:
name-(必填)过滤器名称,例如local-gateway-id、tag-key、tag-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 返回的LocalGatewayVirtualInterfaceGroupId,local_gateway_id与tags也都会在读取后被回填。
该数据源与单个 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):
- 构造 API 请求:若配置了
id,则将其填入DescribeLocalGatewayVirtualInterfaceGroupsInput的LocalGatewayVirtualInterfaceGroupIds字段; - 合并三类过滤器:
local_gateway_id会被自动转换成local-gateway-id过滤器,tags会被转换成标签过滤器,二者再与用户显式声明的filter块合并; - 空过滤器保护:如果合并后过滤器列表为空,源码会显式将其置为
nil,因为 EC2 API 不接受空过滤器列表(源码第 82-85 行的注释明确说明了这一点); - 分页查询与单结果断言:实际查询由 find.go 中的
findLocalGatewayVirtualInterfaceGroup完成——它先调用findLocalGatewayVirtualInterfaceGroups通过DescribeLocalGatewayVirtualInterfaceGroupsPaginator翻页拉取全部结果,再交给tfresource.AssertSingleValueResult断言必须恰好命中一条记录; - 写入状态:命中后将
LocalGatewayVirtualInterfaceGroupId设为资源 ID,并回填local_gateway_id、local_gateway_virtual_interface_ids与标签。
需要特别留意的是第 4 步的单结果约束:这是一个"单一(singular)"数据源,若查询条件过宽导致命中多条记录,会通过tfresource.SingularDataSourceFindError返回错误。因此实际使用时,id、local_gateway_id、filter、tags应组合出能唯一定位的条件。若业务上需要一次性枚举所有 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,并断言两个数据源的id与local_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 网络资源配合使用,形成完整的数据链路:
aws_ec2_local_gateway/aws_ec2_local_gateways定位 Local Gateway;aws_ec2_local_gateway_virtual_interface_group定位 Virtual Interface Group;aws_ec2_local_gateway_virtual_interface深入查询单个 VIF 的 BGP 与 VLAN 参数;- 资源侧(如 ec2_local_gateway_route_table_virtual_interface_group_association.html.markdown)将该 Group 与 Local Gateway 路由表建立关联,从而驱动 Outpost 上的本地路由。
总结
aws_ec2_local_gateway_virtual_interface_group数据源提供了id、local_gateway_id、filter、tags四条相互补充的查询路径,并在源码层面通过过滤器合并、分页拉取与单结果断言保证了查询的严谨性。理解其"单结果约束"与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),仅供参考