关于数据库:使用 amazon simpledb 匿名读取

anonymous read with amazon simpledb

我想使用 javascript 直接从客户端查询 simpledb。我的应用程序读取量很大,我宁愿不通过我的应用程序服务器路由请求。是否可以在没有身份验证的情况下执行选择请求?

我可以设置一个身份验证服务器,但这很不雅,因为它只会对每个读取请求说"是",并且会引入另一个瓶颈/减速/故障点。

其他云数据库解决方案(微软、谷歌)有这个功能吗?


这可以使用 AWS IAM(身份和访问管理)和服务器端"令牌自动售货机"。 AWS 文档有一篇专门为使用令牌自动售货机验证 AWS 移动应用程序用户的用例和 GitHub 中的服务器、iOS 和 Android 示例代码编写的文章。通用技术可用于非移动和/或 JavaScript 客户端。

注意:仍然需要一个服务器组件来出售临时访问令牌。但是,这些请求的数量可以显着减少(最多每 36 小时一次)。剩下的请求是从不受信任的客户端直接到 SimpleDB 的,没有中介。

一般技术

  • 匿名客户端调用您的令牌自动售货机(您的服务器)
  • 令牌自动售货机知道秘钥,调用AWS生成临时令牌

    • 令牌是使用只读访问策略创建的(下面的示例)
    • 令牌持续时间最长为 36 小时,默认为 12 小时(api 文档)
  • 自动售货机将令牌返回给客户
  • 客户端使用匿名的临时令牌调用 simpleDB API;无法写入 SimpleDB
  • 只读访问策略

    来自 AWS 示例代码"只读访问策略"

    1
    2
    3
    4
    5
    6
    7
    8
    9
    {
     "Statement": [
        {
         "Action": ["sdb:GetAttributes","sdb:List*","sdb:Select*"],
         "Effect":"Allow",
         "Resource":"*"
        }
      ]
    }

    这超出了 SimpleDB。您可以为其他几个 AWS 资源设置访问策略(请参阅完整访问策略示例)。

    用静态资源替换动态客户端-服务器调用的变体

    虽然您无法消除服务器组件,但客户端不一定要直接与自动售货机对话:

  • 计划作业每 N 秒生成 token,其中 N + fudge == token expiry
  • 作业将 token 写入公共 S3 存储桶(或任何其他静态资源)

    • 根据 fudge 设置适当的 maxAge 缓存控制标头
  • 匿名客户端从静态 URI 读取 token
  • 客户端使用 token 进行身份验证,对 SimpleDB 进行只读调用

  • 您需要使用您的服务器签署所有请求。我想这就是你的意思。您仍然可以节省一些带宽。

    我想说,只要 JavaScript 客户端可以验证自己,每个人都可以。


    需要身份验证服务器,您可以使用 EC2。