首页 > 解决方案 > 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  

我不确定我哪里出错了。请帮忙!

标签: node.jsamazon-web-servicesamazon-ec2aws-lambda

解决方案


看起来您在exec函数完成之前调用了处理程序的回调,因为它继续异步运行,这导致 lambda 终止。

确保仅在完成后调用回调(您可以通过将回调参数传递给start函数来实现)。

检查https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html


推荐阅读