Получение ошибки AWS Lambda: EROFS: файловая система только для чтения, откройте «/var/task/assets/docs.zip» - PullRequest
0 голосов
/ 17 декабря 2018

Может ли кто-нибудь мне помочь, поэтому, почему у меня возникла эта проблема, я запускаю этот код локально, он работает отлично, но в AWS лямбда я получаю эту ошибку, даже если я увеличиваю время по сравнению с лямбда-тайм-аутом, а также памятью.

В этом коде я делаю основную задачу для получения вызова, я просто конвертирую xlsx в json, а в посте я просто конвертирую тестовый каталог в zip-файл. Я пробовал его в последние несколько часов для загрузки на AWS Lambda, теперь я застрял и постоянно вижуэта ошибка может кто-нибудь выручить меня из этой ситуации заранее спасибо.

вот мой код

index.js

"use strict"
const fs = require("fs");
const path = require("path");
const ctrlFuns = require("./functionality");
const output = fs.createWriteStream(path.join(__dirname, 
"./assets/docs.zip"));
const archiver = require("archiver");
const zipArchive = archiver("zip", {
gzip: true,
zlib: {
    level: 9
} // Sets the compression level.
});

exports.handleHttpRequest = function (event, context, callback) {

  if (event.http_method == "GET") {
    ctrlFuns.xlsxToJson().then((jsonObjs) => {
        callback(null, {
            users: jsonObjs,
        });
    }).catch((err) => {
        callback(err);
    });
} 
else if (event.http_method == "POST") {
    fs.readFile(path.join(__dirname + "/test/test.xlsx"), (err, file) => {
        if (err) {
            callback(err);
        } else {

            //pipe archive data to the file
            zipArchive.pipe(output);

            zipArchive.append(file, {
                name: "test.xlsx",
                prefix: "test-data" //used for folder name in zip file
            });

            // to catch this error explicitly
            zipArchive.on("error", (err) => {
                callback(err);
            });


            //to perform end tasks while zip converted
            zipArchive.on("end", () => {
                fs.readFile(path.join(__dirname + "/assets/docs.zip"), (err, 
    success) => {
                    if (err) {
                        callback(err);
                    } else {
                        callback(null, success.toString("base64"));
                    }
                });
            });
            //filnalizing the zip file for user use
            zipArchive.finalize();
        }
    });
} 
else {
    callback(null, "run default case");
}
} //handler-closes

вот мой функционал. Js

/**
 * OBJECTIVE: TO CREATE THE FUNCTINALITY
 */
"use strict"

const XLSX = require("xlsx");
const fs = require("fs");
const path = require("path");


var ctrlFuns = {};

ctrlFuns.xlsxToJson = function () {
 return new Promise((resolve, reject) => {
    fs.readFile(path.join(__dirname + "/test/test.xlsx"), (err, file) => {
        if (err) {
            reject(err);
        } else {
            let workbook = XLSX.read(file.buffer, {
                type: "buffer"
            });

            //if workbook is null
            if (!workbook) {
                reject("Workbook not found.");
            }

            /* Getting first workbook sheetName */
            let first_sheet_name = workbook.SheetNames[0];

            /* Get worksheet */
            let worksheet = workbook.Sheets[first_sheet_name];

            /**Convert Into JSON */
            resolve(XLSX.utils.sheet_to_json(worksheet, {
                raw: true
            }));
        }
    });
})

 } //fun-closes

 module.exports = ctrlFuns;

когда я увидел логи в облакепосмотрите тогда я получил:

START RequestId: 720cf48f-01c4-11e9-b715-9d54f664a1e8 Версия: $ LATEST 2018-12-17T06: 24: 45.756Z 720cf48f-01c4-11e9-b715-9d54f664a1e8 Ошибка: EROFS:Файловая система только для чтения, откройте '/var/task/assets/docs.zip' END RequestId: 720cf48f-01c4-11e9-b715-9d54f664a1e8

с сообщением об ошибке ниже:

{"errorMessage ":" RequestId: 98b9e509-01c7-11e9-94dc-03cfdf0dae93 Процесс завершен до завершения запроса "}

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Ошибка кажется очевидной:

Error: EROFS: read-only file system, open '/var/task/assets/docs.zip' 

/var/task - это место, где находится ваша лямбда-функция код , а в реальной среде Lambda эта файловая система доступна только для чтения,Если вам нужно записать в файл, вам нужно записать в /tmp.

Вопрос: Что если мне понадобится место на диске для моей функции AWS Lambda?

Каждая функция Lambda получает 500 МБ непостоянного дискового пространства в своем собственном каталоге / tmp.

https://aws.amazon.com/lambda/faqs/

Обратите внимание, что вам также необходимо выполнить очистку послесамостоятельно и удалите все временные файлы, которые вы создали, потому что, как только функция завершает выполнение, ее контейнер становится доступным для повторного использования при последующем вызове той же самой функции ... что означает, что это же временное пространство может сохраняться в течение короткого времени и быть замеченным снова (но только с помощью этой же функции).

0 голосов
/ 17 декабря 2018

Лямбды не сохраняют состояние, у вас нет доступа к файловой системе лямбда-контейнера, и все операции должны выполняться в памяти, если это возможно.Если это невозможно, вы можете использовать AWS S3, например.В вашем случае, поскольку вам, вероятно, нужны некоторые файлы только временно, вы можете использовать тип хранения S3 Intelligent-Tiering.

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