【问题标题】:AWS Lambda function completion triggers another lambda functionAWS Lambda 函数完成触发另一个 lambda 函数
【发布时间】:2020-06-06 19:47:06
【问题描述】:

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

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

有没有办法完全在 AWS Web 界面中执行此操作,而不是重写我已经拥有的 python 代码?

【问题讨论】:

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


    【解决方案1】:

    听起来您有一个可以由step functions 实现的用例。

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

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

    【讨论】:

    • 嗯,很有趣。我去看看,谢谢!
    【解决方案2】:

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

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

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

    查看以下链接了解更多信息:

    URL-1

    URL-2

    【讨论】:

    • 问题在于 S3,初始函数在执行过程中会将多个文件放入存储桶中,所以 Put 触发器会过早关闭吗?
    • 在这种情况下,一旦所有文件都上传到 S3 存储桶中,在 lambda 中添加代码以创建一个类似“complete.txt”的文件并上传到 S3 存储桶中。使用后缀为该文件放置 S3 Put Event 触发器:*.txt
    • S3 存储桶中有两个文件夹,cmets 和articles,在执行过程中会填充json 数据。我假设这个 complete.txt 可以放在 S3 存储桶本身中并调用将该文件放在 lambda_handler 末尾的代码。
    • 是的。您可以在 lambda_handler 的末尾添加代码。它应该被称为 Lambda 中的最后一个操作。您可以在 S3 存储桶中的任何位置放置“complete.txt”文件。只需确保在所有文件上传到所有文件夹后添加它即可。
    • JFYI。当您添加触发器时,除了Suffix,还有一个Prefix 选项。在此,您可以提及写入文件的文件夹。请注意,以防万一您打算在某个文件夹中写complete.txt
    【解决方案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
               )
    

    相比之下,我发现 Step Functions 要复杂得多。

    【讨论】:

      【解决方案4】:

      另一种方法是lambda destinations

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

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

      【讨论】:

        【解决方案5】:

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

        • 当文件到达 S3 存储桶时触发 lambdas
        • 使用 Step Functions 协调 3 个 lambda 函数,一个接一个
        • 使用 Lambda 目标(成功时)编排工作流

        所有这些都实现了您想要的,这里有一些额外的信息。

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

        希望对您有所帮助。

        【讨论】:

          猜你喜欢
          • 2018-06-18
          • 1970-01-01
          • 1970-01-01
          • 2018-07-19
          • 2019-11-09
          • 2018-01-13
          • 2018-06-09
          • 2019-06-28
          • 2016-04-19
          相关资源
          最近更新 更多