Добавить строку в текстовый файл Nodejs в AWS Lambda

Сценарий: текстовый файл snapshot-ids.txt находится в ведре S3. Я пытаюсь создать функцию Lambda, которая запускается ежедневно (Cron), которая будет использовать AWS CLI для создания снимка тома, а затем сохранить этот snapshotId в текстовый файл на S3. В следующий раз, когда будет создан другой моментальный снимок, новый snapshotId будет сохранен в том же текстовом файле на S3. Текстовый файл является заполнителем для snapshotIds, и когда он достигает порогового значения, он удаляет верхние snapshotIds и добавляет новый в конце (канал FIFO).

Для людей, которые не используют AWS lambda, у меня вопрос, какой самый быстрый способ добавить текст в переменную и вернуть новую переменную с новыми строками в ней.

Для тех, кто знает Lambda, это основной код AWS Lambda, который я имею, я использую fs.appendFile, но как мне использовать файл, полученный из s3.getObject(), и в конечном итоге передать его в s3.putObject()?

РЕДАКТИРОВАТЬ: это мой прогресс:

console.log('Loading function');

var aws = require('aws-sdk');
var s3 = new aws.S3({ apiVersion: '2006-03-01' });
var fs = require('fs');

exports.handler = function(event, context) {
    //console.log('Received event:', JSON.stringify(event, null, 2));

    // Get the object from the event and show its content type
    var bucket = event.Records[0].s3.bucket.name;
    var key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
    var params = {
        Bucket: bucket,
        Key: key
    };
    s3.getObject(params, function(err, data) {
        if (err) {
            console.log(err);
            var message = "Error getting object " + key + " from bucket " + bucket +
                ". Make sure they exist and your bucket is in the same region as this function.";
            console.log(message);
            context.fail(message);
        } else {
            // fs.appendFile('snapshot-ids.txt', 'snap-001', function (err) {
            //     if (err) throw err;
            //     console.log('The "data to append" was appended to file!');
            // });
            console.log(params_new);
            console.log('CONTENT TYPE getObject:', data.ContentType);
            // context.succeed(data.Body.toString('ascii'));
        }
    });
    var params_new = {
        Bucket: bucket,
        Key: key,
        Body: 'snap-002'
    };
    s3.putObject(params_new, function(err, data) {
                console.log('put here');
                if (err) {
                    console.log(err);
                    var message = "Error getting object " + key + " from bucket " + bucket +
                        ". Make sure they exist and your bucket is in the same region as this function.";
                    console.log(message);
                    context.fail(message);
                } else {
                    console.log('CONTENT TYPE putObject:', data.ContentType);
                    context.succeed(data.ContentType);
                }
    });
};

1 ответ

Решение

Несколько вещей, которые я заметил с вашим кодом до сих пор...

  1. Ты не можешь позвонить s3.putObject до тех пор s3.getObject закончен, и у вас есть файл с s3.

  2. Вы не имеете дело с файловой системой, так как вы получаете data от s3.getObject,

Имея это в виду, я изменил ваш код (я не пробовал это, но он должен заставить вас двигаться в правильном направлении):

console.log('Loading function');

var aws = require('aws-sdk');
var s3 = new aws.S3({ apiVersion: '2006-03-01' });

exports.handler = function(event, context) {
    //console.log('Received event:', JSON.stringify(event, null, 2));

    // Get the object from the event and show its content type
    var bucket = event.Records[0].s3.bucket.name;
    var key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
    var params = {
        Bucket: bucket,
        Key: key
    };
    s3.getObject(params, function(err, data) {
        if (err) {
            console.log(err);
            var message = "Error getting object " + key + " from bucket " + bucket +
                ". Make sure they exist and your bucket is in the same region as this function.";
            console.log(message);
            context.fail(message);
        } else {
            console.log(params_new);
            console.log('CONTENT TYPE getObject:', data.ContentType);

            // convert body(file contents) to a string so we can append
            var body = data.Body.toString('utf-8');
            // append data
            body += 'snap-001\n';

            var params_new = {
                Bucket: bucket,
                Key: key,
                Body: body
            };
            //NOTE this call is now nested in the s3.getObject call so it doesn't happen until the response comes back
            s3.putObject(params_new, function(err, data) {
                        console.log('put here');
                        if (err) {
                            console.log(err);
                            var message = "Error getting object " + key + " from bucket " + bucket +
                                ". Make sure they exist and your bucket is in the same region as this function.";
                            console.log(message);
                            context.fail(message);
                        } else {
                            console.log('CONTENT TYPE putObject:', data.ContentType);
                            context.succeed(data.ContentType);
                        }
            });

        }
    });

};

Что еще нужно иметь в виду, если у вас одновременно запущено более 1 этой лямбды, то, скорее всего, они будут топать друг друга изменениями. Похоже, вы просто будете планировать это раз в день, поэтому это не должно быть большим делом, но это стоит отметить.

Другие вопросы по тегам