AWS Lambda函数可以调用另一个函数吗?

我有2个Lambda函数 – 一个产生一个报价,一个把报价变成一个订单。 我希望Order lambda函数调用Quote函数来重新生成报价,而不是仅仅从不可信的客户端接收报价。

我到处都可以想到 – 但是我不知道如何去链接或调用函数……当然这存在!

我find了使用aws-sdk

 var aws = require('aws-sdk'); var lambda = new aws.Lambda({ region: 'us-west-2' //change to your region }); lambda.invoke({ FunctionName: 'name_of_your_lambda_function', Payload: JSON.stringify(event, null, 2) // pass params }, function(error, data) { if (error) { context.done('error', error); } if(data.Payload){ context.succeed(data.Payload) } }); 

你可以在这里find文档: http : //docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html

您应该通过SNS链接您的Lambda functions 。 这种方法提供了良好的性能,延迟和可扩展性,以最小的努力。

您的第一个Lambda将消息发布到您的SNS Topic ,第二个Lambda已订阅此主题。 只要消息到达主题,第二个Lambda就会随着消息的input参数被执行。

请参阅使用Amazon SNS通知调用Lambda函数 。

您也可以使用此方法通过SNS调用跨账户Lambda函数 。

这里是python的示例代码,

 from boto3 import client as boto3_client from datetime import datetime import json lambda_client = boto3_client('lambda') def lambda_handler(event, context): msg = {"key":"new_invocation", "at": datetime.now()} invoke_response = lambda_client.invoke(FunctionName="another_lambda_", InvocationType='Event', Payload=json.dumps(msg)) print(invoke_response) 

顺便说一句,你需要添加一个这样的策略到你的lambdaangular色

  { "Sid": "Stmt1234567890", "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": "*" } 

我正在研究切割SNS,直到我在Lambda客户端文档(Java版本)中看到这个:

访问AWS Lambda的客户端。 所有使用此客户端进行的服务调用都是阻塞的,直到服务调用完成才会返回。

所以SNS有一个明显的优势:它是asynchronous的。 你的lambda不会等待随后的lambda完成。

您可能能够使用Async.js瀑布function – 请参阅本文档的步骤3中的大代码块的底部,例如:

https://aws.amazon.com/blogs/compute/better-together-amazon-ecs-and-aws-lambda/

我正在使用blueskin提供的答案,但是我无法读取Payload响应,因为InvocationType ='Event'asynchronous的 ,所以我将其更改为InvocationType ='RequestResponse',现在一切正常。

我遇到同样的问题,但是我实现的Lambda函数将在DynamoDB中插入条目,所以我的解决scheme使用DynamoDB触发器。

我使DB为表中的每个插入/更新调用一个Lambda函数,因此这将分离两个Lambda函数的实现。

文档在这里: http : //docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.Lambda.html

这是一个指导演练: https : //aws.amazon.com/blogs/aws/dynamodb-update-triggers-streams-lambda-cross-region-replication-app/

一种迂回的解决scheme,但我只需要调用我的lambda函数的API端点 ,当我需要链接它们。 这允许您在编码时决定是否希望它们是asynchronous的。

如果你不想设置一个POST请求,你可以设置一个简单的GET请求,或者根本没有,请查询string参数,以方便事件传递。

– 编辑 –

请参阅: https : //docs.aws.amazon.com/apigateway/api-reference/making-http-requests/

和: http : //docs.aws.amazon.com/lambda/latest/dg/with-on-demand-https-example.html

在Java中,我们可以做如下:

 AWSLambdaAsync awsLambdaAsync = AWSLambdaAsyncClientBuilder.standard().withRegion("us-east-1").build(); InvokeRequest invokeRequest = new InvokeRequest(); invokeRequest.withFunctionName("youLambdaFunctionNameToCall").withPayload(payload); InvokeResult invokeResult = awsLambdaAsync.invoke(invokeRequest); 

在这里,有效载荷是你的string化的 java对象,它需要作为Json对象传递给另一个lambda,以防你需要从调用lambda传递一些信息到lambda。

您可以使用AWSLambdaClient直接调用lambda函数(至less通过Java),如AWS博客文章中所述 。

您可以设置AWS_REGION环境。

 assert(process.env.AWS_REGION, 'Missing AWS_REGION env (eg. ap-northeast-1)'); const aws = require('aws-sdk'); const lambda = new aws.Lambda();