【发布时间】: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
我们如何一个接一个地调用多个 AWS Lambda 函数?例如如果一个 AWS Lambda 链由 8 个独立的 lambda 函数组成,每个函数模拟一个 1 秒的处理事件,然后调用下一个函数在链中。
【问题讨论】:
标签: amazon-web-services amazon-s3 aws-lambda aws-sdk amazon-kinesis-firehose
我不建议使用直接invoke 来启动您的功能。相反,您应该考虑创建一个 SNS Topic 并将您的 Lambda 函数订阅到该主题。将消息发布到您的主题后,所有功能将同时触发。该解决方案还易于扩展。
更多信息见官方文档Invoking Lambda functions using Amazon SNS notifications
【讨论】:
用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));
【讨论】:
一个简单的方法是使用 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 的上下文,并且可以决定对不同的响应做任何您喜欢的事情。
【讨论】:
只是在每个函数的末尾调用下一个 Lambda 函数?
如果您使用的是 Node.js/JavaScript,请使用 http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda_20141111.html#invokeAsync-property。
【讨论】:
InvocationType 指定为 Event,这是当前不推荐使用的异步调用 Lambda 函数的方式,尽管仍然使用 SNS 主题可能是可取的,因为它还有其他好处。
invoke(不是invokeAsync)和InvocationType: 'Event' 链接多个lambda 调用的示例吗?我正在寻找类似于Promise.all([lambda1, lambda2, ...]).then(...) 的内容。