【问题标题】:Scan on IAM-scoped DynamoDB table扫描 IAM 范围的 DynamoDB 表
【发布时间】:2018-11-06 22:19:01
【问题描述】:

我有一个表,允许用户(通过 Cognito 进行身份验证)仅读取和写入他们自己的记录,由 IAM 策略启用,如下所示:

"Condition": {
                "ForAllValues:StringEquals": {
                    "dynamodb:LeadingKeys": [
                        "${cognito-identity.amazonaws.com:sub}"
                    ]
                 }
             }

我正在设计我的数据结构,并且需要了解 DynamoDB 如何在 Scan 操作的上下文中应用此范围。

在进行 Scan 时,DynamoDB 是先将用户范围应用于表(因此扫描的唯一文档将是用户的文档)还是 Scan 会使用整个表,然后将策略应用于记录范围?

这个问题的含义是扫描的效率如何 - 如果要扫描整个表,那么操作将非常昂贵,但如果只扫描用户自己的记录(表的一小部分),那么扫描的效率可能可以接受。

【问题讨论】:

    标签: amazon-web-services amazon-dynamodb amazon-cognito amazon-iam


    【解决方案1】:

    将您的应用程序设计为使用查询而不是扫描的最佳实践。扫描很昂贵,并且根据定义扫描整个表。根据Dynamodb Scan and Query Best Practice documentation

    如果可能,您应该避免对大表使用扫描操作 或使用过滤器删除许多结果的索引

    您所提议的正是这种情况。请考虑重新设计以避免这种情况。

    IAM 安全部分将完成防止编辑其他用户数据的工作,但对于单个用户,扫描需要从扫描中删除其他用户文件,而且成本很高。

    【讨论】:

    • 您的回答似乎是在改写问题而不是回答问题。我的问题是,根据您提到的最佳实践指南,IAM 安全策略是否充当过滤器,以使用“删除许多结果的过滤器”。我知道扫描很昂贵,但我试图了解它们在这种情况下的昂贵程度——重构我的数据并显着增加存储需求以完全避免扫描是不明智的,如果它们不是更昂贵并且它们是相对不常见的查询。
    • 答案很明确——如果这个项目处于设计/试点阶段,你最好重新设计并坚持最佳实践。使用针对缺陷的查询,如果它们导致存储增加,这将比完全扫描更可取,这将等同于增加容量读取并可能降低用户的性能。远离扫描。
    猜你喜欢
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-18
    相关资源
    最近更新 更多