У меня есть лямбда-функция, которая срабатывает, когда объект папки - например,
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;
}
};