T
traeai
登录
返回首页
AWS Architecture Blog

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

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

TL;DR · AI 摘要

通过 AWS Lambda、DynamoDB 和 OpenSearch Serverless 构建可扩展的 Cognito 用户搜索层,支持模糊匹配、多属性过滤和亚秒级响应,适用于企业级用户管理场景。

核心要点

  • 使用 Cognito Lambda 触发器(Post-confirmation + Pre-token generation)实时同步用户数据至 DynamoD
  • 通过 DynamoDB Streams + OpenSearch Serverless 实现自动索引更新,支持前缀/模糊/精确搜索,响应时间<1秒。
  • 架构支持按邮箱、组、注册日期等多字段组合过滤,适合需复杂用户查询的企业应用,如审计或权限管理。

结构提纲

按章节快速跳转。

  1. §问题背景:Cognito 原生搜索能力不足

    Cognito 的 ListUsers API 仅支持基础属性查询,无法满足模糊匹配、多字段过滤和高性能需求。

  2. 采用 Lambda + DynamoDB + OpenSearch Serverless 构建独立搜索层,实现自动同步与亚秒级响应。

  3. 通过 Post-confirmation 和 Pre-token generation 触发器捕获用户事件,写入 DynamoDB 并触发 OpenSearch 索引更新。

  4. 支持精确、前缀、模糊三种搜索模式,结合多字段过滤,确保任意规模下响应时间低于 1 秒。

  5. Cognito 触发器函数必须在 VPC 内运行且执行时间控制在 5 秒内,建议启用预置并发避免冷启动延迟。

思维导图

用一张图看清主题之间的关系。

查看大纲文本(无障碍 / 无 JS 友好)
  • Cognito 可扩展用户搜索架构
    • 核心组件
      • Lambda 触发器
      • DynamoDB 存储
      • OpenSearch Serverless 索引
    • 关键能力
      • 模糊/前缀/精确搜索
      • 多字段组合过滤
      • 亚秒级响应
    • 数据流
      • 认证事件 → Lambda → DynamoDB
      • DynamoDB Stream → OpenSearch 索引

金句 / Highlights

值得收藏与分享的关键句。

  • Cognito 的 ListUsers API 仅支持标准属性搜索,对于自定义属性、模糊匹配或复杂过滤,必须构建专用搜索层。

    第 1 段

    ⬇︎ 下载 PNG𝕏 分享到 X
  • 通过 DynamoDB Streams 自动触发 OpenSearch Serverless 索引更新,实现用户数据变更后近实时同步,无需手动批处理。

    Ingestion flow 部分

    ⬇︎ 下载 PNG𝕏 分享到 X
  • 系统支持同时按 email、phone、groups、registration date 多字段过滤,响应时间始终控制在亚秒级,适用于高并发企业场景。

    Key capabilities 列表

    ⬇︎ 下载 PNG𝕏 分享到 X
#Amazon Cognito#AWS Lambda#OpenSearch#DynamoDB#用户搜索
打开原文

