Terraform AWS Provider 数据源 `aws_location_geofence_collection` 完全指南:读取地理围栏集合信息
2026/9/19 3:52:37 网站建设 项目流程

Terraform AWS Provider 数据源aws_location_geofence_collection完全指南:读取地理围栏集合信息

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

aws_location_geofence_collection是 Terraform AWS Provider 中用于查询 AWS Location Service 地理围栏集合(Geofence Collection)元数据的数据源。本文将围绕该数据源的核心用法展开:先给出可直接运行的 Terraform 配置示例,再逐一拆解全部入参与导出属性,并结合当前仓库 internal/service/location/geofence_collection_data_source.go 的源码实现,说明数据源背后的 API 调用链、属性映射与标签过滤逻辑,帮助你在既有地理围栏集合之上安全地引用 ARN、KMS 密钥与标签信息,而无需在配置中硬编码。

数据源概述与适用场景

地理围栏(Geofence)是 AWS Location Service 提供的空间能力,用于在虚拟边界内对设备位置进行判定。多个地理围栏按业务语义组织成地理围栏集合(Geofence Collection)。当你需要在一个或多个 Terraform 配置中引用已存在(通常由其他团队或独立配置创建)的地理围栏集合时,使用数据源是推荐做法:

  • 动态获取collection_arn,避免在 IAM 策略、跨资源引用中写死 ARN;
  • 读取创建/更新时间戳、描述、关联的 KMS 密钥 ID 与标签,供条件判断或输出使用;
  • terraform apply前即可验证目标集合是否存在(数据源读取失败会直接报错,而非静默通过)。

与之相对,如果需要创建并管理地理围栏集合的完整生命周期,则应使用同名的管理资源aws_location_geofence_collection(其实现位于 internal/service/location/geofence_collection.go)。数据源与资源共享同一套底层 API,属性语义完全对齐。

基本用法:读取一个地理围栏集合

原文档给出的最小可用配置如下:

data "aws_location_geofence_collection" "example" { collection_name = "example" }

执行terraform planterraform apply后,即可通过data.aws_location_geofence_collection.example.collection_arndata.aws_location_geofence_collection.example.description等表达式在其他资源中引用该集合的属性。

更贴近生产实践的写法是先用资源创建、再用数据源引用,这样既能验证数据源与资源属性的一致性,又能演示引用方式。该模式在仓库的接入测试 internal/service/location/geofence_collection_data_source_test.go 中有完整体现:

resource "aws_location_geofence_collection" "test" { collection_name = "example" } data "aws_location_geofence_collection" "test" { collection_name = aws_location_geofence_collection.test.collection_name }

注意测试配置通过aws_location_geofence_collection.test.collection_name将资源的名称直接注入数据源,而非硬编码字符串,这正是数据源的典型使用范式——让 Terraform 自动编排依赖关系。

参数说明(Argument Reference)

数据源支持以下入参:

参数是否必选说明
collection_name必选地理围栏集合的名称。
region可选该数据源实际访问的 AWS 区域,默认为 Provider 配置中设置的区域。

collection_name 的命名约束

collection_name并非任意字符串。从数据源源码 internal/service/location/geofence_collection_data_source.go 可以看到其 schema 校验规则:

"collection_name": { Type: schema.TypeString, Required: true, ValidateFunc: validation.StringLenBetween(1, 100), },

即名称长度必须位于1 到 100 个字符之间,超出该范围会在plan阶段直接被校验拦截,而不会发起 AWS API 请求。管理资源 internal/service/location/geofence_collection.go 对collection_name使用了相同的校验规则,且标记为ForceNew: true(创建后不可原地修改,只能重建),说明名称一旦确定便不可变更。

region 参数的生效方式

region为可选参数,用于覆盖 Provider 默认区域,使数据源可在指定区域的终端节点上查询集合。AWS Location Service 采用区域化端点部署,集合创建在哪个区域,就只能在对应区域查询。省略region时,沿用 Provider 配置的区域设置。

属性说明(Attribute Reference)

collection_name本身外,数据源在读取成功后还会导出以下只读属性:

属性类型说明
collection_arnstring地理围栏集合的 ARN,用于跨 AWS 资源引用(如 IAM 策略)。
create_timestring集合创建时间戳,ISO 8601 格式。
descriptionstring集合的可选描述信息。
kms_key_idstring分配给该 Location 资源的 AWS KMS 客户自主管理密钥的密钥标识。
tagsmap(string)集合的资源标签键值对。
update_timestring集合最近一次更新的时间戳,ISO 8601 格式。

时间戳的格式保证

create_timeupdate_time在 AWS API 响应中为毫秒级时间戳,数据源在写入状态前统一转换为RFC 3339格式。对应源码:

d.Set(names.AttrCreateTime, aws.ToTime(out.CreateTime).Format(time.RFC3339)) d.Set("update_time", aws.ToTime(out.UpdateTime).Format(time.RFC3339))

因此这两个属性始终呈现为标准化的2026-09-18T03:56:43Z形态,便于在depends_on、时间比较或外部系统对接中直接使用。

tags 的过滤语义

数据源返回的tags并非 AWS API 返回的原始标签全集,而是经过两层过滤后的结果(见数据源源码末尾):

