尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Terraform AWS Provider `aws_licensemanager_grants` 数据源:批量查询 License Manager 授权(Grant)ARN 实战指南

Terraform AWS Provider `aws_licensemanager_grants` 数据源:批量查询 License Manager 授权(Grant)ARN 实战指南 Terraform AWS Provideraws_licensemanager_grants数据源批量查询 License Manager 授权GrantARN 实战指南【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws导读aws_licensemanager_grants是 Terraform AWS Provider 提供的一个数据源Data Source用于通过自定义过滤条件一次性查询一组 AWS License Manager 授权License Grant的 ARN而无需逐个调用aws_licensemanager_grant资源或手工拼接 ARN。它特别适合跨账户许可证共享场景——例如列出当前账户作为被授权人Grantee收到的全部授权或在多个授权中按ProductSKU、GranteePrincipalARN等字段精确筛选。阅读本文后你将掌握该数据源的完整配置语法、过滤机制、底层 AWS API 调用链以及如何与aws_licensemanager_grant、aws_licensemanager_grant_accepter等资源协同完成 License Manager 授权管理。数据源概述与适用场景在 AWS License Manager 中授权Grant是许可证所有者将许可证的使用权分享给其他 AWS 账户的一种机制。aws_licensemanager_grants数据源的核心价值在于一次调用即可拿到一批满足条件的 Grant ARN 列表供后续资源引用或在输出中展示。典型使用场景包括审计/盘点列出当前账户所有分发或接收的授权 ARN用于合规检查与成本归因批量运维结合for_each或count对 ARN 列表做循环处理如批量验收、批量记录条件筛选只选取特定产品、特定授权主体的授权避免全量数据带来的噪声。注意该数据源返回的是ARN 列表arns而非授权对象的完整属性。若需要单个授权的详细信息可结合aws_licensemanager_grant资源的arn、status、version等导出属性或使用仓库中同目录下的aws_licensemanager_received_license数据源见 website/docs/d/licensemanager_received_license.html.markdown。基本用法获取授予当前账户的全部授权 ARN数据源最直接的用法是不指定任何filter直接查询此时返回满足当前账户/区域条件下的全部授权 ARN。文档中的经典示例是通过GranteePrincipalARN过滤出被授权人为当前账户 root 用户的授权实现获取所有授予你账户的授权 ARNdata aws_caller_identity current {} data aws_licensemanager_grants test { filter { name GranteePrincipalARN values [ arn:aws:iam::${data.aws_caller_identity.current.account_id}:root ] } } output grant_arns { value data.aws_licensemanager_grants.test.arns }这里借助aws_caller_identity数据源动态获取当前账户 ID拼装成 root 主体的 ARN 作为过滤值避免硬编码账号。执行terraform plan后arns属性将输出所有匹配授权的 ARN 列表。无过滤查询如果不希望有任何过滤条件可以直接省略filter块data aws_licensemanager_grants all {} output all_grant_arns { value data.aws_licensemanager_grants.all.arns }仓库中的集成测试 internal/service/licensemanager/grants_data_source_test.go 正是采用这种无 filter 全量读取的方式先通过aws_licensemanager_grant创建一个真实授权再用data aws_licensemanager_grants test {}读取并断言arns.0已被设置TestCheckResourceAttrSet从而验证全量查询路径的正确性。参数参考Argument Reference该数据源支持以下参数参数类型必填说明regionstring可选数据源所在区域。默认为 provider 配置 中设置的区域。License Manager 是区域化服务跨区域数据不会混入结果filterblock可选自定义过滤块可声明一个或多个具体字段见下文filter子块filter是声明式过滤的核心每个子块包含两个必填参数name-必填要过滤的字段名字段定义以 底层 AWS API 的请求语法 为准。例如按产品 SKU 过滤data aws_licensemanager_grants selected { filter { name ProductSKU values [] # insert values here } }values-必填该字段可接受的取值集合Set支持传入多个值做匹配。例如同时匹配多个授权主体data aws_licensemanager_grants multi { filter { name GranteePrincipalARN values [ arn:aws:iam::111111111111:root, arn:aws:iam::222222222222:root, ] } }多 filter 组合需要表达更复杂的筛选逻辑时可声明多个filter子块数据源会按 AND 语义组合各条件逐步缩小结果集data aws_licensemanager_grants combined { filter { name ProductSKU values [ABC-123] } filter { name GrantStatus values [ACTIVE] } }属性参考Attribute Reference除上述参数外数据源还导出以下属性属性说明id数据源 ID。从源码看实现中将 ID 设置为当前区域见下文源码分析arns查找到的所有 License Manager 授权 ARN 列表List of String。若没有匹配项则为空列表[]仓库的无匹配测试用例 internal/service/licensemanager/grants_data_source_test.go 使用LicenseIssuerName No Match作为过滤条件并断言arns.#等于0证明无匹配时返回空列表而非报错。源码实现从 Schema 到 AWS API 的完整调用链了解底层实现有助于把握数据源的行为边界。该数据源的定义位于 internal/service/licensemanager/grants_data_source.go源码结构清晰展示了Schema 定义 → 参数转换 → API 调用 → 结果落盘的完整链路。Schema 定义// SDKDataSource(aws_licensemanager_grants, nameGrants) func dataSourceGrants() *schema.Resource { return schema.Resource{ ReadWithoutTimeout: dataSourceDistributedGrantsRead, SchemaFunc: func() map[string]*schema.Schema { return map[string]*schema.Schema{ names.AttrARNs: { Type: schema.TypeList, Computed: true, Elem: schema.Schema{Type: schema.TypeString}, }, names.AttrFilter: namevaluesfilters.Schema(), } }, } }对应 internal/service/licensemanager/grants_data_source.go#L26-L41。可以看到arns是TypeList的 Computed 属性filter复用了namevaluesfilters.Schema()这一通用过滤 Schema定义于 internal/namevaluesfilters/name_values_filters.go#L109-L129其内部即nameRequired StringvaluesRequired String Set两个字段与文档中的参数说明一一对应。filter 的标准化转换读取逻辑中Terraform 侧的*schema.Set会被转换为 AWS SDK 侧的过滤器结构if v, ok : d.GetOk(names.AttrFilter); ok v.(*schema.Set).Len() 0 { input.Filters namevaluesfilters.New(v.(*schema.Set)).LicenseManagerFilters() }对应 internal/service/licensemanager/grants_data_source.go#L49-L51。这里调用namevaluesfilters.New()将 Terraform 的 Set 结构统一转换为map[string][]string形式的内部过滤器实现见 internal/namevaluesfilters/name_values_filters.go#L102-L104转换过程中会做空值剔除与重复值去重Map()方法见 internal/namevaluesfilters/name_values_filters.go#L69-L98再通过LicenseManagerFilters()适配为 License Manager 服务专有的 Filter 类型。底层 API 与分页处理值得关注的一个实现细节是当前仓库实现调用的底层 API 是ListDistributedGrants列出分发出去的授权。读取函数构造licensemanager.ListDistributedGrantsInput随后调用findDistributedGrants见 internal/service/licensemanager/grants_data_source.go#L67-L91分页遍历通过listDistributedGrantsPages逐页拉取数据页间用NextToken衔接分页函数由生成器产出见 internal/service/licensemanager/list_pages_gen.go#L16-L31因此即使授权数量很多结果也能完整聚合不会截断异常处理将ResourceNotFoundException归一化为retry.NotFoundError保证数据源在资源不存在时行为可预期结果提取tfslices.ApplyToAll(grants, ...)遍历每条Grant取出GrantArn字段组成最终 ARN 列表ID 设置d.SetId(meta.(*conns.AWSClient).Region(ctx))即以当前区域作为数据源 ID这也是文档中region参数语义的底层体现。与关联资源的协同完整的授权管理闭环该数据源通常在授权生命周期管理配置中扮演查询层角色与以下资源配合可形成完整闭环资源/数据源作用文档位置aws_licensemanager_grant创建授权将许可证分享给其他账户website/docs/r/licensemanager_grant.html.markdownaws_licensemanager_grant_accepter在被授权账户侧接受/拒绝授权website/docs/r/licensemanager_grant_accepter.html.markdownaws_licensemanager_received_licenses批量查询收到的许可证 ARN与本文数据源结构完全对称website/docs/d/licensemanager_received_licenses.html.markdownaws_licensemanager_received_license查询单个收到的许可证详情website/docs/d/licensemanager_received_license.html.markdown以查授权 → 引用 ARN为例arns结果可无缝衔接给其他资源做批量处理data aws_licensemanager_grants for_audit { filter { name ProductSKU values [SAP-B1] } } # 将 ARN 列表输出或交给 for_each 循环消费 output grant_arns_for_audit { value data.aws_licensemanager_grants.for_audit.arns }从源码看aws_licensemanager_grant资源创建授权时调用CreateGrant其返回的GrantArn直接作为资源 ID见 internal/service/licensemanager/grant.go#L103-L126而aws_licensemanager_grant_accepter在验收授权时依赖ListReceivedGrants查找收到的授权见 internal/service/licensemanager/grant_accepter.go#L159-L183。两者共同说明License Manager 的授权数据围绕分发Distributed与接收Received两个方向组织查询场景也应据此选择对应的数据源。常见问题与使用建议filter的字段名以什么为准以 底层 AWS API 的请求语法 中定义的 Filter 字段为准如GranteePrincipalARN、ProductSKU、GrantStatus、LicenseIssuerName等。仓库测试中使用的LicenseIssuerName见 internal/service/licensemanager/grants_data_source_test.go#L87即是有效字段示例。无匹配结果会不会报错不会。数据源返回空列表arns []arns.#为0不会产生错误适合在配置中安全引用。为什么结果可能与预期不一致请检查两点一是region是否与授权所在区域一致License Manager 为区域化服务二是该数据源底层查询的是分发Distributed方向的授权若需查询收到的授权应使用aws_licensemanager_received_licenses数据源。分页数据会丢失吗不会。listDistributedGrantsPages会自动遍历所有分页并通过NextToken续接最终聚合完整结果。结语aws_licensemanager_grants用极简的声明式语法将按条件批量获取授权 ARN这一高频操作封装为一个数据源filter子块负责精确筛选arns属性直接输出可消费的 ARN 列表底层则通过ListDistributedGrants配合自动分页保证数据完整性。结合aws_licensemanager_grant、aws_licensemanager_grant_accepter以及对称的aws_licensemanager_received_licenses数据源即可在 Terraform 中构建出覆盖创建授权 → 查询授权 → 接收/验收授权全流程的 License Manager 管理方案。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表