Сбой записи в DynamoDB с использованием лямбда-функции с триггером S3 - PullRequest
0 голосов
/ 15 ноября 2018

Я пытаюсь написать лямбда-функцию, которая запускается всякий раз, когда новое изображение записывается в корзину S3.Триггер уже настроен с использованием правильного сегмента S3, так что я знаю, что это не проблема.

Сама лямбда-функция имеет роли s3: GetObject и DynamodB. * (Которые должны быть полными правами доступа для записи DynamoDB).

Цель здесь - просто записать в таблицу, что я 'Вы уже создали с именем 'art' и вставили значение первичного ключа (imageTitle), которое я пытаюсь получить в var imageName.Затем я хочу назначить этому ключу атрибут, который является URL-адресом этого изображения, которое я храню в var url.

Это просто простое упражнение, которое я пытаюсь выполнить, чтобыможет перейти к более сложной записи в БД.Но на данный момент я ничего не записываю в таблицу art, хотя я добавляю новые объекты в корзину S3, которая запускает триггер.Возможно ли, что лямбда-функция не развернута?Я написал это прямо во встроенном редакторе Lambda Console и сохранил.

Вот код:

const AWS = require('aws-sdk');
const docClient = new AWS.DynamoDB.DocumentClient({region: 'us-east-1'});
const s3 = new AWS.S3();

exports.handler = async (event, context, callback) => {
    //var sourceBucket = event.Records[0].s3.bucket.name;
    var sourceKey = event.Records[0].s3.object.key;
    var imageName = sourceKey.stringify;

    //generate imageURL
    var url = "https://s3.amazonaws.com/myapp-20181030214040-deployment/public/" + imageName;

    var params = {
        TableName : 'art',
        Item: {
            imageTitle: imageName,
            imageURL: url
        }
    };
    docClient.put(params, function(err, data) {
       if (err) console.log(err);
       else console.log(data);
    });
};

1 Ответ

0 голосов
/ 15 ноября 2018

Проблема здесь в том, что вы используете асинхронную лямбду, но не возвращаете ничего ожидаемого. Это означает, что ваша лямбда завершает работу перед отправкой операции docClient.put.

С помощью обработчика async вам нужно ждать и возвращать, например, вы можете изменить этот фрагмент на:

const data = await docClient.put(params).promise();
return data;

Или вместо этого вы можете использовать подход callback (обратите внимание, что подпись обработчика больше не содержит async):

exports.handler = (event, context, callback) => {
  // ... the rest of the code as was ...
  docClient.put(params, function(err, data) {
    if (err) {
      console.log(err);
      callback(err); // return 'lambda invoke failed because of the error' - will cause s3 to retry three times.
    } else {
      console.log(data);
      callback(null, data); // return 'nothing failed'; n.b. the s3 trigger ignores whatever you return.
    }
  });
};
...