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();