获取错误AWS Lambda:EROFS:只读文件系统,打开'/var/task/assets/docs.zip'

时间:2018-12-17 07:18:51

标签: node.js amazon-web-services aws-lambda

任何人都可以帮我解决这个问题的原因,我在本地运行此代码可以完美运行,但是在aws lambda上我得到了这个错误,甚至我增加了lambda超时功能以及内存的时间。

在这段代码中,我执行了get调用的基本任务,我只是将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

这是我的functional.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进程在完成请求之前已退出” }

3 个答案:

答案 0 :(得分:0)

Lambda是无状态的,您无权访问lambda容器的文件系统,并且所有操作都应在内存中完成。如果不可能,则可以使用例如AWS S3。在您的情况下,由于您可能只需要一些临时文件,因此可以使用S3 Intelligent-Tiering存储类型。

答案 1 :(得分:0)

错误似乎不言自明:

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

/var/task是Lambda函数 code 所在的位置,在实际的Lambda环境中,该文件系统是只读的。如果需要写入文件,则需要写入/tmp

  

问:如果我的AWS Lambda函数需要磁盘上的暂存空间怎么办?

     

每个Lambda函数在其自己的/ tmp目录中接收500MB的非永久磁盘空间。

     

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

请注意,您还需要自己清理并删除创建的所有临时文件,因为一旦函数执行完毕,其容器可在以后调用同一函数时重新使用...这意味着相同的温度空间可能会持续很短的时间并再次出现(但只能通过相同的功能)。

答案 2 :(得分:0)

您也可以挂载弹性文件系统(请在实施前检查价格): https://aws.amazon.com/blogs/compute/using-amazon-efs-for-aws-lambda-in-your-serverless-applications/