从另一个未被调用的 Lambda 函数中调用 Lambda 函数
Posted
技术标签:
【中文标题】从另一个未被调用的 Lambda 函数中调用 Lambda 函数【英文标题】:Invoking a Lambda function from within another Lambda function not getting invoked 【发布时间】:2019-07-01 05:31:52 【问题描述】:如何在 Lambda 函数中调用 Lambda 函数?
例如,
在函数1中,它将由API网关请求触发,并将调用第二个lambda函数作为事件(InvocationType = Event)。
在函数2中,它将向端点发出http请求。
另外,我要在 serverless.yml 中编码吗?还是仅在 index/app/handler.js 上编码?
我在 *** 上尝试了这里的链接 -> Nodejs - Invoke an AWS.Lambda function from within another lambda function 但它不起作用。
var AWS = require('aws-sdk');
AWS.config.region = 'eu-west-1';
var lambda = new AWS.Lambda();
//LAMBDA A
exports.handler = function(event, context)
var params =
FunctionName: 'Lambda_B', // the lambda function we are going to invoke
InvocationType: 'RequestResponse',
LogType: 'Tail',
Payload: ' "name" : "Yza" '
;
lambda.invoke(params, function(err, data)
if (err)
context.fail(err);
else
context.succeed('Lambda_B said '+ data.Payload);
)
;
//LAMBDA B
exports.handler = function(event, context)
console.log('Lambda B Received event:', JSON.stringify(event, null, 2));
context.succeed('Hello ' + event.name);
;
【问题讨论】:
【参考方案1】:您的问题是 lambda.invoke()
函数是非阻塞的,因此 Lambda_A 在调用 Lambda_B 之前完成了它的执行。你可以使用 Promise 来处理它。如果你是using Node.js 8.10+,你可以这样做:
Lambda_A:
let AWS = require('aws-sdk');
let lambda = new AWS.Lambda();
exports.handler = async (event) =>
let params =
FunctionName: 'Lambda_B',
InvocationType: 'RequestResponse',
Payload: ' "foo" : "bar" '
;
return await lambda.invoke(params, function(err, data)
if (err)
throw err;
else
console.log('LambdaB invoked: ' + data.Payload);
).promise();
;
Lambda_B:
exports.handler = async (event) =>
return
statusCode: 200,
body: JSON.stringify('Hello from Lambda_B!'),
;
;
调用 Lambda_A 时的响应:
"StatusCode": 200,
"ExecutedVersion": "$LATEST",
"Payload": "\"statusCode\":200,\"body\":\"\\\"Hello from Lambda_B!\\\"\""
调用时来自 Lambda_A 的控制台输出:
START RequestId: 016a763d-c79e-4d72-bd44-0aaa89a5efaf Version: $LATEST
2019-02-07T08:07:11.154Z 016a763d-c79e-4d72-bd44-0aaa89a5efaf LambdaB invoked: "statusCode":200,"body":"\"Hello from Lambda_B!\""
END RequestId: 016a763d-c79e-4d72-bd44-0aaa89a5efaf
REPORT RequestId: 016a763d-c79e-4d72-bd44-0aaa89a5efaf Duration: 717.40 ms Billed Duration: 800 ms Memory Size: 128 MB Max Memory Used: 30 MB
【讨论】:
我对无服务器项目不是很熟悉,但我认为代码应该放在 handler.js 中 我试过你的代码,但它给了我一个错误 Serverless Error --------------- ------------ Stack:arn:aws:cloudformation:us-east-1:376014394890:stack/lambda-test-dev/be4e1a40-29c0-11e9-8b17-0a9ef6cbb06a 处于 UPDATE_IN_PROGRESS 状态并且无法更新。【参考方案2】:您可以添加策略包括 LambdaInvoke 的用户,然后添加以下配置
enter code var credentials =
accessKeyId : process.env.ACCESS_KEY,
secretAccessKey : process.env.SECRET_KEY;
AWS.config.update(
"credentials":credentials,
"region":"eu-central-1"
);
【讨论】:
以上是关于从另一个未被调用的 Lambda 函数中调用 Lambda 函数的主要内容,如果未能解决你的问题,请参考以下文章
如何使用无服务器框架从另一个 lambda 异步调用 lambda
Tkinter Button按钮组件如何调用一个可以传入参数的函数
Lambda Return Payload botocore.response.StreamingBody对象打印但在变量中为空