Сообщение об ошибке лямбда-функции ":" Невозможно прочитать свойство bucket из неопределенного значения. - PullRequest
0 голосов
/ 29 мая 2020

У меня есть лямбда-функция, которая запускается всякий раз, когда что-то сохраняется в моем ведре s3,

цель - прочитать метаданные файла JSON и вставить строки в таблицу DynamoDB;

например, период обучения начинается 1 июня и заканчивается 8 июня, а тренировочные дни - понедельник, среда и пятница, поэтому лямбда должна вставлять 4 строки (1, 3, 5, 8 июня)

пока вставлена ​​только одна строка, а затем возникает ошибка и происходит сбой

Функция запускается хорошо, но это сообщение об ошибке иногда возникает.

{
    "errorType": "TypeError",
    "errorMessage": "Cannot read property 'bucket' of undefined",
    "stack": [
        "TypeError: Cannot read property 'bucket' of undefined",
        "    at Runtime.exports.handler (/var/task/index.js:26:44)",
        "    at Runtime.handleOnce (/var/runtime/Runtime.js:66:25)"
    ]
}

вот моя функция

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

let apiSportmTrainingTableName = process.env.API_SPORTM_TRAININGTABLE_NAME
let dynamodb = new AWS.DynamoDB.DocumentClient();


exports.handler =  async (event, context) => {
  //eslint-disable-line
  const Bucket = await event.Records[0].s3.bucket.name;

  const Key = await event.Records[0].s3.object.key;
  const objectHead = await s3.headObject({Bucket, Key}).promise();

  let start = moment(new Date(objectHead.Metadata.trainingstart), "YYYY-MM-DD");
  let end = moment(new Date(objectHead.Metadata.trainingend), "YYYY-MM-DD");
  let days = JSON.parse("[" + objectHead.Metadata.trainingdays + "]");

  try {
    for (let m = moment(start); m.diff(end, 'days') <= 0; m.add(1, 'days')) {

      for (const e of days) {

        if (moment(m).day() === e) {
          let params = {
            TableName: apiSportmTrainingTableName,
            Item: {
              "id": uuid.v1(),
              "trainingDate": moment(m).format('YYYY-MM-DD'),
              "statut": true,
              "athleteCategory": objectHead.Metadata.trainingmembercategory,
              "trainingTime": objectHead.Metadata.trainingtime
            }
          };
          return await dynamodb.put(params).promise();
        }
      }
    }
  } catch (err) {
    console.error('Error', err);
    return;
  }
  context.done(null, 'Successfully processed DynamoDB record'); // SUCCESS with message
};

в журналах событий это выглядит так

Records: [
    {
      eventVersion: '2.1',
      eventSource: 'aws:s3',
      awsRegion: 'us-east-1',
      eventTime: '2020-05-29T18:34:53.250Z',
      eventName: 'ObjectCreated:Put',
      userIdentity: [Object],
      requestParameters: [Object],
      responseElements: [Object],
      s3: [Object]
    }
  ]
}
```

that a part of logs it fails and then works and then it keeps trying and fail




[logs][1]


  [1]: https://i.stack.imgur.com/Sj5C7.png

1 Ответ

1 голос
/ 29 мая 2020

Вы используете return после вставки данных в DynamoDB:

return await dynamodb.put(params).promise();

Это возвращает результат операций DynamoDB как результат функции Lambda, которая завершила выполнение. Это объясняет, почему в DynamoDB вставляется только одна запись. Я бы попытался удалить return и посмотреть, устранит ли это также ошибку (лучшее предположение с моей стороны: возвращаемое значение каким-то образом вызывает другое выполнение с ним, но на этот раз отсутствует событие S3, поэтому event.Records[0].s3 будет неопределенным ).

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