terraform-provider-aws 数据源 aws_ec2_local_gateway 实战:查询与过滤 Local Gateway 详解
【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws
本篇指南完整讲解 terraform-provider-aws 中aws_ec2_local_gateway数据源的配置与使用:它用于查询当前区域内的单个 EC2 Local Gateway(Outposts 本地网关),支持按id、state、tags与自定义filter精确筛选,并导出outpost_arn、owner_id等属性。读者学完后可以快速定位指定 Local Gateway、将其 ID 与 ARN 注入其他资源(如aws_ec2_local_gateway_route、aws_ec2_local_gateway_route_table_vpc_association),并理解数据源底层的 EC2 API 调用与唯一性校验机制。
数据源简介与适用场景
aws_ec2_local_gateway是 AWS Provider 中 EC2 服务(internal/service/ec2)提供的只读数据源,用于获取某一个Local Gateway 的详细信息。Local Gateway 是 AWS Outposts 部署中的本地网络组件,它把 VPC 子网流量转发到本地 IDC 网络,是 Outposts 网络架构的关键一环。该数据源的核心用途包括:
- 以变量或上游资源输出作为
id,查询对应 Local Gateway 的 ARN、所属账号与状态; - 在构建本地网关路由表、虚拟接口组等关联资源时,作为依赖解析与参数注入的桥梁;
- 通过标签或自定义过滤器,从多个 Local Gateway 中精确挑选目标实例。
数据源的定义位于 internal/service/ec2/outposts_local_gateway_data_source.go,其官方文档即 website/docs/d/ec2_local_gateway.html.markdown。
基本用法:按 ID 查询
文档给出的最典型用法是接收一个 Local Gateway ID 变量并查询其详情:
variable "local_gateway_id" {} data "aws_ec2_local_gateway" "selected" { id = var.local_gateway_id }配置完成后,可以通过data.aws_ec2_local_gateway.selected.id、data.aws_ec2_local_gateway.selected.outpost_arn等表达式在输出或其他资源中引用结果:
output "outpost_arn" { value = data.aws_ec2_local_gateway.selected.outpost_arn }如果账号内只有一个 Local Gateway,也可以直接使用配套的aws_ec2_local_gateways数据源先拿到全部 ID,再取第一个进行细化查询:
data "aws_ec2_local_gateways" "all" {} data "aws_ec2_local_gateway" "selected" { id = tolist(data.aws_ec2_local_gateways.all.ids)[0] }参数详解(Argument Reference)
aws_ec2_local_gateway数据源支持的查询参数如下,所有参数均为可选,它们共同构成筛选条件,最终查询结果必须精确匹配唯一的 Local Gateway:
| 参数 | 类型 | 说明 |
|---|---|---|
region | Optional | 查询区域,默认使用 provider 配置 中设置的区域;该参数用于将数据源指向特定区域执行查询 |
filter | Optional | 自定义过滤子块,可表达标量参数与标签无法覆盖的复杂组合条件 |
id | Optional | 目标 Local Gateway 的唯一标识(形如lgw-xxxx),用于精确定位 |
state | Optional | 目标 Local Gateway 的当前状态,可选值为"pending"或"available" |
tags | Optional | 标签映射,必须与目标 Local Gateway 上的标签键值对完全一致才能匹配 |
这些参数在数据源读取阶段会被转换为 EC2 API 的Filters输入。从源码 outposts_local_gateway_data_source.go 可以看到完整的构造逻辑:
id直接映射为 API 请求中的LocalGatewayIds;state通过newAttributeFilterList转为精确匹配过滤器;tags通过newTagFilterList转换为tag:<key>形式的过滤器;filter子块通过newCustomFilterList逐一展开;- 当所有过滤条件都为空时,代码会显式将
Filters置为nil(注释说明 EC2 API 不接受空的 filters 列表)。
filter 子块
filter子块用于表达更复杂的组合查询,每个子块包含两个必填参数:
name- (Required) 要过滤的字段名,字段名称由底层 EC2 API 定义(对应 DescribeLocalGateways 的过滤器集合,如local-gateway-id、state、tag-key、tag:<key>等);values- (Required) 该字段可接受的值的集合,只要命中集合中任意一个值即视为匹配。
data "aws_ec2_local_gateway" "selected" { filter { name = "state" values = ["available"] } }从实现层面看,filter属性是一个schema.TypeSet(见 internal/service/ec2/filters.go 中customFiltersSchema的定义),每个元素包含必填的name与values;读取时newCustomFilterList将每个子块转换为一个ec2.Filter{Name, Values}对象,最终拼入DescribeLocalGatewaysInput.Filters。
多条件组合与唯一性约束
文档明确指出:数据源的参数充当"过滤器",给定的筛选条件必须精确匹配唯一一个 Local Gateway,其数据才会被导出。这意味着:
- 匹配 0 个对象时,数据源报错"找不到";
- 匹配多个对象时,数据源同样报错。
这一约束在源码中有硬性保证:findLocalGateway在拿到分页结果后调用tfresource.AssertSingleValueResult(output)强制断言结果集大小为 1(见 internal/service/ec2/find.go),任何不唯一或为空的结果都会产生SingularDataSourceFindError(见 outposts_local_gateway_data_source.go)。因此在多 Local Gateway 的账号中,应尽量使用id或足够有区分度的tags组合条件,避免查询歧义。
属性输出(Attribute Reference)
除filter子块外,所有参数属性(id、state、tags等)都会作为结果属性一并导出;同时数据源会补齐配置中未包含的字段,将选中 Local Gateway 的完整数据写入结果。额外导出的属性包括:
outpost_arn- 所属 Outpost 的 ARN;owner_id- 拥有该 Local Gateway 的 AWS 账号标识;state- Local Gateway 的状态。
这些属性在读取函数中逐一写入(outposts_local_gateway_data_source.go):SetId使用 API 返回的LocalGatewayId,随后写入OutpostArn、OwnerId、State,标签则通过setTagsOut保存,以便在整个 Provider 的标签处理流程中被引用。
底层原理:DescribeLocalGateways 调用链
数据源读取的核心链路如下:
- 用户配置的
id/state/tags/filter被组装为ec2.DescribeLocalGatewaysInput; findLocalGateways使用 AWS SDK for Go v2 的NewDescribeLocalGatewaysPaginator分页拉取全部 Local Gateway 列表(internal/service/ec2/find.go);findLocalGateway调用AssertSingleValueResult校验唯一性;- 命中结果后回填
ResourceData并设置数据源 ID。
其中标签与自定义过滤器的转换依赖 internal/service/ec2/filters.go 的三个核心函数:newAttributeFilterList(标量属性精确匹配)、newTagFilterList(tag:<key>匹配)、newCustomFilterList(自定义子块展开)。从代码结构看,这套 filter 工具函数被 EC2 下的多个数据源(如ebs_volume、ec2_ami等)复用,属于 EC2 数据源的通用过滤基础设施。
测试验证与配套数据源
仓库为数据源提供了完整的单元/验收测试。TestAccEC2OutpostsLocalGatewayDataSource_basic(outposts_local_gateway_data_source_test.go)验证了:
- 返回的
id匹配^lgw-前缀; outpost_arn匹配 Outposts ARN 格式(outpost/op-.+);owner_id等于当前账号 ID;state为available。
配套的aws_ec2_local_gateways数据源(定义见 outposts_local_gateways_data_source.go,文档见 website/docs/d/ec2_local_gateways.html.markdown)用于一次性获取当前区域全部 Local Gateway 的ids列表,可与本数据源组合实现"先枚举、再精查"的查询模式。
超时配置(Timeouts)
数据源支持read超时,默认值为20m,与源码中schema.DefaultTimeout(20 * time.Minute)的定义一致(outposts_local_gateway_data_source.go)。可按需调整:
data "aws_ec2_local_gateway" "selected" { id = var.local_gateway_id timeouts { read = "10m" } }关联资源导航
Local Gateway 在 Provider 中是一组完整的资源家族,查询到 Local Gateway 后通常配合以下资源使用:
- aws_ec2_local_gateway_route - 管理 Local Gateway 路由;
- aws_ec2_local_gateway_route_table 及 对应数据源 - 管理/查询本地网关路由表;
- aws_ec2_local_gateway_route_table_vpc_association - 将路由表关联到 VPC;
- aws_ec2_local_gateway_virtual_interface_group 等数据源 - 查询虚拟接口组信息。
在编排 Outposts 本地网络时,典型的依赖链是:用本数据源定位 Local Gateway → 关联路由表与 VPC → 下发本地网关路由,实现本地数据中心与 VPC 之间的流量打通。
【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考