使用Node.JS AWS Lambda调用Python AWS Lambda函数



我不知道这是否与父Lambda是node.js运行时,子Lambda是Python 3.8有关,但我遇到了一些奇怪的行为,我不知道出了什么问题。。。

tldr:只有当父lambda"睡眠"(调用setTimeout(((达100毫秒或更长时间时,才会调用子lambda。

我有两个简单的AWS Lambda函数。一个用JS(node.JS运行时(编写,另一个用Python(3.8(编写。设置很简单。父node.js函数调用子python函数。调用是异步的,父级不必等待子级返回。父级必须是node.js,子级必须是python 3.8。

我的观察结果是,除非父lambda"睡眠"至少100毫秒,否则不会调用子python lambda。我知道这听起来很奇怪,但我不确定我做错了什么,我花了几天时间试图解决这个问题(毫无疑问,这真的很简单…(。

我已经编写了一个"sleep"函数(显示在node.js代码的顶部(,它在从父函数向调用方返回响应之前被调用。我知道.invoke回调中的代码将在父函数返回后调用,这只是为了调试目的。

这是node.js的父Lambda:

var aws = require('aws-sdk')
var lambda = new aws.Lambda()
function sleep(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}  

exports.handler = async (event) => {
const payload = {
message: "Hey there",

}
var params = {
FunctionName: 'ChildLambda', // the lambda function we are going to invoke
InvocationType: 'Event', // RequestResponse is sync, Event Async
LogType: 'Tail',
Payload: JSON.stringify(payload)
};
lambda.invoke(params, function(err, data) {
console.log("Invoked Lambda...")
if (err) {
console.log(err)
} else if (data) {
console.log('Data: ', data)
}
console.log("Lambda done")

})
// await sleep(100)
const response = { 
"isBase64Encoded": false,
"statusCode": 202,
"headers": {},
"body": "HEY FROM LAMBDA"
}
return response;
};

这是Python的子Lambda:

import requests
import json
def main(event, context):
print("IN THE SECOND LAMBDA")
response = {
"statusCode": 200,
"headers": {"my_header": "my_value"},
"body": "hello from second lambda",
"isBase64Encoded": False,
}
return response

如果从父函数中删除sleep(100)调用,则不会调用子函数。我知道这一点是因为CloudWatch日志中没有显示任何内容。如果将传递给sleep((的参数设置为小于100毫秒,则不会调用子lambda。异步或同步调用子函数(通过在父函数的params中将"Event"替换为"RequestResponse"不会改变任何内容,以上仍然成立

这种奇怪行为的原因是什么?我做错了什么?

EDIT@jellycsc链接到调用invoke命令的替代方法:

var invoke  = lambda.invoke(params).promise()
invoke.then(function(data) {
console.log('Success');
}).catch(function(err) {
console.log(err);
});

不幸的是,这并不能解决问题,只有当计时器设置为100毫秒或更长时间时,才会调用invoke命令。

只需等待invoke操作完成,然后完成lambda函数。

exports.handler = async (event) => {
const payload = {
message: "Hey there",
}
var params = {
FunctionName: 'ChildLambda', // the lambda function we are going to invoke
InvocationType: 'Event', // RequestResponse -  to get response from ChildLambda, Event - don't care the response (or error...)
LogType: 'Tail',
Payload: JSON.stringify(payload)
};
try {
console.log("Invoked Lambda...")
const data = await lambda.invoke(params).promise() // wait until invoke successfully
console.log('Data: ', data) // data maybe empty - {} when InvocationType is Event
console.log("Lambda done")

return {
"isBase64Encoded": false,
"statusCode": 202,
"headers": {},
"body": "HEY FROM LAMBDA"
}
} catch (error) {
// handle error
console.log("Error", error);
return {
"isBase64Encoded": false,
"statusCode": 500, // return error response
"headers": {},
"body": error.message
}
}
};

最新更新