node.js - AWS Lambda 函数与 nodejs 到 ssh 到 ec2 并运行命令,在测试中给出 200 成功但什么也不做
问题描述
我有一个用 node.js 8.10 编写的 index.js,其中上传了必要的节点模块,并且 pem 文件位于 aws lambda 函数中。lambda 函数需要 ssh 到 ec2 实例并在其中运行 python 脚本(在目录中创建另一个文件)。
在运行测试时,我获得了 200 次成功,但我没有看到新文件(脚本的预期输出)。我正在使用 simple-ssh 来运行 ec2 脚本。
'use strict';
console.log('Loading lambda function');
exports.handler = function(event, context, callback) {
let bag_size = event.bag_size === undefined ? 10 : event.bag_size;
var SSH = require('simple-ssh');
var fs = require('fs');
var ssh = new SSH({
host: '##############',
user: 'ubuntu',
key: fs.readFileSync('key.pem'),
passphrase: '##########'
//pass: 'password'
});
var pythonCommand = 'python lambda_test.py ' + bag_size;
ssh.exec('cd /home/ubuntu/***/***/***').exec('ls -al', {
out: function(stdout) {
console.log('ls -al got:');
console.log(stdout);
console.log('now launching command');
console.log(pythonCommand);
}
}).exec('' + pythonCommand, {
out: console.log.bind(console),
exit: function(code, stdout, stderr) {
console.log('operation exited with code: ' + code);
console.log('STDOUT from EC2:\n' + stdout);
console.log('STDERR from EC2:\n' + stderr);
context.succeed('Success!');
}
}).start();
var response = {
statusCode: 200,
headers: {
"Access-Control-Allow-Credentials" : true, // Required for cookies, authorization headers with HTTPS
"Access-Control-Allow-Origin":"*",
"Access-Control-Allow-Methods":"POST,GET,OPTIONS",
"Access-Control-Allow-Headers":"Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token",
"Content-Type":"application/json"
},
body: JSON.stringify({ "message": "Success" })
};
// Return response to the caller
callback(null, response);
};
CloudWatch 的日志输出:
START RequestId: 247cd************************480b Version: $LATEST
END RequestId: 247cd************************480b
REPORT RequestId: 247247cd************************5b480b0b Duration: 10962.61 ms Billed Duration: 11000 ms Memory Size: 128 MB Max Memory Used: 49 MB
我不确定我哪里出错了。请帮忙!
解决方案
看起来您在exec
函数完成之前调用了处理程序的回调,因为它继续异步运行,这导致 lambda 终止。
确保仅在完成后调用回调(您可以通过将回调参数传递给start
函数来实现)。
检查https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html。
推荐阅读
- javascript - Firebase 数据库规则 - 只允许未经身份验证的用户过滤查询
- arrays - 通过溢出中断实现循环边界检查
- c# - 是否有可能知道 RSA 的公钥而你只知道私钥
- javascript - 如何对第一个值(字符串)进行分组并添加相同日期的值?
- python - 如何在这个程序中实现范围函数?
- macos - 有没有关于`NSEventTypeSystemDefined``NSEvent`的文档?
- tensorflow - 在现实世界的项目中使用迁移学习是个好主意吗?
- python - 有没有办法不在python中打印换行符?
- android - 如何从一个频道中获取所有 youtube 视频?
- c - 使用 AES 新指令集解密的错误结果