首页 > 解决方案 > 计算 AWS lambda 调用并根据 api 键对数据进行分段

问题描述

客户(大约 1000 名)注册我的服务并收到客户唯一的 api 密钥。然后,他们在通过 AWS api 网关调用 AWS lambda 函数时使用该密钥访问 DynamoDb 中的数据。

要求 1:客户按 api 调用次数计费,所以我必须能够计算这些。AWS 只提供每个 lambda 的 api 调用总数的指标,所以我有几个选择:

  1. 在每次 api 命中增加 DynamoDB 中的一个计数器。
  2. 在每次 api 命中时,在 SQS 中排队一条消息,在“命中计数器”lambda 中接收它,并在 DynamoDB 中增加一个计数器。
  3. 为每个客户部署一个单独的 lambda。使用 AWS 内置呼叫计数器。

要求 2:lambda 可以访问的数据对于每个客户都是唯一的,因此取决于提供的 api 密钥。为了实现这一点,我还有很多选择:

  1. 将所需的 api 密钥与客户有权访问的数据一起存储。
  2. 为每个客户部署一个单独的 lambda。使用 api 网关通过密钥对其进行保护。
  3. 在 api 网关中为每个客户创建一个单独的端点,使用 api 密钥保护它。

以上选项似乎都不是设计解决方案的好方法。有这样做的规范方法吗?如果不是,上面哪个选项是最好的?我是否因为不熟悉 AWS 而错过了明显的解决方案?

标签: amazon-web-servicesaws-lambdaaws-api-gateway

解决方案


我会尝试用我的经验来分解你的问题,但也许 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 还为我们准备了这本不错的读物 :)

如果您有更多信息要分享,很高兴在评论部分继续

希望这可以帮助!


推荐阅读