Предотвращение сбоя триггеров функции AWS Lambda - PullRequest
0 голосов
/ 11 января 2019

У меня есть лямбда-функция, которая срабатывает, когда объект папки - например,

67459e53-20cb-4e7d-8b7a-10e4cd165a44

создается в корневой корзине.

Также в корне находится index.json, индекс содержимого - простой массив этих папок. Например, {folder1, folder2, ..., folderN}.

Каждый раз, когда добавляется объект папки (как выше), функция Lambda срабатывает, получает index.json, добавляет новый объект папки в массив JSON и затем возвращает index.json.

Очевидно, что это createObject событие вызовет такую ​​же лямбда-функцию.

Мой код ниже должен только обрабатывать объект события, если это папка; то есть ключевой объект с / в конце. (Пользователь stackoverflow был достаточно любезен, чтобы помочь мне с этим решением.)

Я тестировал этот код локально с lambda-local, и все выглядит хорошо. Меня беспокоит (страх Божий) , чтобы я мог выполнить ИСКЛЮЧЕНИЕ.

Я изучил лучшие практики Lambda и погуглил на предмет "бесконечных циклов" и тому подобного, но не могу найти способ УБЕДИТЬСЯ, что моя Lambda не будет выполнять больше, скажем, 50 раз в день.

Да, у меня может быть Lambda, которая на самом деле создает папку, и запись в index.json, но эта Lambda является частью эталонного примера AWS Video-on-Demand, и я пока не совсем понимаю.

Два вопроса: Можно ли настроить уведомления в S3 таким образом, чтобы он фильтровал по суффиксу (случайное имя ключа папки с) /, как описано здесь ? И / или как я могу настроить эту лямбду в консоли, чтобы абсолютно предотвратить выполнение безудержного запуска?

// dependencies
var async = require('async');
var AWS = require('aws-sdk');
var util = require('util');

// constants
const VOD_DEST_FOLDER = 'my-triggering-bucket'; //not used bc part of event object
const CONTENT_INDEX_FILENAME = 'index.json';

// get reference to S3 client
var s3 = new AWS.S3();

exports.handler = async (event) => {
  try {
    console.log('Event', JSON.stringify(event));

    // Bucket name.
    const triggerBucket = event.Records[0].s3.bucket.name;

    // New folder key added.
    const newKey = event.Records[0].s3.object.key;

    // Add newKey to content index ONLY if it is a folder object. If any other object
    // is added in the bucket root then it won't result in new write.
    if (newKey.indexOf('/') > -1) {

      // Get existing data.
      let existing = await s3.getObject({
        Bucket: triggerBucket,
        Key: CONTENT_INDEX_FILENAME
      }).promise();

      // Parse JSON object.
      let existingData = JSON.parse(existing.Body);

      // Get the folder name.
      const folderName = newKey.substring(0, newKey.indexOf("/"));

      // Check if we have an array.
      if (!Array.isArray(existingData)) {
        // Create array.
        existingData = [];
      }

      existingData.push(folderName);

      await s3.putObject({
        Bucket: triggerBucket,
        Key: CONTENT_INDEX_FILENAME,
        Body: JSON.stringify(existingData),
        ContentType: 'application/json'
      }).promise();

      console.log('Added new folder name ' + folderName);

      return folderName;

     } else {
         console.log('Not a folder.');
         return 'Ignored';
     }
  }
  catch(err) {
    return err;
  }
};

1 Ответ

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

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

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