Почему я не могу загрузить файл на s3 с помощью функции Lambda? - PullRequest
0 голосов
/ 23 января 2019

Я создаю лямбда-функцию, которую я привязал к шлюзу API, и мой код, похоже, не запускает событие s3.putObject.

Я могу без проблем console.log перевести переменные AWS, s3, params, но при попытке использовать функцию putObject ничего не срабатывает ... остальная часть моего кода просто запускается.

Кто-нибудь знает, что мне нужно делать?

Я установил регион на своем экземпляре s3, версия API Вышел из моих переменных Проверены журналы cloudwatch на наличие изменений

exports.handler = async (event) => {


const AWS = require('aws-sdk');
const s3 = new AWS.S3({region: "us-east-1", apiVersion: '2006-03-01'});
const params = {
Bucket: bucketName,
Key: 'file.txt',
ContentType: 'text/plain',
Body: JSON.stringify(event)};

// The below doesn't seem to run or log out
s3.putObject(params).promise().then(data => {
    console.log('complete:PUT Object',data);
    })
  .catch(err => {
    console.log('failure:PUT Object', err);
  });

 return JSON.stringify(event);

    };

Я ожидаю, что смогу зайти в мое ведро s3 и увидеть загруженный файл. Вместо этого пусто

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Поскольку вы используете exports.handler = async (event) в своем коде, вы используете async / await (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function).

В асинхронной функции вы можете использовать синтаксис await, чтобы дать обещание синхронному вызову:

try {
  const res = await s3.upload(params, options).promise();
  console.log('complete:', res);
} catch(err) {
  console.log('error:', err);
}

Это современный подход к обратным вызовам, и он последовательный (без сочетания обратных вызовов и асинхронных функций).

0 голосов
/ 24 января 2019

Вы не ждете, пока обещание вернется, прежде чем сказать лямбде, чтобы она вернула результат Обещания хороши, если у вас есть куча цепочек, но в этом простом случае обратного вызова должно быть достаточно.

Также, если вы используете асинхронный режим, вам нужно убедиться, что время выполнения равно 8.10 или выше.

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

const AWS = require('aws-sdk');
const s3 = new AWS.S3({region: "us-east-1", apiVersion: '2006-03-01'});
const params = {
Bucket: bucketName,
Key: 'file.txt',
ContentType: 'text/plain',
Body: JSON.stringify(event)};

console.log(JSON.stringify(event));

// The below doesn't seem to run or log out
s3.upload(params, options, function(err, data) {
  console.log(err, data);
  if(!err) { 
    callback(null, "All Good");
   }
  else {
    callback(err);
  }
 });
};

Немного больше чтения по объекту контекста. https://docs.aws.amazon.com/lambda/latest/dg/nodejs-prog-model-handler.html

...