Lambda SDK не вызывает ответ - PullRequest
0 голосов
/ 01 марта 2019

Я пытаюсь сделать довольно простой "привет мир" в AWS Lambda.Я попробовал несколько сервисов, которые только вызывают AWS SDK и просто пытаются прочитать.Мой обратный вызов никогда не вызывается.Я должен что-то упустить.Любая помощь приветствуется!

var AWS = require("aws-sdk");

exports.handler = async (event) => {
    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };

    var s3 = new AWS.S3(); // confirmed this is not null
    s3.listBuckets({}, function(err, data) {
           // never reaches here!
           if (err) console.log(err, err.stack); // an error occurred
            else     console.log(data);           // successful response
    });

    return response;
};

Я создал роль, которую использует эта лямбда, которая имеет доступ к S3.: -)

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Кажется, что поскольку я выбрал среду выполнения Node 8.x, мне нужно было использовать одну из этих асинхронных конструкций.Это сработало ...

let AWS = require('aws-sdk');
let s3 = new AWS.S3();

exports.handler = async (event) => {
    return await s3.listBuckets().promise() ;
};
0 голосов
/ 01 марта 2019

Это проблема синхронизации.

Ваш код return response выполняется перед вызовом обратного вызова.

вам нужно будет поместить свой оператор возврата в ваш обратный вызов или использовать async / await

Возврат внутри вашего обратного вызова:

var AWS = require("aws-sdk");

exports.handler = async (event) => {
  const response = {
    statusCode: 200,
    body: JSON.stringify('Hello from Lambda!'),
  };

  var s3 = new AWS.S3();
  s3.listBuckets({}, function (err, data) {
    if (err) {
      console.log(err, err.stack);
      return {
        statusCode: 500,
        message: 'some error'
      }
    }
    return response
  });
}

Использование async / await:

var AWS = require("aws-sdk");

exports.handler = async (event) => {
  const response = {
    statusCode: 200
  };

  var s3 = new AWS.S3();
  await s3.listBuckets().promise();
  return response;
}

Я бы пошел с асинхронной / awaitподход, поскольку это намного чище и более читабельно.С обещаниями также легче работать, чем с обратными вызовами.

РЕДАКТИРОВАТЬ : ОП утверждал, что это не сработало.Поэтому я решил проверить это самостоятельно.Вышеприведенный код работает с очень небольшим изменением только для добавления перечисленных сегментов к ответу.Вот окончательный код:

var AWS = require("aws-sdk");

exports.handler = async (event) => {
  const response = {
    statusCode: 200
  };

  var s3 = new AWS.S3();
  const buckets = await s3.listBuckets().promise();
  response.body = JSON.stringify(buckets);
  return response;
}

А вот вывод в журналах CloudWatch:

enter image description here

...