AppSync中基于Cognito身份选择租户专属DynamoDB表的方案咨询
AppSync多租户单API对接独立租户DynamoDB表解决方案
最优实现方案(完全在解析器模板内完成逻辑)
你可以通过单个通用DynamoDB数据源实现动态路由到不同租户表,无需额外中间件或多套API,核心逻辑利用了AppSync DynamoDB数据源请求映射模板中TableName参数的优先级高于数据源绑定表配置的特性,具体操作步骤如下:
- 第一步:创建一个通用DynamoDB数据源,创建时可随便绑定一张已存在的DynamoDB表(仅作为创建数据源的必填占位项,实际不会使用该表)
- 第二步:为该数据源关联的IAM角色配置所有租户DynamoDB表的操作权限,建议你的租户表使用统一命名前缀(如
tenant-xxx),权限资源可配置为通配符格式arn:aws:dynamodb:<你的AWS区域>:<你的AWS账号ID>:table/tenant-*,避免后续新增租户需要重复修改权限 - 第三步:在请求映射模板中,根据Cognito身份携带的租户ID动态拼接表名,示例模板如下:
{ "version": "2018-05-29", "operation": "GetItem", "TableName": "tenant-${ctx.identity.claims['custom:tenantId']}", "Key": { "id": $util.dynamodb.toDynamoDBJson($ctx.args.id) } }
- 第四步:响应映射模板无需特殊修改,可正常使用
$util.dynamodb.fromDynamoDB等工具类完成DynamoDB格式到普通JSON的转换
方案优势
完全匹配你的需求:
- 各租户使用独立DynamoDB表,可单独配置吞吐量、索引规则,不会互相影响
- 所有逻辑均在解析器模板内完成,无需额外引入Lambda,性能和原生DynamoDB数据源一致
- 所有租户共用同一套AppSync API,无需维护多套端点配置
注意事项
- 建议在Cognito用户池中将租户ID对应的自定义属性设置为不可修改,避免用户自行篡改属性越权访问其他租户数据
- 可在解析器开头增加租户ID合法性校验逻辑,拦截非法请求
- 租户表的命名规则需严格遵循权限配置的通配符规则,避免权限不足问题
内容的提问来源于stack exchange,提问作者zmthy
相关产品推荐
相关产品推荐

