【发布时间】:2019-06-10 22:45:01
【问题描述】:
我正在尝试捕获从用 NodeJS 编写的 AWS Lambda 启动的外部程序的输出。下面的完整示例代码。任何测试事件都可以,因为它并没有真正使用。
exports.handler = async (event) => {
console.log ("Entering lambda" + JSON.stringify(event))
var spawn = require('child_process').spawnSync;
child_process = spawn ('aws', [' --version'], {
stdio: 'inherit',
stderr: 'inherit',
shell: true
})
console.log ("done");
const response = {
statusCode: 200,
body: JSON.stringify('done'),
};
return response;
};
当我运行它时,我得到以下输出(为简洁起见,我删除了测试事件详细信息,因为它无关紧要)。
我没有看到的是我预期的 aws --version 命令的结果(我正在使用它来测试 AWS CLI 的正确调用,但任何 Linux 命令都可以)。代码确实 同步执行,因为如果我将调用替换为child_process = spawn ('sleep', ['1'], {,lambda 的执行时间会增长到 1117.85 毫秒,因此会发生一秒睡眠。但是执行日志中没有捕获任何内容。
START RequestId: 0c1287e2-d2ee-4436-a577-bc8ec3608120 Version: $LATEST
2019-01-16T19:12:45.130Z 0c1287e2-d2ee-4436-a577-bc8ec3608120 Entering lambda {...}
2019-01-16T19:12:45.143Z 0c1287e2-d2ee-4436-a577-bc8ec3608120 done
END RequestId: 0c1287e2-d2ee-4436-a577-bc8ec3608120
REPORT RequestId: 0c1287e2-d2ee-4436-a577-bc8ec3608120 Duration: 13.29 ms Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 20 MB
我做错了吗?或者有没有其他方法可以捕获用 NodeJS 编写的 Lambda 的输出(状态码、stdio、stderr)?
【问题讨论】:
-
如果你在 Lambda 之外运行它,它可以工作吗?
-
您提到了一秒钟的睡眠,但您发布的代码示例中没有这样的事情。同样在代码中,您使用的是
spawnSync而不是异步版本spawn,但您提到“代码/does/ 同步执行”。那么你想使用哪一个? -
@jarmod:是的,我在 Windows 上尝试使用生成的命令为
spawn ('date', ['/t'],我可以看到输出。 -
@MilanCermak:关于
sleep,我的错,那行仍然引用了原始代码,我现在修好了。另外,我正在使用spawnSync,就像在发布的代码中一样。我只是确认代码已执行并且按预期同步执行,以排除它根本没有执行的情况。 -
我不确定 awscli 在 Lambda 环境中是否可用。还可能值得一看 lambda 项目 (github.com/alestic/lambdash),它使用 child_process 和 exec 在 Lambda 中运行任意命令。
标签: node.js amazon-web-services aws-lambda spawn