我有2个Lambda函数——一个生成报价,一个将报价转换为订单。 我希望Order lambda函数调用Quote函数来重新生成报价,而不是仅仅从不受信任的客户端接收报价。
我已经看遍了我能想到的所有地方——但不知道我该如何链接或调用函数……这当然存在!
我有2个Lambda函数——一个生成报价,一个将报价转换为订单。 我希望Order lambda函数调用Quote函数来重新生成报价,而不是仅仅从不受信任的客户端接收报价。
我已经看遍了我能想到的所有地方——但不知道我该如何链接或调用函数……这当然存在!
当前回答
亚马逊于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
}
}
}
Steps函数使得编写多个lambda函数并按顺序或并行运行变得非常容易。 你可以在这里获得更多关于lambda steps函数的信息: 步骤的功能
其他回答
有很多答案,但没有一个是强调调用另一个lambda函数不是同步调用的推荐解决方案,你应该使用的是真正的步骤函数
不建议解决的原因:
当两个函数相互等待时,你为它们支付了费用 你的代码负责重试
您还可以将它用于相当复杂的逻辑,例如并行步骤和捕获失败。每次执行都被注销,这使得调试更加简单。
亚马逊于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
}
}
}
Steps函数使得编写多个lambda函数并按顺序或并行运行变得非常容易。 你可以在这里获得更多关于lambda steps函数的信息: 步骤的功能
其他人指出使用SQS和步骤函数。但这两种解决方案都增加了额外的成本。阶跃函数的状态转换应该是非常昂贵的。
AWS lambda提供了一些重试逻辑。它尝试某件事3次。我不确定当你使用API触发它时,它是否仍然有效。
这是一种迂回的解决方案,但当我需要链接lambda函数时,我只调用API端点。这允许您在编码时决定是否希望它们是异步的。
如果你不想设置一个POST请求,你可以设置一个简单的GET请求,带几个查询字符串参数,或者根本不带查询字符串参数,以便于事件传递。
——编辑——
参见: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
下面是调用另一个lambda函数并获得其响应的python示例。有两种调用类型“RequestResponse”和“Event”。如果你想获得lambda函数的响应,请使用'RequestResponse',并使用'Event'来异步调用lambda函数。所以异步和同步两种方式都是可用的。
lambda_response = lambda_client.invoke(
FunctionName = lambda_name,
InvocationType = 'RequestResponse',
Payload = json.dumps(input)
)
resp_str = lambda_response['Payload'].read()
response = json.loads(resp_str)