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

时间:2017-09-28 13:39:35

标签: amazon-web-services apache-kafka aws-lambda amazon-sns amazon-kinesis

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

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

我不知道这样做的最佳做法是什么,或者是否已经完成。我想弄清楚这样做的不同选择是什么。

提前感谢您的帮助。

**在我们的本地解决方案中,我们遇到了Kafka对邮件大小限制为10MB的问题。

4 个答案:

答案 0 :(得分:2)

更新了针对OP对Kafka的偏好以及解决10MB限制的帐户答案:

让Lambda向Kafka发送消息。

为此,您可以:

  1. 在您的网络外部使您的Kafka实例可用,以便Lambda可以访问它。或者,
  2. 将Lambda放入VPC并将VPC连接到内部网络(如果未设置直接连接)。
  3. 要解决10MB限制,请将整个数据(超过10MB)拆分为较小的块并向Kafka发送多条消息。然后,如有必要,处理应用程序中块的连接。

    原始答案: 我的建议是:

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

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

    其他选项包括:

    1. 与上述相同,但使用Kinesis代替SNS 。是否使用SNS或Kinesis的决定取决于您的应用需求。

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

.as-console-wrapper { max-height: 100% !important; top: 0; }

enter image description here