在 Amazon Cognito 上构建可扩展的用户搜索层

TL;DR · AI 摘要
通过 AWS Lambda、DynamoDB 和 OpenSearch Serverless 构建可扩展的 Cognito 用户搜索层,支持模糊匹配、多属性过滤和亚秒级响应,适用于企业级用户管理场景。
核心要点
- 使用 Cognito Lambda 触发器(Post-confirmation + Pre-token generation)实时同步用户数据至 DynamoD
- 通过 DynamoDB Streams + OpenSearch Serverless 实现自动索引更新,支持前缀/模糊/精确搜索,响应时间<1秒。
- 架构支持按邮箱、组、注册日期等多字段组合过滤,适合需复杂用户查询的企业应用,如审计或权限管理。
结构提纲
按章节快速跳转。
Cognito 的 ListUsers API 仅支持基础属性查询,无法满足模糊匹配、多字段过滤和高性能需求。
采用 Lambda + DynamoDB + OpenSearch Serverless 构建独立搜索层,实现自动同步与亚秒级响应。
通过 Post-confirmation 和 Pre-token generation 触发器捕获用户事件,写入 DynamoDB 并触发 OpenSearch 索引更新。
支持精确、前缀、模糊三种搜索模式,结合多字段过滤,确保任意规模下响应时间低于 1 秒。
Cognito 触发器函数必须在 VPC 内运行且执行时间控制在 5 秒内,建议启用预置并发避免冷启动延迟。
思维导图
用一张图看清主题之间的关系。
查看大纲文本(无障碍 / 无 JS 友好)
- Cognito 可扩展用户搜索架构
- 核心组件
- Lambda 触发器
- DynamoDB 存储
- OpenSearch Serverless 索引
- 关键能力
- 模糊/前缀/精确搜索
- 多字段组合过滤
- 亚秒级响应
- 数据流
- 认证事件 → Lambda → DynamoDB
- DynamoDB Stream → OpenSearch 索引
金句 / Highlights
值得收藏与分享的关键句。
Cognito 的 ListUsers API 仅支持标准属性搜索,对于自定义属性、模糊匹配或复杂过滤,必须构建专用搜索层。
通过 DynamoDB Streams 自动触发 OpenSearch Serverless 索引更新,实现用户数据变更后近实时同步,无需手动批处理。
系统支持同时按 email、phone、groups、registration date 多字段过滤,响应时间始终控制在亚秒级,适用于高并发企业场景。
[AWS 架构博客](https://aws.amazon.com/blogs/architecture/)
想象一下,你的同事需要在数千个账户中仅凭部分邮箱地址、姓氏和已知访问权限查找用户。你的团队能多快响应?如果你的使用场景仅涉及对标准 Amazon Cognito 属性的简单搜索,内置的 ListUsers API 可能已完全满足需求。但对于涉及自定义属性、模糊匹配、复杂过滤以及亚秒级响应时间的高级场景,构建专用搜索层才是正确的投资方向。
Amazon Cognito 为现代应用提供了强大的用户认证与管理能力。随着应用规模扩大,开发团队通常会实现高级搜索功能,以便通过部分邮箱匹配、分组成员身份或跨多个自定义属性进行审计来查找用户。
本文将展示如何基于 Amazon Cognito,结合 AWS Lambda、Amazon DynamoDB 和 Amazon OpenSearch Service 构建一个全面且可扩展的用户搜索层。
解决方案概览
本方案通过 AWS Lambda、Amazon DynamoDB 和 Amazon OpenSearch Serverless 扩展 Amazon Cognito 的高级搜索能力。
核心功能:
- 多种搜索类型:精确匹配、前缀匹配和模糊搜索
- 复杂过滤:同时查询邮箱、电话、群组和注册日期
- 高性能:任意规模下均可实现亚秒级响应
- 自动同步:用户认证或更新资料时实时更新
- API 驱动:支持分页的 RESTful API
该架构利用 Cognito Lambda 触发器在用户认证期间捕获数据,将其存储于 DynamoDB,并通过 DynamoDB Streams 索引至 OpenSearch Serverless。以下架构图展示了各组件如何协同工作。

_图 1:可搜索 Cognito 用户解决方案架构_
操作指南
该解决方案架构展示了两个流程:数据摄取 流程和 搜索 流程。
数据摄取流程
数据摄取流程通过两条路径捕获并索引用户数据:Cognito Lambda 触发器和 AWS CloudTrail。这两条路径共同维护搜索索引与 Cognito 之间的同步,无需人工干预或定时批处理作业。
#### 1. Cognito Lambda 触发器
此路径在认证事件期间通过 Cognito 触发器 Lambda 函数捕获用户数据,处理两种触发类型:_Post-confirmation_ 和 _Pre-token generation_。Post-confirmation 触发器在用户注册时创建初始用户记录,而 Pre-token generation 触发器则在每次后续认证时跟踪登录活动和应用客户端信息。Pre-token generation 触发器还可在事件负载中提供用户的群组成员信息,该信息将被索引为可搜索字段。流程步骤如下:
- 客户端发起注册或登录 — 用户向 Amazon Cognito 提交认证请求。
- Post-confirmation 触发器 — 注册时,Cognito 调用 Cognito 触发器 Lambda,在 DynamoDB 用户表中创建包含用户资料属性(邮箱、姓名、群组)的初始记录。
- Pre-token generation 触发器 — 每次登录时,Cognito 调用 Cognito 触发器 Lambda,更新 DynamoDB 用户表中的用户登录时间戳和应用客户端信息。
- 流处理 — DynamoDB Streams 检测到新增或更新记录后,触发 OSS 摄取 Lambda。
- 索引更新 — OSS 摄取 Lambda 处理流事件并将用户数据索引至 OpenSearch Serverless。
注意:Cognito Lambda 触发器部署在 VPC 中。Cognito 对触发函数强制执行 5 秒超时限制。若你正在扩展这些触发器以添加额外功能,或已使用 Post-confirmation 或 Pre-token generation 触发器,请确保总执行时间远低于此限制。如冷启动是关注点,可考虑配置预置并发。

_图 2:通过 Cognito Lambda 触发器摄取用户数据_
#### 2. CloudTrail
此路径捕获发生在认证流程之外的管理员操作引发的用户变更,例如通过 Cognito 控制台或 CLI 创建用户。这些操作不会触发 Cognito Lambda 触发器,因此由 CloudTrail 和 EventBridge 弥补这一空白。流程步骤如下:
- 执行管理员操作 — 用户在 Amazon Cognito 中执行管理员操作(例如创建用户、更新属性、添加到组、禁用用户)。
- API 调用记录 — AWS CloudTrail 捕获 Cognito 管理员 API 调用。
- EventBridge 规则匹配 — Amazon EventBridge 规则匹配 Cognito 管理员事件。
- 调用 CloudTrail 事件 Lambda — EventBridge 调用 CloudTrail 事件处理 Lambda 函数,该函数从 Cognito 读取当前用户状态并更新 DynamoDB 用户表中的配置文件。
- 流变更事件 — DynamoDB Streams 发出变更事件。
- 调用 OSS Lambda — 流事件触发 OSS 摄入 Lambda。
- 索引用户数据 — OSS 摄入 Lambda 在 OpenSearch Serverless 中索引更新的用户数据。

_图 3:通过 CloudTrail 的用户数据摄入_

_图 4:Amazon DynamoDB 中索引用户属性的数据模型_
搜索流程
在搜索流程中,授权用户可以查询已索引的用户目录:
- 提交查询 — 认证用户通过 UI 提交搜索查询。
- 请求验证 — API Gateway 接收包含 Cognito JWT 令牌的请求,并使用 Cognito 授权器进行验证。
- 执行搜索 — 验证成功后,搜索 Lambda 函数将使用搜索参数被调用。
- OpenSearch 查询 — Lambda 函数承担 OpenSearch Service 的只读角色,并对 OpenSearch Serverless 索引执行查询。
- 返回结果 — Lambda 格式化查询结果并返回给前端,UI 以分页形式展示结果。

_图 5:搜索流程序列图_

_图 6:演示 UI 用户搜索在多属性上的集成_

_图 7:演示 UI 用户搜索在自动建议功能上的集成_
自行尝试
准备好体验此解决方案了吗?该代码库包含在您自己的 AWS 环境中部署完整可运行实现所需的一切。
此解决方案的源代码可在 GitHub 获取:https://github.com/aws-samples/sample-user-search-layer-for-cognito。
该代码库包含所有必要内容:AWS CDK 基础设施代码、Lambda 函数实现、React 前端以及文档。您可以在 20 分钟内将功能完备的可搜索用户目录部署到您的账户中。测试完成后,请清理所有资源以避免持续产生费用。
结论
在本文中,您学习了如何为 Amazon Cognito 扩展高级搜索功能。通过结合 OpenSearch Serverless、DynamoDB Streams 和 Lambda 函数,您可以构建一个可扩展的事件驱动架构,自动维护具有亚秒级查询性能的可搜索用户目录。
该模式解锁了强大的应用场景:支持团队可以快速定位数千个账户中的用户,管理员可以按组成员身份细分用户以进行定向通信,合规团队则可通过复杂过滤条件审计用户属性。
如需深入了解支撑此解决方案的 AWS 服务:
- Amazon Cognito 开发者指南 — 用户池、Lambda 触发器和身份验证流程
- Amazon OpenSearch Serverless — 无服务器搜索功能和索引策略
- DynamoDB Streams — 变更数据捕获和事件驱动架构
- AWS Lambda 最佳实践 — 优化无服务器函数的性能和成本