我有一个表,允许用户(通过 Cognito 进行身份验证)仅读取和写入自己的记录,由 IAM 策略启用,如下所示:
"Condition": {
"ForAllValues:StringEquals": {
"dynamodb:LeadingKeys": [
"${cognito-identity.amazonaws.com:sub}"
]
}
}
我正在设计数据结构,需要了解 DynamoDB 如何在扫描操作的上下文中应用此范围界定。
进行扫描时,DynamoDB 是否会首先将用户范围应用于表(因此扫描的唯一文档将是用户的文档),还是扫描会消耗整个表,然后应用策略来确定记录范围?
这个问题的含义是扫描的效率如何 - 如果要扫描整个表那么操作将非常昂贵,但是如果只扫描用户自己的记录(表的一小部分)那么扫描可能会效率可以接受。
设计应用程序时使用查询而不是扫描的最佳实践。扫描的成本很高,并且根据定义扫描整个表。根据 Dynamodb 扫描和查询最佳实践文档:
如果可能,您应该避免在大表上使用 Scan 操作 或带有删除许多结果的过滤器的索引
您所提出的正是这种情况。请考虑重新设计以避免这种情况。
IAM 安全部分将完成防止编辑其他用户数据的工作,但对于单个用户,扫描将需要从扫描中删除其他用户文件,并且成本高昂。
无论主键如何,扫描都会返回所有项目,您将无法使用 IAM 策略来基于授权进行过滤。
如示例 1 中所述:授予限制对具有特定分区键值的项目的访问权限AWS 文档:
操作列表不包含扫描权限,因为扫描 无论主键如何,都会返回所有项目。