构建多语言语义搜索的非结构化数据内容库:第一部分
关键要点
非结构化数据在金融机构的日常业务中占据高达 80 的比例。本文介绍了使用 AWS 服务构建内容库的架构,包括动态访问控制逻辑和文件上传界面的实现。内容库的核心功能包括:动态访问控制和多语言语义搜索。非结构化数据在金融机构的日常运营中占据了很大一部分,通常可达 80。这些机构需要存储和读取 PDF 文档和图像,以便进行索赔处理、承保和客户身份验证 (KYC)。为了便于访问,机构需要使这些数据能够跨不同实体进行检索,并且需要根据角色需求逻辑分离数据访问。
在这篇两部分的系列文章中,我们将使用 AWS 服务构建一个端到端的内容仓库,以存储和处理非结构化数据,重点功能包括:
针对非结构化数据的动态访问控制多语言语义搜索能力在第一部分中,我们将建立内容库的架构基础,包含资源访问控制逻辑和一个用于上传和列出文档的 Web 界面。
解决方案概述
内容库包含四个核心构建块:
前端和交互:我们使用 AWS Amplify 来帮助前端 Web 和移动开发人员迅速构建完整的应用程序。我们的 React 应用使用 AWS Amplify 认证 功能,快速设置与 Amazon Cognito 集成的完整认证流程。Amplify 还承载前端应用。
认证与授权:实施动态资源访问控制的组合角色和属性对于内容库的安全性至关重要。Amazon Cognito 提供管理的、可扩展的用户目录、用户注册和登录流程以及通过第三方身份提供者的联合功能。我们使用 Amazon Cognito 用户池 作为内容库的用户身份来源。你可以利用用户池组表示不同类型的用户集合,并通过与组相关联的 AWS 身份与访问管理 (IAM) 角色管理这些权限。
用户通过 Amazon Cognito 用户池进行身份验证。在内容库中,Web 应用通过 Amazon Cognito 身份池将用户池令牌交换为 AWS 凭证。你还可以通过将相关 属性 映射到将作为 IAM 权限策略一部分被评估的主体标签,补充基于 IAM 角色的授权模型。这允许动态和灵活的授权策略。对于需要与第三方身份提供者进行联合的用例,可以依据现有用户组属性如 Active Directory 组成员身份来构成用户集合。
后端和业务逻辑:经过身份验证的用户会被重定向至 Amazon API Gateway,API Gateway 负责应用程序编程接口 (API) 的托管发布,充当内容库的“前门”。API Gateway 还通过 RESTful API 与内容库的后端进行交互,使内容库的业务逻辑可以扩展到未来的用例,例如转录和翻译。我们使用 AWS Lambda 作为无服务器事件驱动计算服务,运行特定的业务逻辑代码,例如将文档上传至内容库。
内容存储:Amazon Simple Storage Service (Amazon S3) 提供几乎无限的可扩展性和高耐用性。通过 Amazon S3,您可以以其本土格式经济高效地存储非结构化文档,并安全可扩展地访问。在上传文档时,丰富其标签有助于通过精细的访问控制简化数据治理。
技术架构
内容仓库的技术架构及其四个组件显示在下图中:
接下来我们将逐步探索这一架构。
前端利用 Amplify JS 库 加入认证 UI 组件,让已认证用户登录。一旦用户提供了登录凭据,他们会被重定向至 Amazon Cognito 用户池进行认证。认证成功后,Amazon Cognito 启动一个 预令牌生成 Lambda 函数 ,该函数通过称为 department 的新声明自定义身份 (ID) 令牌。这个新声明是来自 cognitopreferredrole 声明的 Amazon Cognito 组名。Amazon Cognito 以 JSON 格式将身份、访问和刷新令牌返回给前端。Amplify 客户端库存储令牌并使用刷新令牌处理刷新,而 React 前端应用则使用 ID 令牌调用 API Gateway。注意: 通常使用访问令牌来授予访问授权资源的权限,但对于该架构,由于在步骤 3 中已增强 ID 令牌,我们将使用 ID 令牌。API Gateway 通过其原生与 Amazon Cognito 的集成来验证 ID 令牌的签名和过期,使用 Amazon Cognito 用户池鉴权器。对于更复杂的授权场景,你可以使用 API Gateway Lambda 鉴权器 结合 AWS JSON Web Token (JWT) 验证 库来验证 Amazon Cognito 签名的 JWT。验证成功后,API Gateway 将 ID 令牌传递给后端的 Lambda 函数,后者可以基于 ID 令牌进行验证和授权以控制访问。在文档上传操作期间,后端 Lambda 函数调用 Amazon Cognito 身份池,将 ID 令牌交换为与 cognitopreferredrole 声明关联的临时 AWS 凭证。文档上传的 Lambda 函数将一个包括自定义 department 声明的预签名 URL 返回,Amazon S3 路径前缀和对象标签。使用 Amazon S3 预签名 URL 可以将文档从前端应用程序直接上传到 Amazon S3。在文档列表操作中,后端 Lambda 函数与第 8 步类似,将 ID 令牌交换为临时 AWS 凭证。Lambda 函数仅返回用户基于其首选组及关联的自定义 department 声明所拥有的文档。先决条件
你需要满足以下先决条件才能使用该解决方案:
一个 AWS 账户,或注册并 创建和激活一个账户。在你的开发机器上安装以下软件,或使用 AWS Cloud9 环境:安装 AWS 命令行界面 (AWS CLI) 并 配置它以指向你的 AWS 账户。安装 TypeScript 并使用像 npm 这样的包管理器。安装 AWS 云开发工具包 (AWS CDK)。有适当的 AWS 凭证 用于与您 AWS 账户中的资源互动。工作流程
设置
以下步骤将在您的 AWS 账户中部署两个 AWS CDK 堆栈:
contentrepostack (blogcontentrepostackts) 创建上图中详细描述的环境。demodatastack (userpooldemodatastackts) 部署样本用户、组以及角色映射。要继续设置,使用以下命令:
克隆项目 git 存储库:bash git clone https//githubcom/awssamples/contentrepositorywithdynamicaccesscontrol contentrepository
安装必要的依赖:bash cd contentrepository/backendcdk npm install
配置环境变量:bash export CDKDEFAULTACCOUNT=(aws sts getcalleridentity query Account output text) export CDKDEFAULTREGION=(aws configure get region)
为 AWS CDK 使用引导你的账户:bash cdk bootstrap aws//CDKDEFAULTACCOUNT/CDKDEFAULTREGION
将代码部署到你的 AWS 账户:bash cdk deploy all
使用内容库
一旦你在 AWS 账户中部署了 CDK 堆栈,遵循以下步骤:
访问前端应用:复制在 contentrepostack 的 AWS CDK 输出中显示的 amplifyHostedAppUrl 值。使用浏览器访问该 URL,进入前端应用。在自动构建和部署 React 应用完成后,将显示一个临时页面,通常需时 45 分钟。
应用登录和基于角色的访问控制 (RBAC)
React 网页会提示你登录,然后更改临时密码。内容库提供了两个 demo 用户及其凭据,作为 demodatastack 的一部分。在本次演示中,我们将使用属于 sales 部门组的 salesuser 用户来验证 RBAC。
向内容库上传文档
身份验证为 salesuser。选择 上传 来上传第一个文档到内容库。内容库在 assets 子文件夹中提供样本文档。
列出上传的文档
选择列表以显示上传的销售内容。为验证动态访问控制,重复第 2 步和第 3 步,使用属于 marketing 部门组的 marketinguser 用户。登录到 AWS 管理控制台并导航到前缀为 contentrepostacks3sourcebucket 的 Amazon S3 存储桶,以确认所有上传的内容存在。实施说明
前端部署和跨域访问
contentrepostack 包含一个 AwsCustomResource 构造。该构造使用 Amplify API 启动 Amplify 托管前端应用程序的发布作业。Amplify 应用构建规格的 preBuild 步骤动态配置其后端,以便于基于 Amazon Cognito 的身份验证。构建时所需的 Amazon Cognito 配置参数从 AWS 系统管理器参数存储 中检索。同样,Amplify 应用 postBuild 步骤更新 Amazon S3 的 跨域资源共享 (CORS) 规则,以仅允许来自 Amplify 托管的前端应用程序 URL 的跨域访问。
应用登录和访问控制
Amazon Cognito 身份池的配置被设置为对经过身份验证的用户 根据令牌选择角色,如图 2 所示。此设置允许经过身份验证的用户将角色传递到 ID 令牌中,这些角色由 Amazon Cognito 用户池分配。后端 Lambda 函数使用出现在 ID 令牌的 cognitoroles 和 cognitopreferredrole 声明中的角色进行 RBAC。
图 2 Amazon Cognito 身份池配置使用令牌分配给经过身份验证的用户角色
在 访问控制的属性 部分,我们配置了一个自定义映射,将增强的部门令牌声明映射到标签键,如图 3 所示。后端逻辑利用标签键与 IAM 策略中的 PrincipalTag 条件相匹配,以控制对 AWS 资源的访问。
一元机场登录入口图 3 Amazon Cognito 身份池配置自定义从声明名称到标签键的映射

