Итак, я пытаюсь получить аудиофайл mp3 (примерно 9 МБ) из s3, передать данные в поток записи, а затем загрузить в другое целевое ведро s3, используя readStream из файла / tmp /. Это лямбда-функция, которая получает событие загрузки s3 и пытается записать данные из созданного объекта в другую корзину.
const fs = require('fs');
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
exports.handler = (event, context, callback) => {
var sourceBucket = event.Records[0].s3.bucket.name;
var sourceKey = event.Records[0].s3.object.key;
var getParams = {
Bucket: sourceBucket,
Key: sourceKey
};
const inputFilename = '/tmp/' + sourceKey;
//writing and reading streams
const writeStream = fs.createWriteStream(inputFilename);
s3.getObject(getParams).createReadStream().pipe(writeStream);
var putParams = {
Body: fs.createReadStream(inputFilename),
Bucket: "example-destination-bucket",
Key: 'transfer-' + sourceKey
};
s3.upload(putParams, function(err, data) {
if (err) console.info(err, err.stack); // an error occurred
else console.info('logging data' + data); // successful response
});
};
Это приводит к тому, что ключ успешно помещается в корзину s3, но загруженный файл имеет размер 0 байт. Есть идеи, почему это может привести к пустой загрузке?





Файл необходимо загрузить, что займет некоторое время, поэтому вам нужно использовать вызов file.on ('finish') следующим образом ..
const writeStream = fs.createWriteStream(inputFilename);
s3.getObject(getParams).createReadStream().pipe(writeStream);
writeStream.on('finish', function() {
//upload to S3 code
}
Вместо того, чтобы писать лямбда-выражение для копирования из одной корзины s3 в другую, почему бы не установить правило репликации в исходной корзине s3? Он автоматически копирует любые загружаемые файлы, и вы можете делать это для нескольких учетных записей.
Вы правы, я обычно так и поступал, но в данном конкретном случае перед загрузкой будет выполняться транскодирование звука в лямбда-функции.
Если вам не нужен файл на диске, вы можете просто передать его в память.