AWS Lambda 函数可以调用另一个吗
Can an AWS Lambda function call another
我有 2 个 Lambda 函数 - 一个生成报价,一个将报价转换为订单。
我希望 Order lambda 函数调用 Quote 函数来重新生成报价,而不是仅仅从不受信任的客户端接收它。
我已经查看了所有我能想到的地方 - 但看不到我将如何链接或调用函数......这肯定存在!
您应该通过 SNS
链接您的 Lambda functions
。这种方法以最少的工作量提供了良好的性能、延迟和可扩展性。
您的第一个 Lambda
向您的 SNS Topic
发布了消息,第二个 Lambda
订阅了该主题。一旦消息到达主题,第二个 Lambda
就会以消息作为输入参数执行。
我找到了使用 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
您也许可以使用 Async.js 瀑布功能 - 请参阅本文档第 3 步中大代码块的底部示例:
https://aws.amazon.com/blogs/compute/better-together-amazon-ecs-and-aws-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": "*"
}
您可以使用 AWSLambdaClient
直接调用 lambda 函数(至少通过 Java),如 AWS 博客 post 中所述。
我正在使用 blueskin 提供的答案,但我无法读取有效负载响应,因为 InvocationType='Event' 是 async,所以我更改为 InvocationType='RequestResponse' 现在一切正常。
我遇到了同样的问题,但我实现的 Lambda 函数会在 DynamoDB 中插入一个条目,因此我的解决方案使用 DynamoDB 触发器。
我让数据库为 table 中的每个 insert/update 调用一个 Lambda 函数,因此这将两个 Lambda 函数的实现分开。
文档在这里:
http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.Lambda.html
有点迂回的解决方案,但当我需要链接它们时,我只是为我的 lambda 函数调用 API 端点。这允许您在编码时决定是否希望它们异步。
如果您不想设置 POST 请求,您可以只设置一个简单的 GET 请求,或者 none,查询字符串参数以便于事件传递。
--编辑--
参见: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
我一直在考虑删除 SNS,直到我在 Lambda client docs (Java version) 中看到这个:
Client for accessing AWS Lambda. All service calls made using this client are blocking, and will not return until the service call completes.
所以SNS有一个明显的优势:它是异步的。您的 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);
在这里,payload 是你的 stringified java 对象,它需要作为 Json 对象传递给另一个 lambda,以防你需要传递一些信息从调用 lambda 到调用 lambda。
您可以设置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();
自从提出这个问题后,Amazon 发布了 Step Functions (https://aws.amazon.com/step-functions/)。
AWS Lambda 背后的核心原则之一是您可以更多地关注业务逻辑,而不是将它们联系在一起的应用程序逻辑。 Step functions 允许您编排函数之间的复杂交互,而无需编写代码来完成。
亚马逊在2016年在AWS lambda中引入了steps函数。我想,现在使用steps函数更方便,因为它真的很容易使用。您可以使用两个 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 Functions
此解决方案是使用 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
其他人指出使用SQS和Step Functions。但是这两种解决方案都会增加额外的成本。 Step Function 状态转换据说非常昂贵。
AWS lambda 提供了一些重试逻辑。它尝试某事 3 次的地方。当您使用 API 触发它时,我不确定它是否仍然有效。
这里是调用另一个 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)
您可以直接从其他 Lambda 函数以异步方式直接触发 Lambda 函数。
https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html#invocation-async-destinations
有很多答案,但 none 强调调用另一个 lambda 函数不是同步调用的推荐解决方案,您应该使用的确实是 Step Functions
不推荐解决方案的原因:
- 当两个功能相互等待时,您为这两个功能付费
- 您的代码负责重试
您还可以将它用于相当复杂的逻辑,例如并行步骤和捕获失败。每次执行也会被注销,这使得调试变得更加简单。
我有 2 个 Lambda 函数 - 一个生成报价,一个将报价转换为订单。 我希望 Order lambda 函数调用 Quote 函数来重新生成报价,而不是仅仅从不受信任的客户端接收它。
我已经查看了所有我能想到的地方 - 但看不到我将如何链接或调用函数......这肯定存在!
您应该通过 SNS
链接您的 Lambda functions
。这种方法以最少的工作量提供了良好的性能、延迟和可扩展性。
您的第一个 Lambda
向您的 SNS Topic
发布了消息,第二个 Lambda
订阅了该主题。一旦消息到达主题,第二个 Lambda
就会以消息作为输入参数执行。
我找到了使用 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
您也许可以使用 Async.js 瀑布功能 - 请参阅本文档第 3 步中大代码块的底部示例:
https://aws.amazon.com/blogs/compute/better-together-amazon-ecs-and-aws-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": "*"
}
您可以使用 AWSLambdaClient
直接调用 lambda 函数(至少通过 Java),如 AWS 博客 post 中所述。
我正在使用 blueskin 提供的答案,但我无法读取有效负载响应,因为 InvocationType='Event' 是 async,所以我更改为 InvocationType='RequestResponse' 现在一切正常。
我遇到了同样的问题,但我实现的 Lambda 函数会在 DynamoDB 中插入一个条目,因此我的解决方案使用 DynamoDB 触发器。
我让数据库为 table 中的每个 insert/update 调用一个 Lambda 函数,因此这将两个 Lambda 函数的实现分开。
文档在这里: http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.Lambda.html
有点迂回的解决方案,但当我需要链接它们时,我只是为我的 lambda 函数调用 API 端点。这允许您在编码时决定是否希望它们异步。
如果您不想设置 POST 请求,您可以只设置一个简单的 GET 请求,或者 none,查询字符串参数以便于事件传递。
--编辑--
参见: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
我一直在考虑删除 SNS,直到我在 Lambda client docs (Java version) 中看到这个:
Client for accessing AWS Lambda. All service calls made using this client are blocking, and will not return until the service call completes.
所以SNS有一个明显的优势:它是异步的。您的 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);
在这里,payload 是你的 stringified java 对象,它需要作为 Json 对象传递给另一个 lambda,以防你需要传递一些信息从调用 lambda 到调用 lambda。
您可以设置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();
自从提出这个问题后,Amazon 发布了 Step Functions (https://aws.amazon.com/step-functions/)。
AWS Lambda 背后的核心原则之一是您可以更多地关注业务逻辑,而不是将它们联系在一起的应用程序逻辑。 Step functions 允许您编排函数之间的复杂交互,而无需编写代码来完成。
亚马逊在2016年在AWS lambda中引入了steps函数。我想,现在使用steps函数更方便,因为它真的很容易使用。您可以使用两个 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 Functions
此解决方案是使用 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
其他人指出使用SQS和Step Functions。但是这两种解决方案都会增加额外的成本。 Step Function 状态转换据说非常昂贵。
AWS lambda 提供了一些重试逻辑。它尝试某事 3 次的地方。当您使用 API 触发它时,我不确定它是否仍然有效。
这里是调用另一个 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)
您可以直接从其他 Lambda 函数以异步方式直接触发 Lambda 函数。
https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html#invocation-async-destinations
有很多答案,但 none 强调调用另一个 lambda 函数不是同步调用的推荐解决方案,您应该使用的确实是 Step Functions
不推荐解决方案的原因:
- 当两个功能相互等待时,您为这两个功能付费
- 您的代码负责重试
您还可以将它用于相当复杂的逻辑,例如并行步骤和捕获失败。每次执行也会被注销,这使得调试变得更加简单。