python - 如何从另一个 Node.js Lambda 函数调用 AWS Python Lambda 函数
问题描述
我是 JavaScript 和 AWS 的新手。我正在努力将 Python AWS Lambda 函数连接到 Node.js AWS Lambda 函数。
我想从主 Lambda 函数(假设是父 lambda)的中间行调用一个单独的 Lambda 函数(假设是子 lambda),并使用父 lambda 中子 lambda 的返回值。
我的子 lambda 在 Python 3.6 中实现,父 lambda 在 Node.js 12.x 中实现。我想停止执行父 lambda,直到子 lambda 返回它的值。
但似乎父 lambda 中的其余代码行在完成子 lambda 的执行之前执行。
我使用以下链接为父 lambda 设置了所需的策略。
https://www.sqlshack.com/calling-an-aws-lambda-function-from-another-lambda-function/
我有一个分配给变量“img”的数组。如果满足条件,我需要通过将 Payload 作为“img”数组传递来调用子 lambda,以对该数组进行一些额外的计算并将其返回给父 lambda。最后用返回的数组替换“img”变量。
下面是我在父 lambda 中用于调用子 lambda 的代码块。请注意,“returnArr”是从子 lambda 返回的数组。
const AWS = require('aws-sdk');
AWS.config.region = 'ap-southeast-2';
var lambda = new AWS.Lambda();
exports.handler = async (event, ctx, callback) => {
//////////code lines for other operations////////////
let img = [[[2,3,5],[6,7,8]],[[12,13,15],[16,17,18]]];
let flag=0;
if(condition){
console.log("BEGIN");
var params = {
FunctionName: 'childFunction', // child lambda function written in Pyton 3.6
InvocationType: 'RequestResponse',
Payload: JSON.stringify({ "sendImg" : img})
};
lambda.invoke(params, function(err, data) {
console.log("SENT");
if (err) {
console.log(err);
} else {
//console.log('Lambda_B said '+ data.Payload);
let body1;
flag = 1;
if(typeof(data.Payload) == 'object') {
body1 = data.Payload;
} else {
body1 = JSON.parse(data.Payload);
}
img = body1["returnArray"];
console.log("Modified img array inside: ",img);
}
})
console.log("DONE");
}
console.log("flag : "+flag);
console.log("Modified img array outside: "+img);
////////Rest of the code///////////////////////
};
我得到如下输出:
BEGIN
DONE
标志:0
修改外的 img 数组:[[[2,3,5],[6,7,8]],[[12,13,15],[16,17,18]]]
SENT
修改后的 img里面的数组:[[[23,31,54],[63,71,86]],[[12,133,115],[162,117,18]]]
根据输出,您可以看到 if 条件之外的 2 行代码在子 lambda 返回修改后的数组之前已经执行。
如果条件未修改,则外部“img”数组,但修改了 if 条件内部的“img”数组。
我想停止执行父 lambda,直到子 lambda 返回它的数组。
我认为这种情况正在发生,因为我没有太多 NodeJS 知识。
有人可以告诉我哪里出错了吗?
解决方案
父 lambda 在完成子 lambda 执行之前执行
您正在使用async handler,因此您的函数在它有机会调用另一个函数之前完成。
为了克服这个问题,您可以将代码包装在处理程序中new Promise
,如AWS 文档中所示。
推荐阅读
- c# - nunit3-console 运行期间出现 FileNotFoundException
- time-complexity - 证明或反驳时间复杂度
- c# - 如何修复:“在 MS SQL Server 重新启动 alipne .net core 2.2.5 容器后,使用它的容器有一个 CLOSE_WAIT tcp 连接 - dotnet 的 CPU 上升”
- java - 无法访问类 com.sun.javafx.scene.control.skin.resources.ControlResources(在模块 javafx.controls 中)
- gitlab-ci - 如何在 gitlab CI 管道期间在构建主机(不是 docker 容器)上运行脚本
- json - 使用 jq Azure DevOps Bash 任务替换 json 文件中的值会添加随机数据
- sql - 如何从当月获取前 12 个月的最后一天数据
- java - 如何在 apache camel 中正确使用直接组件?
- wcf - WCF 服务值错误不在预期范围内
- amazon-web-services - 如何使用 jenkins 构建并在 aws 上部署?