Как правильно запустить бинарный файл из лямбды? - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь сделать так, чтобы двоичный аудиосигнал запускался из лямбды, я следовал этому руководству: http://marcelog.github.io/articles/static_sox_transcoding_lambda_mp3.html Итак, я создал двоичный файл sox, используя docker с последней версией Amazon Linux, и развернул лямбда в виде zip-пакета со структурой:

sox
index.js

Лямбда-код:

exports.handler = async (event) => {
    initializeContext();

    try {
        const object = await getFile("test.mp3");

        const fs = require('fs');
        fs.writeFileSync("/tmp/test.mp3", object.Body);

        let result = child_process.execFileSync('sox', ['/tmp/test.mp3', '/tmp/testOutput.mp3', ... <filter params here>], {
            encoding: 'ascii'
            // shell: true
        });

        const file = fs.readFileSync("/tmp/testOutput.mp3");

        await putFile("testOutput.mp3", file);
    }
    catch(err) {
        try {
            await log("error", err); 
        }
        catch(err) {}
    }
};
let getFile = async function(fileName) {
    const params = {
        Bucket: bucket,
        Key: fileName
    };
    return await s3.getObject(params).promise();
};

let putFile = async function(fileName, body) {
    const params = {
        Bucket: bucket,
        Key: fileName,
        Body: body
    };
    await s3.putObject(params).promise();
};

Итак, мне нужно получить файл из S3, обработать его и вернуть результат.Загрузка S3 проверена на работу.Тем не менее, я получаю ошибку «EACCES» при попытке запустить процесс «sox».Что я мог пропустить?Может ли это происходить из-за того, что я использовал последний образ Amazon Linux, но Lambda использует более старую версию?

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

Наконец я обнаружил, что для обеспечения прав доступа к файлам мне нужно создать zip-пакет в образе док-станции Amazon Linux.Таким образом, вам нужно

npm i lambda-audio

, а затем архивировать node_modules вместе с вашим index.js.Моя zam корневая папка с lambda-пакетом:

node_modules // npm i lambda-audio result
index.js

Рабочее решение для Node 8.10 Runtime с оптимизацией потребления памяти:

process.env["PATH"] = process.env["PATH"] + ":" + process.env["LAMBDA_TASK_ROOT"];

const AWS = require("aws-sdk");
const s3 = new AWS.S3();
const lambdaAudio = require("lambda-audio");

let bucket;

exports.handler = async (event) => {
    try {
        bucket = event.bucket;
        const { inputFileName, outputFileName } = event;

        const fs = require("fs");
        const inputStream = fs.createWriteStream("/tmp/input.mp3");

        await getFileToStream(inputFileName, inputStream);

        await lambdaAudio.sox("/tmp/input.mp3 /tmp/output.mp3 <YOUR FILTERS HERE>);

        fs.unlinkSync("/tmp/input.mp3"); // removing unused input file

        const outputStream = fs.createReadStream("/tmp/output.mp3");
        await uploadFileFromStream(outputFileName, outputStream);
    }
    catch(err) {
        // Logging
    }
};

let getFileToStream = async function(fileName, writeStream) {
    const params = {
        Bucket: bucket,
        Key: fileName
    };
    const readStream = s3.getObject(params).createReadStream();

    const end = new Promise((resolve, reject) => {
        writeStream.on('close', () => resolve());
        writeStream.on('error', (err) => reject(err));
        readStream.on('error', (err) => reject(err));
    });

    readStream.pipe(writeStream);

    return end;
};

let uploadFileFromStream = async function(fileName, readStream) {
    const params = {
        Bucket: bucket,
        Key: fileName,
        Body: readStream
    };
    return await s3.upload(params).promise();
};
0 голосов
/ 05 октября 2018

Я боролся с тем же для обработки аудиофайлов.Пакет npm пригодился.

https://github.com/stojanovic/lambda-audio

Если ваша команда,

sox input.mp3 -c 1 output.wav

код вашего узла будет выглядеть следующим образом:

const lambdaAudio = require('lambda-audio')
lambdaAudio.sox('./input.mp3 -c 1 /tmp/output.wav')
  .then(response => {
    // Do something when the file was converted
  })
  .catch(errorResponse => {
    console.log('Error from the sox command:', errorResponse)
  })

и оставит все сложные проблемы в пакете npm.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...