создание корзины s3 и папок внутри нее с использованием функции node js in aws lambda - PullRequest
0 голосов
/ 17 февраля 2020

Я новичок в Node js и AWS. Я пытаюсь создать корзину в S3, используя node js в лямбда-функции. Следовательно, я пытаюсь создать папки внутри этой корзины S3.

Я следил за всеми ранее отвеченными вопросами и пробовал разные итерации кода, но ни одна из них, похоже, не работает. Ниже приведен мой код, который выполняется без каких-либо проблем, но корзина и папки не создаются.

const AWS = require('aws-sdk');

let s3Client = new AWS.S3({
  accessKeyId: '<access_key_id>',
  secretAccessKey: '<secret_access_key>'
});

var params = {
  Bucket : 'pshycology06'
};

exports.handler = async (event, context, callback) => {

// call spaces to create the bucket
    s3Client.createBucket(params, function(err, data) {
      if (err) {
        console.log("\r\n[ERROR] : ", err);
      } else {
        console.log("\r\n[SUCCESS] : data = ",data);
      }
    });
};

Код для создания папок внутри функции Lambda следующий:

var AWS = require('aws-sdk');
AWS.config.region = 'us-east-1';
var s3Client = new AWS.S3({apiVersion: '2006-03-01'});

exports.handler = async (event, context) => {

    let params1 = { Bucket: 'travasko', Key: '2/dir1/dir2', Body:'body does not matter' };

    s3Client.putObject(params1, function (err, data) {
        if (err) {
            console.log("Error creating the folder: ", err);
        } else {
            console.log("Successfully created a folder on S3");
        }
    });

Они оба не работают. Я прочитал много документов по этому вопросу и ответы на них ранее, но ни один из них не работает для меня.

Функция лямбда имеет время ожидания 1 минуту. Он имеет следующие политики для роли IAM: 1. AmazonRDSFullAccess 2. AmazonS3FullAccess 3. AWSLambdaVPCExecutionRole

Группа безопасности VP C является группой по умолчанию.

Кроме того, когда я пытаюсь создать то же самое ведро, используя следующую команду AWS CLI, оно создает это ведро.

aws s3api create-bucket --bucket psychology06 --region us-east-1

Я не уверен, где я делаю ошибка.

Ответы [ 4 ]

0 голосов
/ 17 февраля 2020

Поскольку вы новичок, всегда пробуйте aws cli (не рекомендуется), а затем выполняйте поиск эквивалентной функции sdk при реализации. Поскольку (ваш код) является asyn c, он не будет ждать обратного вызова. Функция выполняется, поэтому вы можете попробовать что-то вроде ниже. (Это не реальное решение, оно просто говорит, как ждать, пока обратный вызов сделает свою работу.)

    'use strict'

    var AWS = require('aws-sdk');
    AWS.config.region = 'us-east-1';
    var s3Client = new AWS.S3({ apiVersion: '2006-03-01' });

    exports.handler = async (event, context) => {
        let params1 = { Bucket: 'travasko', Key: '2/dir1/dir2', Body: 'body does not matter' };
        try {
            let obj = await something(params1);
            callback(null, obj);
        }
        catch (err) {
            callback('error', err)
        }
    }

    async function something(params1) {
        return new Promise(async (resolve, reject) => {
            await s3Client.putObject(params1, function (err, data) {
                if (err) {
                    console.log('Error creating the folder:', err);
                    reject('error during putObject');
                } else {
                    console.log('success' + JSON.stringify(data));
                    resolve('success');
                }
            });
        });
    }

К вашему вопросу в комментариях: Привет Винит, позвольте мне дать вам немного предыстории, вопрос, который вы задали, очень общий c. Во-первых, VP C - это то, что вы создаете, где ваша организация будет иметь частные и публичные c подсети, которые используются для запуска вашей ec2 или любых размещенных служб (неуправляемых служб aws). Но поскольку лямбда является управляемым сервисом, он работает в aws vp c, они обычно берут ваш код и лямбда-конфигурации и исполняют код. Теперь перейдем к вашему вопросу, если мы добавим vp c в ваши лямбда-конфигурации (только если ваш Лямбда должна использовать сервисы, размещенные в вашем vp c, иначе не использовать ее), тогда как мы обсуждали, что лямбда работает в aws vp c, поэтому при холодном запуске она создала ENI (воспринимайте это как elasti c IP) и пытается связаться с вашим VP C. До переизобретения ENI был создан для каждой лямбды, поэтому для первого времени потребовалось время, и лямбда использовалась для тайм-аута, даже если ваше выполнение занимает меньше времени. Теперь после переизобретения EIP создаются за su bnet для каждой группы безопасности. Итак, теперь перейдем к вашему вопросу, когда вы подключили vp c, если лямбда-выполнение занимает больше времени или не работает должным образом, тогда вы должны увидеть, как настроен ваш vp c (конфиги, маршруты, подсети) и очень трудно ответить, так как задействовано так много параметров, если мы не отладим. Так что короткий ответ не прикрепляйте vp c, если вашей функции (коду) не нужно общаться ни с одним из ваших собственных управляемых экземпляров в vp c (обычно это частная подсеть) et c.

0 голосов
/ 17 февраля 2020

Вам необходимо связать метод .promise() с вашими aws-sdk вызовами и await на них, потому что вы создаете async функций.

await s3Client.createBucket(params).promise();
await s3Client.putObject(params1).promise();

Кроме того, S3 не ' t работать с каталогами, хотя вы можете быть сбиты с толку тем, как выглядит консоль S3 при добавлении / к вашим именам файлов. Подробнее об этом можно прочитать здесь

0 голосов
/ 17 февраля 2020

Так как, вы используете asyn c функциональность. Таким образом, вы должны использовать await при вызове «s3Client.createBucket». Затем разрешите полученное обещание.

Для создания папок используйте завершающий "/". Например "pshycology06 / travasko /".

Публиковать журналы ошибок, если они не работают.

0 голосов
/ 17 февраля 2020

Убедитесь, что корзина с тем же именем отсутствует. Пожалуйста, поделитесь журналом, если это возможно.

...