【问题标题】:Invoke multiple aws lambda functions调用多个 aws lambda 函数
【发布时间】:2016-01-29 09:42:59
【问题描述】:

我们如何一个接一个地调用多个 AWS Lambda 函数?例如如果一个 AWS Lambda 链由 8 个独立的 lambda 函数组成,每个函数模拟一个 1 秒的处理事件,然后调用下一个函数在链中。

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-lambda aws-sdk amazon-kinesis-firehose


    【解决方案1】:

    我不建议使用直接invoke 来启动您的功能。相反,您应该考虑创建一个 SNS Topic 并将您的 Lambda 函数订阅到该主题。将消息发布到您的主题后,所有功能将同时触发。该解决方案还易于扩展。

    更多信息见官方文档Invoking Lambda functions using Amazon SNS notifications

    【讨论】:

    • 这不是通过向 SNS 插入一个额外的跃点而不是直接调用必要的 lambda 函数来增加不必要的延迟吗?另外,这不会返回我假设的回调?
    • 它可能会增加延迟。它不会从调用的 lambda 返回回调。每个解决方案都有权衡。
    • 虽然使用 SNS 是一个有趣的想法,但我不确定我是否可以设想如何以链式方式执行此操作。如前所述,使用 SNS 会同时触发所有 lambda 订阅者。您将如何使用 SNS 进行链接?是否每个 lambda 在 msg 中附加一个特定代码,并且每个订阅过滤器仅基于代码?看起来工作量很大。
    • 您可以过滤 SNS 订阅的消息。我没有亲自使用过它,但对于这个用例来说,这似乎是值得探索的东西:docs.aws.amazon.com/sns/latest/dg/message-filtering.html
    【解决方案2】:

    用python:

    from boto3 import client as botoClient
    import json
    lambdas = botoClient("lambda")
    
    def lambda_handler(event, context):
        response1 = lambdas.invoke(FunctionName="myLambda1", InvocationType="RequestResponse", Payload=json.dumps(event));
        response2 = lambdas.invoke(FunctionName="myLambda2", InvocationType="RequestResponse", Payload=json.dumps(event));
    

    【讨论】:

      【解决方案3】:

      一个简单的方法是使用 AWS sdk 调用 lambda 函数。

      根据您使用的 sdk,解决方案看起来会有所不同。如果使用 Node sdk,我建议使用 Promise 库对 sdk 进行承诺,例如 Bluebird。

      代码如下所示:

      const Promise = require('bluebird');
      const AWS = require('aws-sdk');
      const lambda = Promise.promisifyAll(new AWS.Lambda({ apiVersion: '2015-03-31' }));
      
      lambda.invokeAsync({FunctionName: 'FirstLambdaFunction'})
        .then(() => {
          // handle successful response from first lambda
          return lambda.invokeAsync({FunctionName: 'SecondLambdaFunction'});
        })
        .then(() => lambda.invokeAsync({FunctionName: 'ThirdLambdaFunction'}))
        .catch(err => {
          // Handle error response  
        );

      我喜欢这种方法的原因是您拥有所有 lambda 的上下文,并且可以决定对不同的响应做任何您喜欢的事情。

      【讨论】:

        【解决方案4】:

        只是在每个函数的末尾调用下一个 Lambda 函数?

        如果您使用的是 Node.js/JavaScript,请使用 http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda_20141111.html#invokeAsync-property

        【讨论】:

        • 谢谢,但我使用了 invoke 方法,因为 invokeAsync 方法已被弃用。 (docs.aws.amazon.com/lambda/latest/dg/API_InvokeAsync.html)
        • API Invoke 方法 (docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html) 允许您将 InvocationType 指定为 Event,这是当前不推荐使用的异步调用 Lambda 函数的方式,尽管仍然使用 SNS 主题可能是可取的,因为它还有其他好处。
        • @JaredHatfield,您有使用invoke(不是invokeAsync)和InvocationType: 'Event' 链接多个lambda 调用的示例吗?我正在寻找类似于Promise.all([lambda1, lambda2, ...]).then(...) 的内容。
        • 我建议现在就研究一下 Lambda Step Functions。
        猜你喜欢
        • 1970-01-01
        • 2019-07-26
        • 2021-08-31
        • 2020-02-24
        • 1970-01-01
        • 2018-06-09
        • 2018-08-21
        • 1970-01-01
        • 2017-01-01
        相关资源
        最近更新 更多