ignoreTagsConfig := meta.(*conns.AWSClient).IgnoreTagsConfig(ctx) if err := d.Set(names.AttrTags, keyValueTags(ctx, out.Tags).IgnoreAWS().IgnoreConfig(ignoreTagsConfig).Map()); err != nil { return create.AppendDiagError(diags, names.Location, create.ErrActionSetting, DSNameGeofenceCollection, d.Id(), err) }
  • IgnoreAWS():剔除 AWS 内部使用的预留标签(如aws:cloudformation:stack-name等);
  • IgnoreConfig(ignoreTagsConfig):进一步剔除用户在 Provider 的ignore_tags配置中声明忽略的标签。

这意味着tags反映的是经过用户策略清洗后的标签视图,与 Provider 全局的标签忽略机制保持一致。

源码级实现原理:数据源如何工作

数据源的完整读取逻辑位于 internal/service/location/geofence_collection_data_source.go 的dataSourceGeofenceCollectionRead函数,其执行链路如下:

  1. 获取客户端:通过meta.(*conns.AWSClient).LocationClient(ctx)取得 AWS SDK v2 的 Location Service 客户端;
  2. 取参数:读取collection_name
  3. 调用查找函数:调用findGeofenceCollectionByName(ctx, conn, name)
  4. 写状态:将返回值映射到各属性,并以collection_name作为资源 ID(d.SetId(aws.ToString(out.CollectionName)));
  5. 返回诊断:任何一步出错都会通过create.AppendDiagError汇总为 Terraform 诊断信息。

其中findGeofenceCollectionByName定义在管理资源的源码 internal/service/location/geofence_collection.go 中,是数据源与资源共享的查找函数

func findGeofenceCollectionByName(ctx context.Context, conn *location.Client, name string) (*location.DescribeGeofenceCollectionOutput, error) { in := &location.DescribeGeofenceCollectionInput{ CollectionName: aws.String(name), } out, err := conn.DescribeGeofenceCollection(ctx, in) if errs.IsA*awstypes.ResourceNotFoundException { return nil, &retry.NotFoundError{ LastError: err, } } ... }

可以看到底层对应 AWS 的DescribeGeofenceCollectionAPI。当集合不存在时,AWS 返回ResourceNotFoundException,该函数将其包装为retry.NotFoundError,最终由数据源层转换为明确的读取失败诊断——这正是数据源能在plan阶段就暴露"目标集合不存在"这一问题的原因。而管理资源在Read阶段对同样的NotFound错误则采取"从状态中移除"的策略(日志输出removing from state),两种行为差异体现了数据源与资源对缺失实体的不同语义:数据源要求"必须存在",资源则容忍"已被外部删除"。

实战进阶:完整参数组合示例

将数据源与完整配置的资源搭配,可以一次拿到全部元数据。以下示例同时使用了描述、KMS 加密与标签,并与数据源串联,参考仓库接入测试 internal/service/location/geofence_collection_test.go 中的资源配置形态:

resource "aws_kms_key" "test" { deletion_window_in_days = 7 enable_key_rotation = true } resource "aws_location_geofence_collection" "test" { collection_name = "production-fences" description = "生产环境地理围栏集合" kms_key_id = aws_kms_key.test.arn tags = { Environment = "production" Team = "iot" } } data "aws_location_geofence_collection" "test" { collection_name = aws_location_geofence_collection.test.collection_name } output "geofence_arn" { value = data.aws_location_geofence_collection.test.collection_arn } output "geofence_created_at" { value = data.aws_location_geofence_collection.test.create_time } output "geofence_tags" { value = data.aws_location_geofence_collection.test.tags }

关于上述资源参数,从管理资源 schema(internal/service/location/geofence_collection.go)可以确认以下约束:

  • description:可选,长度 0–1000 字符,支持创建后原地更新(对应UpdateGeofenceCollectionAPI);
  • kms_key_id:可选,长度 1–2048 字符,标记为ForceNew——创建后不可更换密钥,只能重建集合;
  • tags:创建时传入,通过getTagsIn(ctx)合并 Provider 全局默认标签后随CreateGeofenceCollection请求发送;
  • 资源的 Create/Update/Delete 默认超时均为 30 分钟。

对只读场景(例如仅需 ARN 与描述),可以只保留资源名与数据源,其余参数省略——未配置的descriptionkms_key_id在数据源导出时对应为空字符串,tags为空 map。

小结

aws_location_geofence_collection数据源是对 AWS Location Service 地理围栏集合的只读抽象,本质上是DescribeGeofenceCollectionAPI 的 Terraform 封装。其入参仅有必选的collection_name与可选的region,导出属性覆盖 ARN、时间戳、描述、KMS 密钥与标签,足以支撑跨资源引用、条件判断与审计输出等常见需求。对于需要动态引用既有集合的场景,优先使用数据源获取collection_arn等元数据;需要管理集合生命周期时,则配合同名资源使用。两者的 schema 与查找逻辑在仓库中同源实现(geofence_collection_data_source.go 与 geofence_collection.go),属性和校验规则保持一致,组合使用时可放心依赖。

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

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

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

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

立即咨询