ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

使用 Terraform AWS Provider 的 aws_identitystore_group_memberships 数据源查询 IAM Identity Center 群组成员列表

2026/9/19 0:17:06 拓冰建站 浏览量
使用 Terraform AWS Provider 的 aws_identitystore_group_memberships 数据源查询 IAM Identity Center 群组成员列表 使用 Terraform AWS Provider 的 aws_identitystore_group_memberships 数据源查询 IAM Identity Center 群组成员列表【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws本篇技术指南聚焦于 HashiCorp Terraform AWS Providerterraform-provider-aws中的aws_identitystore_group_memberships数据源讲解如何通过 Terraform 配置查询 AWS IAM Identity Center原 AWS SSOIdentity Store 中指定群组Group的全部成员列表。读完本文你将掌握该数据源的完整参数与属性语义、与其配套的aws_identitystore_group、aws_identitystore_user、aws_identitystore_group_membership资源/数据源的组合用法以及它底层调用的 AWS API 与分页实现原理从而在真实基础设施代码中正确读取并引用群组成员信息。数据源概览它解决什么问题aws_identitystore_group_memberships是 AWS Provider 为SSO Identity Store子分类提供的数据源Data Source定义在 website/docs/d/identitystore_group_memberships.html.markdown。它的作用是根据identity_store_id与group_id一次性拉取该群组中的所有成员member及其关联信息并以group_memberships列表的形式返回。与单成员数据源aws_identitystore_user、单群组数据源aws_identitystore_group不同这是一个列表型数据源——它不返回单个对象而是返回一个成员列表。这在以下场景中尤为实用想要获得某个群组的所有成员 user_id供其他资源如 SSO 权限集分配循环引用需要审计或对比某个群组的成员构成与aws_identitystore_group_membership资源创建的真实成员关系对应验证在模块中导出群组成员清单供下游消费。注意Identity Store身份存储隶属于 AWS IAM Identity CenterSingle Sign-On因此使用该数据源的前提是当前 AWS 账户中已经存在一个启用了 Identity Center 的实例。使用前提先定位 Identity Store 与 GroupIdentity Store ID 不是凭空填写的它来自 Identity Center 实例。官方文档的示例通过aws_ssoadmin_instances数据源动态获取data aws_ssoadmin_instances example {} data aws_identitystore_group example { identity_store_id tolist(data.aws_ssoadmin_instances.example.identity_store_ids)[0] alternate_identifier { unique_attribute { attribute_path DisplayName attribute_value ExampleGroup } } }这段配置做了两件事aws_ssoadmin_instances数据源枚举当前账户中的 SSO 实例并通过tolist(...)[0]取出第一个实例的identity_store_id账户只启用一个实例时这是标准写法aws_identitystore_group数据源使用alternate_identifier.unique_attribute按DisplayName属性值ExampleGroup反查群组从而得到group_id。这是官方示例推荐的方式——不需要预先知道群组的 UUID。关于alternate_identifier的完整语义包括external_id与unique_attribute两种子块、ExactlyOneOf约束等可以参考 aws_identitystore_group 数据源文档 及其实现 group_data_source.go。从源码看alternate_identifier与group_id互斥ConflictsWith而group_id本身带有 UUID 格式正则校验。基本用法查询群组成员列表在拿到identity_store_id和group_id之后即可声明本数据源data aws_identitystore_group_memberships example { identity_store_id tolist(data.aws_ssoadmin_instances.example.identity_store_ids)[0] group_id data.aws_identitystore_group.example.group_id }这是文档给出的最小完整示例两个必填参数分别来自aws_ssoadmin_instances与aws_identitystore_group数据源的输出无需硬编码任何 ID。进阶场景与成员管理资源配合形成写入 读取闭环文档的示例仅展示了读取但在真实工程中群组成员往往由aws_identitystore_group_membership资源创建。仓库的 acceptance test 给出了一个完整的建组 → 建用户 → 建成员关系 → 查询成员列表的组合配置可直接作为实战模板data aws_ssoadmin_instances test {} resource aws_identitystore_user test { identity_store_id tolist(data.aws_ssoadmin_instances.test.identity_store_ids)[0] display_name Acceptance Test user_name tf-acc-test-user name { family_name Doe given_name John } } resource aws_identitystore_group test { identity_store_id tolist(data.aws_ssoadmin_instances.test.identity_store_ids)[0] display_name tf-acc-test-group description Acceptance Test } resource aws_identitystore_group_membership test { identity_store_id aws_identitystore_group.test.identity_store_id group_id aws_identitystore_group.test.group_id member_id aws_identitystore_user.test.user_id } data aws_identitystore_group_memberships test { identity_store_id aws_identitystore_group_membership.test.identity_store_id group_id aws_identitystore_group_membership.test.group_id }这个模式的要点是数据源的identity_store_id与group_id直接引用成员关系资源的同名属性保证读取的一定是刚刚创建的真实群组而非硬编码值。aws_identitystore_group_membership资源的参数member_id、group_id、identity_store_id均为必填且ForceNew与导入方式见 aws_identitystore_group_membership 资源文档 和其实现 group_membership.go。参数参考Argument Reference该数据源支持的参数如下参数必填类型说明group_id是stringIdentity Store 中群组的标识符Group ID。identity_store_id是string与 Single Sign-On 实例关联的 Identity Store ID。region否string该数据源被管理的 AWS 区域默认使用 provider 配置中设置的区域。其中group_id与identity_store_id的取值约束在底层 schema 中有明确校验参考aws_identitystore_group数据源中对identity_store_id的校验长度 1–64 且仅允许[0-9A-Za-z-]以及aws_identitystore_group_membership资源中对group_id的长度限制1–47这些限制同样适用于本数据源。从源码 group_memberships_data_source.go 可以确认该数据源是基于Terraform Plugin Framework实现的group_id与identity_store_id定义为Required的StringAttributegroup_memberships定义为Computed的ListAttribute元素类型为嵌套对象ListNestedObjectTypeOf[groupMembershipModel]。值得注意的一点是官方 schema 中并未显式列出region属性它是通过内嵌framework.WithRegionModel混入的通用模型提供的见 group_memberships_data_source.go因此文档中region参数的语义与其他 AWS 数据源一致。属性参考Attribute Reference除参数本身外该数据源还导出以下属性属性类型说明group_membershipslist群组成员对象列表每个元素包含下述字段。group_memberships列表元素字段字段类型说明group_idstring群组标识符。identity_store_idstringIdentity Store 标识符。member_idobject包含群组成员标识符的对象。membership_idstring群组成员关系标识符。member_id对象字段字段类型说明user_idstring群组成员的用户标识符。在 Terraform 配置中引用某个成员的 user_id 的写法是output first_member_user_id { value data.aws_identitystore_group_memberships.example.group_memberships[0].member_id.user_id }或者遍历全部成员output all_member_user_ids { value [for m in data.aws_identitystore_group_memberships.example.group_memberships : m.member_id.user_id] }关于member_id的联合类型设计member_id之所以是一个嵌套对象而不是普通字符串是因为 AWS Identity Store API 中的MemberId是一个union联合类型。从源码 group_memberships_data_source.go 可以看到Provider 目前只实现了联合类型中的一个分支MemberIdMemberUserId对应的 Flatten 逻辑也只解析UserIDtype memberIDModel struct { UserID types.String tfsdk:user_id } func (m *memberIDModel) Flatten(ctx context.Context, v any) (diags diag.Diagnostics) { switch t : v.(type) { case awstypes.MemberIdMemberUserId: m.UserID types.StringValue(t.Value) return diags default: return diags } }源码注释明确指出未来如果 AWS 为该联合类型增加新的成员分支例如应用类型成员可以在此处为新的实现类型补充 case。也就是说当前版本member_id只会携带user_id一个有效字段这与 group_membership.go 中userIDFromMemberID仅处理MemberIdMemberUserId分支的约定保持一致——当前 Identity Store 的群组成员就是用户User不存在其他成员类型。底层实现原理ListGroupMemberships 分页遍历理解该数据源如何工作有助于预判其性能与行为边界。其完整读取链路如下见 group_memberships_data_source.go解析配置Read方法首先从请求中读取group_id、identity_store_id到模型构造请求通过fwflex.Expand(ctx, data, input)将框架模型展开为 AWS SDK for Go v2 的identitystore.ListGroupMembershipsInput调用 API 并分页核心函数findGroupMemberships使用 AWS SDK 自带的NewListGroupMembershipsPaginator分页器循环拉取所有页func findGroupMemberships(ctx context.Context, conn *identitystore.Client, input identitystore.ListGroupMembershipsInput) ([]awstypes.GroupMembership, error) { var output []awstypes.GroupMembership pages : identitystore.NewListGroupMembershipsPaginator(conn, input) for pages.HasMorePages() { page, err : pages.NextPage(ctx) if err ! nil { return output, err } output append(output, page.GroupMemberships...) } return output, nil }这意味着即使群组成员数量超过单页 API 返回上限数据源也会自动翻页聚合出完整列表最终返回的group_memberships是全部成员的合并结果 4.扁平化回写通过fwflex.Flatten(ctx, output, data.GroupMemberships)将 AWS 类型列表转换为 Terraform 状态中的嵌套对象列表 5.写入 Stateresponse.State.Set(ctx, data)持久化结果。错误路径同样值得注意当ListGroupMemberships调用失败例如group_id不存在或不属于该 Identity Store时Provider 会通过create.ProblemStandardMessage(names.IdentityStore, create.ErrActionReading, ...)生成带服务名、动作、资源类型的标准错误信息便于排查group_memberships_data_source.go。此外该数据源在服务包注册表中登记的类型名为aws_identitystore_group_memberships名称为 Group Memberships区域策略为默认区域service_package_gen.go。其 API 客户端通过IdentityStoreClient获取并支持服务级 region 覆盖与 VCR 测试模式的特殊重试行为service_package_gen.go。测试验证数据源输出与成员资源严格对应仓库为aws_identitystore_group_memberships提供了 acceptance testgroup_memberships_data_source_test.go其核心断言直接印证了数据源输出与真实成员资源的一致性TestAccIdentityStoreGroupMembershipsDataSource_basicacctest.CheckResourceAttrGreaterThanValue(dataSourceName, group_memberships.#, 0)验证返回的成员列表非空TestCheckResourceAttrPair(dataSourceName, group_memberships.0.group_id, groupResourceName, group_id)数据源返回的第 0 个成员的group_id必须与aws_identitystore_group.test的group_id完全一致TestCheckResourceAttrPair(..., membership_id, membershipResourceName, membership_id)成员关系 ID 与aws_identitystore_group_membership.test的membership_id一致TestCheckResourceAttrPair(..., member_id.user_id, userResourceName, user_id)成员的user_id与aws_identitystore_user.test的user_id一致。这些断言把数据源、群组资源、用户资源、成员关系资源四者绑定在同一测试拓扑中验证了文档所描述的属性语义是真实可信的。测试还通过acctest.PreCheckSSOAdminInstances前置检查确保测试环境存在 SSO 实例group_memberships_data_source_test.go这也是使用者在本账户运行前需要满足的环境前提。常见问题与最佳实践1. 为什么我的group_memberships是空的如果目标群组中确实没有成员返回列表为空是正常行为测试中的非空断言只是针对已添加成员的场景。请先确认aws_identitystore_group_membership资源是否已成功创建、其group_id/identity_store_id是否与本数据源指向同一对象。2. 如何避免硬编码 ID始终通过aws_ssoadmin_instances获取identity_store_id通过aws_identitystore_group按DisplayName等唯一属性反查获取group_id或直接引用aws_identitystore_group/aws_identitystore_group_membership资源的输出属性。仓库中的示例与测试均遵循这一模式可最大限度提升配置的可移植性。3.region参数何时需要显式设置仅当 Identity Center 实例所在区域与 Provider 全局配置区域不一致时才需要。Identity Center 是区域化服务而该数据源默认继承 Provider 配置的区域因此跨区域使用时应显式传入region。4. 与单数数据源aws_identitystore_group的区别aws_identitystore_group用于按条件定位单个群组并返回group_id、display_name、description、external_ids等群组属性而aws_identitystore_group_memberships用于查询指定群组下的成员列表。两者常串联使用先用前者解析群组 ID再用后者枚举成员正如官方 Basic Usage 示例所示。小结aws_identitystore_group_memberships是 AWS Provider 中查询 IAM Identity Center 群组成员列表的标准入口。它只要求identity_store_id与group_id两个必填参数返回的group_memberships列表携带每个成员的member_id.user_id与membership_id底层通过 SDK v2 的ListGroupMemberships分页 API 自动聚合全部成员。配合aws_ssoadmin_instances、aws_identitystore_group、aws_identitystore_group_membership使用即可在 Terraform 中构建成员写入 → 列表读取 → 下游引用的完整闭环。其源码实现位于 internal/service/identitystore/group_memberships_data_source.go测试用例位于 internal/service/identitystore/group_memberships_data_source_test.go读者可据此深入理解其数据流与行为细节。【免费下载链接】terraform-provider-awsThe AWS Provider enables Terraform to manage AWS resources.项目地址: https://gitcode.com/GitHub_Trending/te/terraform-provider-aws创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考