计算每个API密钥的AWS Lambda调用和分段数据

时间:2019-02-26 19:55:15

标签: amazon-web-services aws-lambda aws-api-gateway

客户(大约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,我是否错过了一个显而易见的解决方案?

1 个答案:

答案 0 :(得分:1)

我将根据经验尝试解决您的问题,但也许Michael-Sqlbot或John Rotenstein可能会给出更适当的答案。

要求1

1)听起来不错。我在这里没有发现任何严重问题。

2),恕我直言,这是3中最好的。它将使数据访问与计费服务脱钩,这在微服务世界中是一件好事。

3)这是不可扩展的。想象一下,您的系统在增长,最终得到了10K Lambda函数。您不仅必须建立一个非常可靠的机制来自动化该过程,而且还需要监视1万种不同的事物(想象CloudWatch日志,API Gateway等),更不用说您将拥有1万种功能完全相同的代码(分开客户特定参数)。我什至不会考虑这一点。

要求2

1)它可以工作,并且非常适合DynamoDB服务器模型:在一个唯一的表中存储尽可能多的数据,因此您可以一次性获取所有数据。据我所知,您甚至可以将此ApiKey用作分区键,并且为了简单起见,您可以将客户端的数据作为JSON存储在名为data的列中。由于您的查询仅需要通过ApiKey进行查询,因此在DynamoDB中存储JSON不会造成伤害(但是请记住,如果您需要使用其JSON属性中的任何一个进行查询,而不是麻烦的话,因为DynamoDB的查询功能非常有限)

2)否,因为要求1.3

3)否,由于上述原因。

如果您仍然需要将ApiKey存储在不同的表中,以便您可以运行不同的分析并对客户端的呼叫,访问,计费等进行更细粒度的控制,那么这也不成问题,只需确保重复即可您的ClientData表上的ApiKey而不是创建FK(DynamoDB不支持FK,因此您需要自己管理这些约束)。在NoSQL世界中,复制就可以了。

您的用例显然是一个多租户用例,因此,我还建议您阅读Multi-Tenant Storage with Amazon DynamoDB,这将使您有更多的见解并扩大您的选择范围。多租户并非易事,如果实施不当,可能会给您带来很多麻烦。我认为这就是为什么AWS还为我们准备了这篇不错的文章的原因:)

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

希望这会有所帮助!