Sil*_*ver 280 amazon-web-services node.js aws-lambda aws-api-gateway
我有2个Lambda函数 - 一个产生报价,一个将报价转换为订单.我希望Order lambda函数调用Quote函数来重新生成引用,而不是仅从不受信任的客户端接收它.
我看到了我能想到的所有地方 - 但看不出我是如何进行链接或调用功能的......当然这存在!
Nic*_*nié 333
我找到了一种方法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)
}
});
Run Code Online (Sandbox Code Playgroud)
您可以在此处找到该文档:http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html
kix*_*orz 103
你应该链接你的Lambda functions通道SNS.此方法以最小的工作量提供了良好的性能,延迟和可伸缩性.
您首先Lambda向您发布消息,SNS Topic第二个Lambda订阅此主题.一旦消息到达主题,第二个Lambda消息就作为输入参数执行.
您还可以使用此方法通过SNS调用跨帐户Lambda函数.
blu*_*kin 63
这是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)
Run Code Online (Sandbox Code Playgroud)
顺便说一句,你需要在你的lambda角色中添加这样的策略
{
"Sid": "Stmt1234567890",
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": "*"
}
Run Code Online (Sandbox Code Playgroud)
dus*_*noe 26
自从提出这个问题以来,亚马逊已经发布了步骤功能(https://aws.amazon.com/step-functions/).
AWS Lambda背后的核心原则之一是,您可以更多地关注业务逻辑,而不是关注将它们联系在一起的应用程序逻辑.步骤函数允许您协调函数之间的复杂交互,而无需编写代码来执行此操作.
Ben*_*den 10
我一直在寻找切断SNS,直到我在Lambda客户端文档(Java版本)中看到它:
访问AWS Lambda的客户端.使用此客户端进行的所有服务调用都是阻止的,并且在服务调用完成之前不会返回.
所以SNS有一个明显的优势:它是异步的.你的lambda不会等待随后的lambda完成.
Bla*_*ack 10
有很多答案,但没有一个答案强调调用另一个 lambda 函数不是同步调用的推荐解决方案,您应该使用的实际上是Step Functions
不推荐解决方案的原因:
您还可以将它用于相当复杂的逻辑,例如并行步骤和捕获失败。每次执行也会被注销,这使得调试更加简单。
此解决方案使用boto3和Python完成:
import boto3
import json
invokeLambda = boto3.client('lambda', region_name='eu-west-1')
def lambda_handler(event, context):
invokeLambda.invoke(FunctionName = 'function_name', InvocationType = 'RequestResponse', Payload = json.dumps(event))
return True
Run Code Online (Sandbox Code Playgroud)
亚马逊于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
}
}
}
Run Code Online (Sandbox Code Playgroud)
Steps函数使编写多个lambda函数并依次或并行运行变得非常容易。您可以在此处获取有关lambda步骤功能的更多信息: 步骤功能
在java中,我们可以这样做:
AWSLambdaAsync awsLambdaAsync = AWSLambdaAsyncClientBuilder.standard().withRegion("us-east-1").build();
InvokeRequest invokeRequest = new InvokeRequest();
invokeRequest.withFunctionName("youLambdaFunctionNameToCall").withPayload(payload);
InvokeResult invokeResult = awsLambdaAsync.invoke(invokeRequest);
Run Code Online (Sandbox Code Playgroud)
在这里,payload 是字符串化的java 对象,它需要作为 Json 对象传递给另一个 lambda,以防您需要将一些信息从调用 lambda 传递到被调用 lambda。
小智 5
我正在使用blueskin提供的答案,但由于InvocationType ='Event'是async,所以无法读取有效负载响应,因此我将其更改为InvocationType ='RequestResponse',现在一切正常。
| 归档时间: |
|
| 查看次数: |
143557 次 |
| 最近记录: |