文档上传
presignedurlpy Lambda 函数使用 department 令牌声明作为键生成一个预签名的 Amazon S3 URL。该函数会自动将上传的文档合理地组织到 Amazon S3 源存储桶中的逻辑结构中。因此,在 Lambda 函数中用于 Amazon S3 客户端凭据的 cognitopreferredrole 具有权限策略,使用 PrincipalTag 部门动态限制对 Amazon S3 密钥的访问,如图 4 所示。
图 4 使用 PrincipalTag 上传文档到 Amazon S3 的权限策略
文档列表
列表功能仅显示属于经过身份验证的 Amazon Cognito 用户池用户的首选组的上传内容。为了仅列出特定用户例如 salesuser可以访问的文件,使用 PrincipalTag s3prefix 条件,如图 5 所示。
图 5 使用 s3prefix 条件与会话标签列出文档的权限策略
清理
在 backendcdk 子目录下,删除已部署的资源:
bashcdk destroy all
结论
在这篇文章中,我们展示了如何构建一个内容库,提供简单易用的 Web 应用来处理非结构化数据,并在不同部门之间保持动态访问控制。上述步骤提供了构建您自己内容库的基础,以存储和处理文档。在下一步中,您可以根据组织的安全需求,实现更复杂的访问控制用例,通过平衡 IAM 角色和主体标签来做到这一点。例如,您可以使用 Amazon Cognito 用户池自定义属性,增加类似文档“清晰度”的维度,并可对预令牌生成 Lambda 进行可选修改。
在本系列博客的下一部分中,我们将增强内容库,以实现多语言语义搜索功能,同时保持我们已经实现的访问控制基础。如果想了解如何构建解决方案,以便搜索多个扫描文档、PDF 和合规能力的图像,请参考我们的 AWS 解决方案库中的文档理解解决方案。
Patrik Nagel
Patrik 是 AWS 的首席解决方案架构师,帮助
发表评论