我有2个Lambda函数 - 一个生成报价,另一个将报价转换为订单。 我希望Order Lambda函数调用Quote函数重新生成报价,而不是仅从不受信任的客户端接收报价。
我已经寻找了我能想到的所有地方 - 但是不知道如何链接或调用这些函数...肯定有这样的函数存在!
我有2个Lambda函数 - 一个生成报价,另一个将报价转换为订单。 我希望Order Lambda函数调用Quote函数重新生成报价,而不是仅从不受信任的客户端接收报价。
我已经寻找了我能想到的所有地方 - 但是不知道如何链接或调用这些函数...肯定有这样的函数存在!
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);
}
});
您可以在此处找到文档:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html
InvocationType: 'Event'
参数的帮助,我成功地使它工作了(将其添加到 FunctionName
和 Payload
之后)。根据文档:_"您可以通过指定 InvocationType 为 Event 来选择异步执行。"_ 使用异步执行,回调函数将被可靠地调用,而无需等待被调用的 Lambda 执行完成。 - AlessandroAWSLambdaRole
。或者,您可以将以下语句对象添加到您的角色现有策略中:'{
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": ["*"]
}' - Bob Arloffrom 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().isoformat()}
invoke_response = lambda_client.invoke(FunctionName="another_lambda_",
InvocationType='Event',
Payload=json.dumps(msg))
print(invoke_response)
顺便提一下,您还需要将此策略添加到您的 Lambda 角色中
{
"Sid": "Stmt1234567890",
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": "*"
}
datetime.now()
转换为字符串(或以某种方式处理)。否则,你会收到错误消息:datetime.datetime(2017, 9, 11, 14, 40, 53, 23834) is not JSON serializable
。 - John CInvocationType
应为 RequestResponse
,以获取您尝试调用的 Lambda 函数的响应。 - ambigus9InvocationType
是 RequestResponse
,您应该打印 print(invoke_response['Payload'].read().decode())
以正确打印响应消息。 - Prageeth Jayathissa这个解决方案是使用boto3和Python完成的:
import boto3
import json
lambda_client = boto3.client('lambda', region_name='eu-west-1')
def lambda_handler(event, context):
lambda_client.invoke(FunctionName = 'function_name', InvocationType = 'RequestResponse', Payload = json.dumps(event))
return True
我本来想放弃使用SNS,直到我在Lambda客户端文档(Java版本)中看到了这个:
用于访问AWS Lambda的客户端。使用此客户端进行的所有服务调用都是阻塞的,并且在服务调用完成之前不会返回。
因此,SNS具有明显的优势:它是异步的。您的lambda将不会等待后续的lambda完成。
Amazon于2016年在AWS Lambda中引入了步骤函数。我认为,现在使用步骤函数更加方便,因为它们真的很容易使用。您可以使用两个Lambda函数构建状态机,分别是:
您可以轻松地按照以下方式完成此操作:
这里您可以拥有生成报价的第一个状态和将其转化为订单的另一个状态
{
Comment: "Produce a quote and turns into an order",
StartAt: "ProduceQuote",
States: {
ProduceQuote: {
"Type": Task,
"Resource": "arn:aws:lambda:us-east-1:123456789012:function:ProduceQuote",
"next": TurnsToOrder
}
TurnsToOrder: {
Type: Task,
Resource: "arn:aws:lambda:us-east-1:123456789012:function:ProduceQuote",
end: true
}
}
}
使用Step Functions可以轻松编写多个Lambda函数,并按顺序或并行运行。
您可以在此处获取有关Lambda步骤函数的更多信息:Steps Functions
有很多答案,但是没有一个强调调用另一个lambda函数不是同步调用的推荐解决方案,你应该使用的真正解决方案是Step Functions
为什么不推荐使用这种解决方案:
你还可以将其用于相当复杂的逻辑,例如并行步骤和捕获失败。每次执行也都被记录下来,使得调试更加简单。
AWSLambdaAsync awsLambdaAsync = AWSLambdaAsyncClientBuilder.standard().withRegion("us-east-1").build();
InvokeRequest invokeRequest = new InvokeRequest();
invokeRequest.withFunctionName("youLambdaFunctionNameToCall").withPayload(payload);
InvokeResult invokeResult = awsLambdaAsync.invoke(invokeRequest);
在这里,payload是您需要传递给另一个lambda的字符串化Java对象,如果您需要从调用lambda传递一些信息到被调用的lambda,则需要将其作为Json对象传递。
我正在使用blueskin提供的答案进行工作,但由于InvocationType='Event'是异步的,所以我无法读取有效载荷响应,因此我将其更改为InvocationType='RequestResponse',现在一切正常。