Почему мой код может выполняться в стандартном Node.js файле, а не в AWS лямбда-функции? - PullRequest
3 голосов
/ 01 марта 2020

Я пытаюсь создать лямбда-функцию, в которой функция вызывает две команды в экземпляре ec2. Когда у меня возникли проблемы с запуском этого кода в лямбда-функции, я удалил код из метода exports.handler () и запустил код в отдельном файле node.js в том же экземпляре ec2, и я смог заставить код работать , Я выполнил команду 'node app. js'.

exports.handler = async (event) => {

  const AWS = require('aws-sdk')
  AWS.config.update({region:'us-east-1'});

  var ssm = new AWS.SSM();

  var params = {
  DocumentName: 'AWS-RunShellScript', /* required */
  InstanceIds: ['i-xxxxxxxxxxxxxxxx'],
  Parameters: {
    'commands': [
      'mkdir /home/ec2-user/testDirectory',
      'php /home/ec2-user/helloWorld.php'
      /* more items */
    ],
    /* '<ParameterName>': ... */
  }
};
ssm.sendCommand(params, function(err, data) {
  if (err) {
    console.log("ERROR!");
    console.log(err, err.stack); // an error occurred
  }
  else {
  console.log("SUCCESS!");
  console.log(data);
  }            // successful response
});


  const response = {
    statusCode: 200,
    ssm: ssm
  };

  return response;
}; 

. Я подумал, что это могла быть проблема, связанная с разрешениями, но лямбда-код отличается от того же vp c, что и ec2. экземпляр находится в.

Ответы [ 2 ]

5 голосов
/ 01 марта 2020

Вы пытаетесь объединить async / await с обратными вызовами. Это не будет работать в лямбда-коде AWS Лямбда-функции в Node.js. Причина, по которой он работает локально или на сервере узлов, заключается в том, что сервер все еще работает, когда функция завершается, поэтому обратный вызов все равно происходит. В лямбде процесс узла прекращается, как только выходит лямбда, если вы используете async (или Promises), поэтому обратный вызов не может быть запущен.

0 голосов
/ 03 марта 2020

Решение, основанное на ответе Джейсона:

const AWS = require('aws-sdk');
const ssm = new AWS.SSM();


exports.handler = async (event,context) => {

AWS.config.update({region:'us-east-1'});
  const params = {
  DocumentName: 'AWS-RunShellScript', /* required */
  InstanceIds: ['i-xxxxxxxxxxxxxx'],
  Parameters: {
    'commands': [
      'mkdir /home/ec2-user/testDirectory',
      'php /home/ec2-user/helloWorld.php'
      /* more items */
    ],
    /* '<ParameterName>': ... */
  }
};


  const ssmPromise = new Promise ((resolve, reject) => {
    ssm.sendCommand(params, function(err, data) {
  if (err) {
    console.log("ERROR!");
    console.log(err, err.stack); // an error occurred
    context.fail(err);
  }
  else {
  console.log("SUCCESS!");
  console.log(data);
  context.succeed("Process Complete!");
  }            // successful response
  });
});


console.log(ssmPromise);   


  const response = {
    statusCode: 200,
    ssm: ssm
  };

  return response;
};
...