amazon-web-services - 计算 AWS lambda 调用并根据 api 键对数据进行分段
问题描述
客户(大约 1000 名)注册我的服务并收到客户唯一的 api 密钥。然后,他们在通过 AWS api 网关调用 AWS lambda 函数时使用该密钥访问 DynamoDb 中的数据。
要求 1:客户按 api 调用次数计费,所以我必须能够计算这些。AWS 只提供每个 lambda 的 api 调用总数的指标,所以我有几个选择:
- 在每次 api 命中增加 DynamoDB 中的一个计数器。
- 在每次 api 命中时,在 SQS 中排队一条消息,在“命中计数器”lambda 中接收它,并在 DynamoDB 中增加一个计数器。
- 为每个客户部署一个单独的 lambda。使用 AWS 内置呼叫计数器。
要求 2:lambda 可以访问的数据对于每个客户都是唯一的,因此取决于提供的 api 密钥。为了实现这一点,我还有很多选择:
- 将所需的 api 密钥与客户有权访问的数据一起存储。
- 为每个客户部署一个单独的 lambda。使用 api 网关通过密钥对其进行保护。
- 在 api 网关中为每个客户创建一个单独的端点,使用 api 密钥保护它。
以上选项似乎都不是设计解决方案的好方法。有这样做的规范方法吗?如果不是,上面哪个选项是最好的?我是否因为不熟悉 AWS 而错过了明显的解决方案?
解决方案
我会尝试用我的经验来分解你的问题,但也许 Michael - Sqlbot 或 John Rotenstein 可能能够给出更合适的答案。
要求 1
1)这听起来是个好方法。我在这里没有看到任何重要的东西。
2)恕我直言,这是三者中最好的。它将数据访问与计费服务分离,这在微服务世界中是一件好事。
3)这是不可扩展的。想象一下,您的系统不断增长,最终您拥有 10K 的 Lambda 函数。你不仅需要建立一个非常可靠的机制来自动化这个过程,而且你还需要监控 10K 不同的东西(想象 CloudWatch 日志、API 网关等),更不用说你将拥有 10000 个函数完全相同的代码(客户端特定参数分开)。我什至不会考虑这个。
要求 2
1) 它可以工作,并且非常适合 DynamoDB 做事模型:将尽可能多的数据存储在唯一的表中,这样您就可以一次获取所有内容。据我所知,您甚至可以将此 ApiKey 用作分区键,并且为了简单起见,将客户端的数据作为 JSON 存储在名为 data 的列中。由于您的查询只需要通过 ApiKey 进行查询,因此在 DynamoDB 中存储 JSON 不会受到伤害(但是请记住,如果您需要通过其任何 JSON 属性进行查询,那么您就处于劣势,因为 DynamoDB 的查询能力非常有限)
2) 否,因为要求 1.3
3) 不,因为上述原因。
如果您仍然需要将 ApiKey 存储在不同的表中,以便您可以运行不同的分析并对客户的呼叫、访问、计费等进行更细粒度的控制,那也不是问题,只需确保复制您的 ApiKey您的ClientData
表而不是创建 FK(DynamoDB 不支持 FK,因此您需要自己管理这些约束)。在 NoSQL 世界中,复制是很好的。
您的用例显然是多租户案例,因此我还建议您阅读使用 Amazon DynamoDB 进行多租户存储,这将为您提供更多见解并稍微拓宽您的选择范围。多租户不是一件容易的事,如果没有正确实施,可能会给您带来很多麻烦。我认为这就是为什么 AWS 还为我们准备了这本不错的读物 :)
如果您有更多信息要分享,很高兴在评论部分继续
希望这可以帮助!
推荐阅读
- azure-active-directory - 使用 Angular 应用程序的 Active Directory B2C 重定向 URI
- printing - 如何使用 ZPL II 打印像 E_{n} 这样的下标?
- visual-studio-code - 为什么在超级终端中工作的永久别名在 vs-code bash 终端中不起作用?
- java - 如何使 systemprintln 语句仅打印 arraylist 值而不重复文本
- r - 使用 R 对数据框执行敏感性分析
- django - filter() 会抛出异常吗?
- javascript - 创建新的 iframe 并同步加载内容
- jquery - 如何使用jQuery将thead、tr、th和td动态添加到表中?
- php - 如何添加 - 中间字符串
- azure - 有没有办法获取任务中使用的 SubscriptionID:“Azure 资源组部署”