AWS:如何将数据从 AWS Lambda 发送到本地应用程序

AWS: how to send data from AWS Lambda to on-premises application

我正在尝试将数据(可能 >10MB)从 AWS Lambda 函数发送到正在写入本地数据存储的本地 CDAP 应用程序。

我知道我可以在本地应用程序上使用 REST 接口让 Lambda 进行调用,但我想知道是否可以使用消息传递系统将本地资源与 AWS 集成Lambdas(即,Lambda 写入本地应用程序可以读取的 Kafka 主题)。

我不知道执行此操作的最佳做​​法是什么,或者是否已经完成。我想弄清楚执行此操作的不同选项。

在此先感谢您的帮助。

** 我们 运行 遇到了 Kafka 在本地解决方案中对消息大小的 10MB 限制的问题。

更新答案以说明 OP 对 Kafka 的偏好并解决 10MB 限制:

让Lambda向Kafka发送消息。

为此,您可以:

  1. 使您的 Kafka 实例在您的网络之外可用,以便 Lambda 可以访问它。或者,
  2. 将 Lambda 放在 VPC 中,并将 VPC 连接到您的内部网络(如果未设置直连)。

要解决 10MB 的限制,请将整个数据(超过 10MB)拆分为更小的块,然后将多条消息发送到 Kafka。然后,如有必要,在您的应用程序中处理块的连接。


原回答: 我的建议是:

让您的 Lambda 写入本地应用程序可以订阅的 SNS 主题。

这是因为这是最容易实施的解决方案。不过,SNS 可能不是您应用程序的最佳选择。

其他选项是:

  1. 同上,但使用 Kinesis 而不是 SNS。是否使用 SNS 或 Kinesis 的决定将取决于您的应用程序的需求。

  2. 运行 您在 VPC 中的 Lambda,并将您的 VPC 连接到您的 VPN。这将使您的 lambda 访问您的私有网络中的资源(如 Kafka 实例)。

使用 Confluent REST 代理从 AWS Lambda 发布到 AWS 托管的 Apache Kafka 集群。这甚至可以是托管服务,例如在 AWS 中运行的 Confluent Cloud,也可以是您自己的 VPC 中的 Kafka 集群。然后,您可以通过多种方式将数据从 AWS Kafka 集群复制到本地集群,包括 Mirror Maker、Confluent Replicator、另一个 HTTPS 或 WSS 代理等。它应该是从本地端和隧道“拉”超过 SSL/TLS 否则它不会转换大多数客户端防火墙。

Kafka 消息没有 10 MB 的硬性限制。最大消息大小是一个可配置的参数。但是,最佳做法是将邮件大小保持在 10MB 或什至 1MB 以下,这是默认的最大大小值设置。对于较大的消息,您通常要么压缩它们,要么将它们分解成一系列较小的消息(使用公共密钥,以便它们保持顺序并转到同一分区),或者将大消息存储在 S3 或其他外部存储中,然后发布对存储位置的引用,以便消费者可以从 Kafka 带外检索它。

您可以根据 AWS Lambda 函数的负载规模使用 AWS SNS(推送)或 AWS SQS(拉取),而不是维护 Apache Kafka 集群。

  • 如果规模更大,或者您的本地基础架构中没有流式传输或排队功能来处理负载,或者如果您的本地资源中没有冗余,请使用 SQS,仍然使用SQS(完全托管的队列服务)。使用 SQS 时,您可以使用本地环境中的 SQS SDK 以 IAM 的相关权限调用 SQS。
  • 如果您的环境中有多个资源需要根据 Lambda 执行来触发,并且您需要基础设施设置来处理更高的规模,请使用 SNS(完全托管的 Pub-Sub 消息传递服务)。使用SNS时,可以使用HTTP触发器调用On-Premise资源。

由于 SQS 或 SNS 都不支持 10MB 的消息大小,因此每次执行后,您可以将 10MB 的数据推送到 AWS S3,其中存储桶配置了事件以向 SQS 或 SNS 主题发送通知。您的本地资源可以从 SQS 和 SNS 读取消息并从 S3 下载文件(具有 10MB 数据)。

Step #1 -> Create a stream in CDAP 
Step #2 -> Push the data to stream using REST call from your Lambda function
Step #3 -> Create the pipeline in CDAP
Step #4 -> make source as stream and sink as Database