我有2个Lambda函数-一个产生报价,另一个将报价变成订单。我希望Order lambda函数调用Quote函数来重新生成报价,而不是仅仅从不受信任的客户端接收报价。
我到处都可以想到的地方-但是看不到如何链接或调用函数...肯定存在!
我有2个Lambda函数-一个产生报价,另一个将报价变成订单。我希望Order lambda函数调用Quote函数来重新生成报价,而不是仅仅从不受信任的客户端接收报价。
我到处都可以想到的地方-但是看不到如何链接或调用函数...肯定存在!
Answers:
我找到了使用的方法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
)。从文档中:“您可以选择通过将Event指定为InvocationType来请求异步执行。” 使用异步执行,将可靠地调用回调函数,而不必等待调用的lambda完成执行。
AWSLambdaRole
。或者,您可以将以下语句对象添加到角色的现有策略中:'{“ Effect”:“ Allow”,“ Action”:[“ lambda:InvokeFunction”],“ Resource”:[“ *”]}`
您应该将您的Lambda functions
via链接起来SNS
。这种方法以最小的工作量提供了良好的性能,延迟和可伸缩性。
您的第一个Lambda
向您发布消息,SNS Topic
第二个Lambda
已订阅该主题。一旦消息到达主题,就将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)
顺便说一句,您还需要在lambda角色中添加这样的策略
{
"Sid": "Stmt1234567890",
"Effect": "Allow",
"Action": [
"lambda:InvokeFunction"
],
"Resource": "*"
}
datetime.now()
为字符串(或以某种方式处理)。否则,您会得到错误datetime.datetime(2017, 9, 11, 14, 40, 53, 23834) is not JSON serializable
InvocationType
应该是:RequestResponse
。从您尝试调用的lambda获得响应。
自从提出此问题以来,Amazon已发布了Step Functions(https://aws.amazon.com/step-functions/)。
AWS Lambda背后的核心原则之一是,您可以将更多精力放在业务逻辑上,而将精力放在将它们联系在一起的应用程序逻辑上。逐步函数使您能够协调函数之间的复杂交互,而无需编写代码即可完成。
此解决方案使用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
我一直在考虑淘汰SNS,直到在Lambda客户端文档(Java版本)中看到了:
用于访问AWS Lambda的客户端。使用此客户端进行的所有服务调用均处于阻塞状态,直到该服务调用完成才返回。
因此SNS具有明显的优势:它是异步的。您的lambda不会等待后续的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步骤功能的更多信息: 步骤功能
在java中,我们可以执行以下操作:
AWSLambdaAsync awsLambdaAsync = AWSLambdaAsyncClientBuilder.standard().withRegion("us-east-1").build();
InvokeRequest invokeRequest = new InvokeRequest();
invokeRequest.withFunctionName("youLambdaFunctionNameToCall").withPayload(payload);
InvokeResult invokeResult = awsLambdaAsync.invoke(invokeRequest);
在这里,有效负载是您的字符串化 Java对象,需要将它作为Json对象传递给另一个lambda,以防您需要将某些信息从调用lambda传递给被调用的lambda。
您可能可以使用Async.js Waterfall功能-有关示例,请参阅本文档第3步中大代码块的底部:
https://aws.amazon.com/blogs/compute/better-together-amazon-ecs-and-aws-lambda/
我遇到了同样的问题,但是我实现的Lambda函数将在DynamoDB中插入一个条目,因此我的解决方案使用DynamoDB触发器。
我让数据库为表中的每个插入/更新调用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/
一种回旋解决方案,但是当我需要链接它们时,我只是为我的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”,并使用“事件”异步调用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)