Python AWS Lambda函数完成触发另一个Lambda函数

Python AWS Lambda函数完成触发另一个Lambda函数,python,amazon-web-services,amazon-s3,aws-lambda,Python,Amazon Web Services,Amazon S3,Aws Lambda,我正在尝试将lambda函数串在一起。第一个lambda函数使用30分钟的计时器来抓取数据并将其放入S3存储桶中,下一个lambda函数检索并解析该数据并将其放入单独的S3存储桶中,最后一个函数对该数据执行分析,并通过pythons smtplib模块向用户(在本例中为我自己)发送一封结果电子邮件 我希望在第一个函数完成时触发第二个函数,在第二个函数完成时触发最后一个函数,而不是在计时器上运行最后两个lambda函数。同时,删除第一个S3存储桶中的两个文件夹和第二个S3存储桶中的内容,以节省内存

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

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


有没有一种方法可以完全在AWS web界面中实现这一点,而不是重写我已有的python代码?

这听起来像是您有一个可以通过以下方式实现的用例

您将添加一个调用了第一个Lambda的流,如果成功调用了第二个Lambda函数,则在两个Lambda之间传递输入/输出


您将更新计划的操作以执行step函数,而不是第一个Lambda。

可以使用S3 Put事件作为Lambda的触发器

第二个和第三个lambda可以有S3PUT事件触发器

 Timer                  Put Event                    Put Event          
-------Lambda_1 -> S3 ------------> Lambda_2 --> S3 ------------> Lambda_3 ---> Email  
  • 计时器将触发第一个lamdba,它将文件放入S3存储桶中
  • S3存储桶上的PUT事件将触发Lambda_2,该Lambda_2将文件放入S3存储桶中
  • 同样,此存储桶上的PUT事件将触发Lambda_3,它将触发电子邮件 查看以下链接以了解更多信息:


    另一个需要重写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
               )
    

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

    另一种方法是
    lambda destinations

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


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

    这里的所有答案都有效。总而言之,您可以:

    • 当文件到达S3存储桶时触发lambda
    • 使用阶跃函数依次协调3个lambda函数
    • 使用Lambda destinations(成功时)编排工作流
    所有这些都实现了你的愿望,这里有一些额外的信息

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

    希望有帮助。

    hhm很有趣。我来看看,谢谢!对于S3,初始函数在执行过程中会将多个文件放入存储桶中,因此Put触发器是否会过早关闭?在这种情况下,一旦所有文件都上载到S3存储桶中,请在lambda中添加代码以创建一个类似“complete.txt”的文件并上载到S3存储桶中。使用后缀:*.txt放置此文件的S3 Put事件触发器S3 bucket中有两个文件夹,comments和articles,它们在执行期间被json数据填充。我假设这个complete.txt可以放在S3 bucket中,并调用将该文件放在lambda_handler.Yup末尾的代码。您可以在lambda_处理程序的末尾添加代码。它应该被称为Lambda中的最后一个操作。您可以将“complete.txt”文件放在S3存储桶中的任何位置。只需确保在所有文件上载到所有文件夹后添加它。JFYI。在添加触发器时,除了
    后缀
    之外,还有一个
    前缀
    选项。在这里,您可以提到正在写入文件的文件夹。请注意,以防您计划在某个文件夹中编写
    complete.txt