[AWS 架构博客](https://aws.amazon.com/blogs/architecture/)

想象一下,你的同事需要在数千个账户中仅凭部分邮箱地址、姓氏和已知访问权限查找用户。你的团队能多快响应?如果你的使用场景仅涉及对标准 Amazon Cognito 属性的简单搜索,内置的 ListUsers API 可能已完全满足需求。但对于涉及自定义属性、模糊匹配、复杂过滤以及亚秒级响应时间的高级场景,构建专用搜索层才是正确的投资方向。

Amazon Cognito 为现代应用提供了强大的用户认证与管理能力。随着应用规模扩大,开发团队通常会实现高级搜索功能,以便通过部分邮箱匹配、分组成员身份或跨多个自定义属性进行审计来查找用户。

本文将展示如何基于 Amazon Cognito,结合 AWS LambdaAmazon DynamoDBAmazon OpenSearch Service 构建一个全面且可扩展的用户搜索层。

解决方案概览

本方案通过 AWS Lambda、Amazon DynamoDB 和 Amazon OpenSearch Serverless 扩展 Amazon Cognito 的高级搜索能力。

核心功能:

  • 多种搜索类型:精确匹配、前缀匹配和模糊搜索
  • 复杂过滤:同时查询邮箱、电话、群组和注册日期
  • 高性能:任意规模下均可实现亚秒级响应
  • 自动同步:用户认证或更新资料时实时更新
  • API 驱动:支持分页的 RESTful API

该架构利用 Cognito Lambda 触发器在用户认证期间捕获数据,将其存储于 DynamoDB,并通过 DynamoDB Streams 索引至 OpenSearch Serverless。以下架构图展示了各组件如何协同工作。

图 1

_图 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 触发器还可在事件负载中提供用户的群组成员信息,该信息将被索引为可搜索字段。流程步骤如下:

  1. 客户端发起注册或登录 — 用户向 Amazon Cognito 提交认证请求。
  2. Post-confirmation 触发器 — 注册时,Cognito 调用 Cognito 触发器 Lambda,在 DynamoDB 用户表中创建包含用户资料属性(邮箱、姓名、群组)的初始记录。
  3. Pre-token generation 触发器 — 每次登录时,Cognito 调用 Cognito 触发器 Lambda,更新 DynamoDB 用户表中的用户登录时间戳和应用客户端信息。
  4. 流处理 — DynamoDB Streams 检测到新增或更新记录后,触发 OSS 摄取 Lambda。
  5. 索引更新 — OSS 摄取 Lambda 处理流事件并将用户数据索引至 OpenSearch Serverless。

注意:Cognito Lambda 触发器部署在 VPC 中。Cognito 对触发函数强制执行 5 秒超时限制。若你正在扩展这些触发器以添加额外功能,或已使用 Post-confirmation 或 Pre-token generation 触发器,请确保总执行时间远低于此限制。如冷启动是关注点,可考虑配置预置并发。

图 2

_图 2:通过 Cognito Lambda 触发器摄取用户数据_

#### 2. CloudTrail

此路径捕获发生在认证流程之外的管理员操作引发的用户变更,例如通过 Cognito 控制台或 CLI 创建用户。这些操作不会触发 Cognito Lambda 触发器,因此由 CloudTrail 和 EventBridge 弥补这一空白。流程步骤如下:

  1. 执行管理员操作 — 用户在 Amazon Cognito 中执行管理员操作(例如创建用户、更新属性、添加到组、禁用用户)。
  2. API 调用记录 — AWS CloudTrail 捕获 Cognito 管理员 API 调用。
  3. EventBridge 规则匹配 — Amazon EventBridge 规则匹配 Cognito 管理员事件。
  4. 调用 CloudTrail 事件 Lambda — EventBridge 调用 CloudTrail 事件处理 Lambda 函数,该函数从 Cognito 读取当前用户状态并更新 DynamoDB 用户表中的配置文件。
  5. 流变更事件 — DynamoDB Streams 发出变更事件。
  6. 调用 OSS Lambda — 流事件触发 OSS 摄入 Lambda。
  7. 索引用户数据 — OSS 摄入 Lambda 在 OpenSearch Serverless 中索引更新的用户数据。
Image 3

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

Image 4

_图 4:Amazon DynamoDB 中索引用户属性的数据模型_

搜索流程

在搜索流程中,授权用户可以查询已索引的用户目录:

  1. 提交查询 — 认证用户通过 UI 提交搜索查询。
  2. 请求验证 — API Gateway 接收包含 Cognito JWT 令牌的请求,并使用 Cognito 授权器进行验证。
  3. 执行搜索 — 验证成功后,搜索 Lambda 函数将使用搜索参数被调用。
  4. OpenSearch 查询 — Lambda 函数承担 OpenSearch Service 的只读角色,并对 OpenSearch Serverless 索引执行查询。
  5. 返回结果 — Lambda 格式化查询结果并返回给前端,UI 以分页形式展示结果。
Image 5

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

Image 6

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

Image 7

_图 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 服务:

作者简介

AI 可能会生成不准确的信息,请核实重要内容