防止失控的AWS Lambda函数触发器

时间:2019-01-11 01:51:41

标签: javascript node.js amazon-web-services aws-lambda

我有一个Lambda函数,当文件夹对象出现时会触发该函数,例如

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

在根存储桶中创建。

在根目录中也是index.json,即内容索引-这些文件夹的简单数组。例如,{folder1,folder2,...,folderN}。

每次添加文件夹对象(如上)时,Lambda函数都会触发,获取index.json,将新的文件夹对象添加到JSON数组,然后放回index.json

很明显,此createObject事件将触发相同 Lambda函数。

下面的我的代码(如果是文件夹)应该处理事件对象;即结尾处带有/的键对象。 (stackoverflow用户很友好,可以为我提供此解决方案。)

我已经用lambda-local在本地测试了此代码,一切看起来都不错。我担心的是(敬畏上帝),我可能会遭受RUNAWAY执行。

我已经搜索了Lambda最佳实践,并搜索了“无限循环”之类的内容,但是找不到确保我的Lambda每天执行不超过50次的方法。

是的,我可以让实际上创建该文件夹的Lambda也写入index.json,但是Lambda是AWS Video-on-Demand参考示例的一部分,但我还不太了解。 / p>

两个问题:我可以在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; } }; 过滤(随机文件夹键名带有a) here?和/或如何在控制台中配置此Lambda以完全防止执行失控?

http://localhost:44389

1 个答案:

答案 0 :(得分:0)

您可以配置S3 notifications with key name filtering。这是有关如何在网络控制台中进行操作的step by step guide。我认为,如果将""" MAIN LOOP """ play_again = "yes" while play_again == "yes" or play_again == "y": a() # user makes a choice choice = choose_ans() check_ans_a(choice) if choice == "1" # player dies play_again = input('Play again?\n' '(y)es ') continue # restarts loop b() choice = choose_ans() check_ans_b(choice) 后缀过滤器添加到触发Lambda的通知中,您将实现目标。