使用 Terraform AWS Provider 的 aws_outposts_assets 数据源查询 Outposts 硬件资产清单
【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws
aws_outposts_assets是 terraform-provider-aws 中用于查询 AWS Outposts 站点内硬件资产(Asset)信息的数据源,它基于 Outpost 的 ARN 拉取该 Outpost 上全部硬件资产 ID,并支持按宿主机 ID(Host ID)与资产状态(Status)进行过滤。阅读本文后,你将掌握该数据源的完整参数用法、与aws_outposts_outpost/aws_outposts_asset等关联数据源的协作方式,以及其在 SDK v2 层面的底层实现与校验规则。
数据源概述:什么是 Outposts 硬件资产
AWS Outposts 是将 AWS 基础设施、服务、API 与工具带到本地数据中心或托管机房的解决方案。安装在客户现场的机架中包含服务器、交换机等物理硬件单元,这些单元在 AWS 侧被抽象为Asset(硬件资产),每个资产拥有唯一的AssetId,并可关联到具体的HostId(专用宿主机 ID)、RackId(机架 ID)、机架槽位(rack_elevation)以及实例族(instance_families)等信息。
aws_outposts_assets数据源负责批量列出某个 Outpost 下的资产 ID,与单资产查询数据源 aws_outposts_asset(按asset_id查询单个资产详情)形成互补。其典型应用场景包括:
- 通过
aws_outposts_asset逐个查询资产明细前,先取得该 Outpost 的全部资产 ID 列表; - 结合专用宿主机(Dedicated Host)的 Host ID 定位特定主机对应的资产;
- 按资产生命周期状态(ACTIVE / RETIRING)筛选可用的硬件资源。
数据源对应的 TypeName 为aws_outposts_assets,在仓库的 Outposts 服务包注册表中被声明为 SDK 数据源,见 internal/service/outposts/service_package_gen.go。
前置条件:先获取 Outpost 的 ARN
aws_outposts_assets的唯一必填参数是arn(Outpost ARN)。你既可以直接在配置中硬编码 ARN,更常见的做法是借助 Outposts 服务包中另外两个数据源动态获取:
- aws_outposts_outposts:列出(可按可用区、站点等过滤)全部 Outpost,导出
arns与ids集合; - aws_outposts_outpost:按
id、name、arn或owner_id精确匹配单个 Outpost,导出arn、availability_zone、site_arn、supported_hardware_type等属性。
例如,下面的配置取当前账户第一个 Outpost 的 ARN 作为资产查询的输入:
data "aws_outposts_outposts" "example" {} data "aws_outposts_assets" "example" { arn = tolist(data.aws_outposts_outposts.example.arns)[0] }在仓库的验收测试中正是采用这一链路:先通过data "aws_outposts_outposts" "test" {}取得 ARN 列表,再传给aws_outposts_assets,参见 internal/service/outposts/outpost_assets_data_source_test.go。
参数参考(Argument Reference)
该数据源支持的参数如下:
| 参数 | 必填 | 类型 | 说明 |
|---|---|---|---|
region | 否 | string | 数据源将被管理的 AWS 区域,默认取 provider 配置中设置的区域(对应区域化端点)。 |
arn | 是 | string | 目标 Outpost 的 ARN,格式如arn:aws:outposts:<region>:<account>:outpost/<outpost-id>。 |
host_id_filter | 否 | 字符串集合 | 按 Dedicated Host(专用宿主机)的 Host ID 列表过滤资产。 |
status_id_filter | 否 | 字符串集合 | 按资产状态列表过滤。有效值:"ACTIVE"、"RETIRING"。 |
region:区域化管理
region与 AWS Provider 中绝大多数数据源/资源保持一致:未指定时使用 provider 配置中的区域;指定后,数据源会通过该区域对应的区域化端点调用 Outposts API。这一点在 Outposts 服务包的区域化端点解析器中体现,参见 internal/service/outposts/service_endpoint_resolver_gen.go。
arn:必填的 Outpost 标识
arn为必填项,并且在 Schema 中配置了verify.ValidARN校验函数,即 Terraform 会在执行计划阶段直接校验该值是否为合法的 ARN 格式,不合法会在terraform validate/plan阶段即报错,而不是等到apply时由 AWS API 返回错误。对应实现见 internal/service/outposts/outpost_assets_data_source.go。
host_id_filter:按专用宿主机过滤
host_id_filter接收一组 Host ID,例如"h-x38g5n0yd2a0ueb61"(来自测试环境变量OUTPOST_HOST_ID的取值示例)。从源码看,该参数在 Schema 层面配置了严格的格式校验:
- 字符串长度限制在 1~50 个字符之间(
validation.StringLenBetween(1, 50)); - 仅允许数字、大小写字母与连字符(正则
^[0-9A-Za-z-]*$)。
这些校验规则位于 internal/service/outposts/outpost_assets_data_source.go 的host_id_filterSchema 定义中。配置时:
data "aws_outposts_assets" "example" { arn = data.aws_outposts_outpost.example.arn host_id_filter = ["h-x38g5n0yd2a0ueb61"] }status_id_filter:按资产状态过滤
status_id_filter按资产生命周期状态过滤,文档声明的有效值为"ACTIVE"(正常使用中)与"RETIRING"(退役中)。源码中该字段使用enum.Validate[awstypes.AssetState]()进行枚举校验,且设置了MaxItems: 2,即最多传入 2 个状态值,与 Outposts API 的AssetState枚举一致:
data "aws_outposts_assets" "example" { arn = data.aws_outposts_outpost.example.arn status_id_filter = ["ACTIVE"] }注意两个过滤参数都是schema.TypeSet(集合),因此:
- 元素顺序无关紧要;
- 使用
["ACTIVE", "RETIRING"]表示"两者都包含"的并集过滤语义。
属性参考(Attribute Reference)
除上述参数外,数据源还会导出以下计算属性:
| 属性 | 说明 |
|---|---|
asset_ids | 查找到的全部资产 ID 列表。若未找到任何资产,数据源会直接报错,而不是返回空列表。 |
asset_ids是TypeList,元素为字符串。你可以在下游配置中通过data.aws_outposts_assets.example.asset_ids引用,例如配合单资产数据源aws_outposts_asset遍历查询每个资产的机架位置与实例族信息:
data "aws_outposts_assets" "example" { arn = data.aws_outposts_outpost.example.arn } data "aws_outposts_asset" "each" { for_each = toset(data.aws_outposts_assets.example.asset_ids) arn = data.aws_outposts_outpost.example.arn asset_id = each.value } output "asset_rack_locations" { value = { for k, v in data.aws_outposts_asset.each : k => { host_id = v.host_id rack_id = v.rack_id rack_elevation = v.rack_elevation } } }底层实现原理:ListAssets 分页读取
该数据源的读取逻辑位于 internal/service/outposts/outpost_assets_data_source.go 的DataSourceOutpostAssetsRead函数,核心流程如下:
- 从 provider 连接池中获取 Outposts 客户端:
conn := meta.(*conns.AWSClient).OutpostsClient(ctx); - 构造
outposts.ListAssetsInput,其中OutpostIdentifier直接使用用户传入的arn值; - 若配置了
host_id_filter,通过flex.ExpandStringValueSet将 Terraform Set 展开为 API 需要的HostIdFilter字符串切片; - 若配置了
status_id_filter,通过flex.ExpandStringyValueSet[awstypes.AssetState]展开为StatusFilter的AssetState枚举切片; - 使用
outposts.NewListAssetsPaginator自动分页遍历所有页,将每页page.Assets中的AssetId累积到assetIds切片; - 空结果即报错:若累积结果长度为 0,返回
"no Outposts Assets found matching criteria; try different search"错误——这是该数据源的明确行为约定,用于提醒用户调整过滤条件; - 最后将
asset_ids写入状态,并把数据源 ID 设置为 Outpost ARN(d.SetId(aws.ToString(outpost_id))),使每次读取具备幂等标识。
值得说明的是,分页器来自 AWS SDK for Go v2 的service/outposts包,因此即便一个 Outpost 包含数百个资产,数据源也能完整拉取,无需用户关心分页游标。
测试验证与行为保证
仓库为aws_outposts_assets提供了三组验收测试,位于 internal/service/outposts/outpost_assets_data_source_test.go:
TestAccOutpostsAssetsDataSource_id:不附加任何过滤,验证arn属性为合法的 Outposts 区域 ARN(正则outpost/.+);TestAccOutpostsAssetsDataSource_statusFilter:先无过滤查询得到source,再以status_id_filter = ["ACTIVE"]二次过滤,校验status_id_filter.0的返回值;TestAccOutpostsAssetsDataSource_hostFilter:通过环境变量OUTPOST_HOST_ID(如h-x38g5n0yd2a0ueb61)注入真实 Host ID,校验host_id_filter.*集合元素。
三个测试均在PreCheck中依赖OUTPOST_AVAIL环境变量,未设置时跳过执行——这类数据源属于"真实资源依赖型",只在存在真实 Outpost 的 AWS 账户中运行。测试同时印证了一个实用链路:先无过滤查询拿到资产,再带过滤条件做二次确认,这在排查过滤条件是否有效时非常有用。
使用注意事项
- 空结果会报错:
aws_outposts_assets在没有任何匹配资产时返回错误而非空列表,这是源码中的硬性逻辑,设计上用于及早暴露过滤条件写错、ARN 指错等问题; - ARN 格式校验前置:
arn在 Terraform 层面即做 ARN 合法性校验,可提前拦截拼写错误; - Host ID 有字符约束:
host_id_filter元素仅允许 1~50 位字母、数字与连字符; - 状态过滤最多两个值:
status_id_filter的MaxItems为 2,且仅接受ACTIVE与RETIRING; - 数据源 ID 为 Outpost ARN:每次
refresh都会重新调用 ListAssets API,资产增减会反映到下一次读取结果中; - 该数据源为只读查询,不会在 AWS 侧创建、修改或删除任何资源,适合与
aws_outposts_asset、aws_outposts_outpost组合构建资产管理相关的基础设施编排。
【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考