Я пытаюсь скопировать файл из общедоступной корзины s3 и поместить его в мою базу данных DynamodB. Что я здесь не так делаю? - PullRequest
0 голосов
/ 21 октября 2019

Я новичок в nodejs.

Как я могу скопировать данные из s3 в dynamicodb, используя узел js? У меня есть файл json в s3, который я хочу скопировать

var AWS = require('aws-sdk');
AWS.config.update({
accessKeyId: '********',
secretAccessKey: '**********',
region: '*****',
endpoint: "http://localhost:8000"
})


exports.handler = async (event) => {
    try {
        console.log(event);
        //get the file name
        let key = event['filename.json'];
        let getObject = {Bucket: 'Bucket-name', Key: `${key}`};
        //get the object
        let response = await s3.getObject(getObject).promise();

. Этот код ниже работает нормально, когда вместо ответа

        var docClient = new AWS.DynamoDB.DocumentClient();

        console.log("Importing movies into DynamoDB. Please wait.");

        var allMovies = JSON.parse(fs.readFileSync('response', 'utf8'));
        allMovies.forEach(function(movie) {
            var params = {
                TableName: "Movies",
                Item: {
                    "year":  movie.year,
                    "title": movie.title,
                    "info":  movie.info
                }
            };

            docClient.put(params, function(err, data) {
               if (err) {
                   console.error("Unable to add movie", movie.title, ". Error JSON:", JSON.stringify(err, null, 2));
               } else {
                   console.log("PutItem succeeded:", movie.title);
               }
            });
        });




    }
    catch(error){
        console.error(error);
        return error;
    }
};
используется действительное имя файла, которое находится на моем локальном компьютере.

1 Ответ

2 голосов
/ 21 октября 2019

Здесь есть несколько проблем:

  1. Учетные данные в лямбда-коде - не делайте этого , для этого предназначены роли IAM.
  2. Ваша загрузка S3 не делает то, что вы думаете, она не загружает файл в файловой системе, но возвращает объект, который вы обрабатываете дальше.
  3. Вы пытаетесь прочитать из файла с именем response, который наиболеескорее всего, не существует - см. 2

Я сам не JS парень, поэтому я немного погуглил и нашел этот код здесь :

const downloadFile = (filePath, bucketName, key) => {
  const params = {
    Bucket: bucketName,
    Key: key
  };
  s3.getObject(params, (err, data) => {
    if (err) console.error(err);
    fs.writeFileSync(filePath, data.Body.toString());
    console.log(`${filePath} has been created!`);
  });
};

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

downloadFile(filePath, bucketName, key);

ПОЖАЛУЙСТА, НЕ ХРАНИТЕЛИ ПОМОЩЬ AWS В ВАШЕМ КОДЕ ПОД НИКАКИМОБСТОЯТЕЛЬСТВА

...