计算AWS lambda调用并按api键分段数据

问题描述 投票:1回答:1

客户(约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-services aws-lambda aws-api-gateway
1个回答
1
投票

我将尝试用我的经验来解决你的问题,但也许Michael-Sqlbot或John Rotenstein可能能够提供更合适的答案。

要求1

1)这听起来像是一个很好的方法。我在这里看不到任何批评。

2)恕我直言,这是3中最好的。它将数据访问与计费服务分离,这在微服务领域是一件好事。

3)这不可扩展。想象一下,您的系统会增长,最终会产生10K Lambda功能。您不仅需要构建一个非常可靠的机制来自动执行此过程,而且还需要监控10K不同的事物(想象一下CloudWatch日志,API网关等),更不用说您将拥有一万个功能完全相同的代码(客户特定参数除外)。我甚至都不会想到这个。

要求2

1)它可以工作,它非常适合DynamoDB服务模型:在一个独特的表中存储尽可能多的数据,因此您可以一次性获取所有内容。根据我的看法,您甚至可以使用此ApiKey作为分区键,为了简化此答案,请将客户端的数据作为JSON存储在名为data的列中。由于您的查询只需要通过ApiKey进行查询,因此在DynamoDB中存储JSON不会有任何损害(请记住,如果您需要通过任何JSON属性进行查询,而不是因为您的错误,那么,因为DynamoDB的查询功能非常有限)

2)否,因为要求1.3

3)不,因为上述原因。

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

您的用例显然是多租户,所以我建议您阅读Multi-Tenant Storage with Amazon DynamoDB,它会为您提供更多见解并扩大您的选择范围。多租户不是一件容易的事,如果没有正确实施,可能会给您带来很多麻烦。我想这就是为什么AWS也为我们准备了这个很好的读物:)

很高兴在评论部分继续这一点,以防您有更多信息要分享

希望这可以帮助!

© www.soinside.com 2019 - 2024. All rights reserved.