首页 > 解决方案 > 使用租户的 Cognito 身份在 AppSync 中选择租户的 DynamoDB 表

问题描述

我正在构建一个多租户应用程序,租户共享一个由 AppSync 支持的 GraphQL API。租户的所有元数据都存储在单个 DynamoDB 表中,AppSync 使用该表上的 DynamoDB 数据源来解决查询和突变。我想根据请求解析器中的 Cognito 身份选择要在哪个表上执行操作。

在 AppSync 中,每个数据源都必须指定一个表来解析 DynamoDB 操作,并且这不能在 AppSync 解析器中被覆盖(某些批处理操作允许在一个解析器中执行多个表操作)。似乎没有办法在管道解析器中动态选择数据源。由于每个租户的元数据都位于单独的 DynamoDB 表中,因此在仅使用 DynamoDB 数据源时,似乎无法定义在租户之间共享的单个 API。

我尝试使用 HTTPS 解析器并在其中重新创建 DynamoDB 请求,但不幸的是,似乎没有$util.dynamodb.fromDynamoDB将类型化的 DynamoDB 响应转换为 DynamoDB 解析器自动执行的非类型化 JSON 响应。

这是我理解的选项:

  1. 将所有租户元数据放入一个表中,然后使用租户 ID 作为每个项目的分区键
  2. 使用发出后续 DynamoDB 请求的 Lambda 解析程序
  3. 为每个租户创建一个不同的 AppSync API,对所有内容都具有相同的定义(但每个人都有不同的 Cognito 池配置)

选项 1 对我不起作用,因为我已经以多种不同的方式使用分区键,尤其是在表上生成几个稀疏全局索引。我还想为每个租户提供表吞吐量,而不是一次在所有租户之间共享。

选项 2 可能是最直接的答案,但是当我只是想在 DynamoDB 上执行简单的操作时,我宁愿不必为大多数解析器设置 Lambda。

选项 3 最终解决了这个问题,但现在我必须维护与租户一样多的 API(及其端点),这违背了这个问题的目的。

是否有任何其他选项可以支持在 AppSync 中为每个租户使用不同表的多租户设置,最好在解析器模板中执行路由逻辑?

标签: amazon-dynamodbamazon-cognitomulti-tenantaws-appsyncaws-appsync-resolver

解决方案


推荐阅读