Лямбда - Nodejs SDK s3.upload () не запускается - PullRequest
0 голосов
/ 07 января 2020

Весь день отлаживал и до сих пор не могу понять, почему мой метод s3.upload() не вызывается внутри моей лямбда-функции. Кто-то, пожалуйста, помогите

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

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


        var message_body = JSON.parse(event.body);

        let encodedImage = message_body.base64;
        let decodedImage = Buffer.from(encodedImage, 'base64');

        var params = {
            "Body": decodedImage,
            "Bucket": "testbucket1-bucket",
            "Key": "testkey1.jpg"  
        };

        console.log("function triggered. ");


        s3.upload(params).promise()
      .then(data => {
        console.log('complete:PUT Object',data);
         callback(null, data);
      })
      .catch(err => {
        console.log('failure:PUT Object', err);
         callback(err);
      });

};

В Cloudwatch, нет ошибок во всей функции. Я удостоверился, что функция имеет доступ к s3, корзина опубликована c, и имя корзины правильное много раз. Это просто время ожидания через 30 секунд. Ни один из методов обратного вызова s3.upload() не запускается, и я не могу до конца жизни понять, почему.

Идентифицированная проблема

.... I просто выяснил проблему, потратив столько времени. У моей лямбда-функции был VP C, который не предоставлял доступ к S3 .... Теперь функция не работает по тайм-ауту, и загрузка наконец работает.

Ответы [ 2 ]

1 голос
/ 07 января 2020

лямбда у меня отлично работает.

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

exports.handler = async (event) => {
    // TODO implement
    var userData = {};

    console.log('1')
    return new Promise((resolve, reject) => {

        console.log('2 type of body: ', typeof event.body);
        const body = JSON.parse(event.body)
        console.log('2.1 body.base64: ', body.base64);

        let decodedImage = Buffer.from(body.base64, 'base64');
        var params = {
            "Body": decodedImage,
            "Bucket": "stackoverflow-help",
            "Key": "testkey1.jpg"  
        };

        console.log('3')

        s3.upload(params, function(err, data){
            console.log('4')

           if(err){
               console.log("Upload Failed");
              throw err;
           }else{
               console.log("Upload worked");
              let response = "event_photo";
              userData[response] = "SUCCESS RECIEVING EVENT";
              var jsonString = JSON.stringify(userData);
              resolve({statusCode:200, body: jsonString});
           }
        });
    });
};

Пожалуйста, проверьте, охватили ли вы ниже.

  1. Создайте лямбду
  2. Дайте лямбда-разрешению на запись в s3
  3. создайте конечную точку шлюза API с помощью POST или PUT с lambda proxy integration
  4. , настроив шлюз API для вызова лямбды

Тестирование

  • при тестировании шлюза API с консоли aws. Для тела запроса необходимо указать закодированную в base64 строку изображения

  • при тестировании от почтальона, убедитесь, что вы выбрали raw под Body и скопировали и вставили закодированную в base64 строку изображения

, надеюсь, это поможет.

0 голосов
/ 07 января 2020

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

s3.config.update({
    region: 'ap-southeast-2',
    accessKeyId: process.env.ACCESS_KEY,
    secretAccessKey: process.env.SECRET_KEY
});

В противном случае вы выполняете обещание загрузки s3, и вот асинхронный / ожидающий способ сделать это:

try {
    await s3.headObject(params).promise();
    console.log("File found");
    try {
        await s3.upload(params).promise();
        console.log("uploaded successfully");
    }
    catch (error) {
        console.log(error);
        res.status(500).send(error.message);
    }
}
catch (error) {
    console.log(error);
    res.status(500).send(error.message);
} 

Дайте мне знать, если это работает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...