AWS Lambda函数完成会触发另一个lambda函数

时间:2020-06-05 17:11:58

标签: python amazon-web-services amazon-s3 aws-lambda

我正在尝试将lambda函数串在一起。第一个lambda函数在30分钟的计时器上抓取数据并将其放入S3存储桶中,下一个lambda函数检索并解析该数据并将其放入单独的S3存储桶中,最后一个函数对该数据进行分析并发送用户(在本例中为我本人)通过python smtplib模块发送结果电子邮件。

我不想让最后两个lambda函数在计时器上运行,而是希望在第一个函数完成时触发第二个函数,而在第二个函数完成时触发最后一个函数。以及删除第一个S3存储桶中的两个文件夹和第二个S3存储桶中的内容,以节省内存和处理时间。

是否有一种方法可以完全在AWS Web界面中执行此操作,而不是重写已有的python代码?

5 个答案:

答案 0 :(得分:3)

这听起来像您有一个step functions可以满足的用例。

您将添加一个流,该流具有第一个Lambda调用,然后,如果调用成功,则第二个Lambda函数将在两者之间传递输入/输出。

您将更新计划的操作以执行步骤功能,而不是第一个Lambda。

答案 1 :(得分:2)

这可以通过使用S3 Put事件作为Lambda的触发器来完成。

第二个和第三个lambda可以具有S3放置事件触发器。

 Timer                  Put Event                    Put Event          
-------Lambda_1 -> S3 ------------> Lambda_2 --> S3 ------------> Lambda_3 ---> Email  
  1. 计时器将首先触发lamdba,它将文件放入S3存储桶
  2. S3存储桶上的PUT事件将触发Lambda_2,它将Lambda_2放入S3存储桶中。
  3. 同样,此存储桶上的PUT事件将触发Lambda_3,后者将触发电子邮件。

检查以下链接以获取更多信息:

URL-1

URL-2

答案 2 :(得分:1)

另一种可能涉及重写python代码的解决方案是:

import boto3
lambda_client = boto3.client('lambda')
payload = b'{"a": 1, "b": 2, "c": 3}'
response = lambda_client.invoke(
               FunctionName="my-second-function",
               InvocationType='Event',
               Payload=payload
           )

相比之下,我发现步进函数要复杂得多。

答案 3 :(得分:0)

另一种方法是lambda destinations

此功能提供对Lambda函数调用的可见性,并将执行结果路由到AWS服务,从而简化了事件驱动的应用程序并降低了代码复杂性。您可以选择以下四个目标之一:另一个Lambda函数,SNS,SQS或EventBridge。

您可以将lambda成功绑定到另一个lambda(destination),并将结果绑定到另一个lambda。

答案 4 :(得分:0)

这里的所有答案都有效。总结一下,您可以:

  • 文件到达S3存储桶时触发lambdas
  • 使用步进功能一个接一个地协调3个lambda函数
  • 使用Lambda目标(成功完成)来协调工作流程

所有这些都可以满足您的要求,这是一些额外的信息。

  • 对于S3选项,您可以指定哪些事件触发lambda(例如PutObject),甚至触发文件的前缀和后缀。
  • 对于Step功能,这是我最喜欢的选项。这是一个昂贵的选择(通常比lambda多5到10倍),但实际上它可以编排所有内容,并且您从控制台获得的视图非常棒。如果发生问题,很容易对问题进行分类。
  • 对于Lambda目的地,您还可以设置onFailure模式,以便在功能失败时可以收到警报。当然onSuccess会导致下一个有问题的功能。

希望有帮助。