[英]Getting error AWS Lambda : EROFS: read-only file system, open '/var/task/assets/docs.zip'
任何人都可以幫助我為什么我得到這個問題我在本地運行這段代碼它運行完美但是在 aws lambda 我得到了這個錯誤即使我增加了 lambda 超時函數的時間以及內存。
在這段代碼中,我為 get 調用做了一個基本任務,我只是將 xlsx 轉換為 json,在發布后我只是將測試目錄轉換為 zip 文件。我從最近幾個小時開始嘗試在 aws lambda 上傳,現在我被卡住了並且不斷看到這個錯誤任何人都可以幫助我擺脫這種情況,在此先感謝。
這是我的代碼
索引.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
這是我的 functionality.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;
當我在 cloud watch 看到日志時,我得到:
START RequestId:720cf48f-01c4-11e9-b715-9d54f664a1e8 版本:$LATEST 2018-12-17T06:24:45.756Z 720cf48f-01c4-11e9-b715-9d54f664a1e8 錯誤:EROFS:只讀/var,打開'/var task/assets/docs.zip' END RequestId: 720cf48f-01c4-11e9-b715-9d54f664a1e8
帶有以下錯誤消息:
{ “errorMessage”:“RequestId:98b9e509-01c7-11e9-94dc-03cfdf0dae93 進程在完成請求前退出”}
該錯誤似乎不言自明:
Error: EROFS: read-only file system, open '/var/task/assets/docs.zip'
/var/task
是您的 Lambda 函數代碼所在的位置,在實際的 Lambda 環境中,該文件系統是只讀的。 如果需要寫入文件,則需要寫入/tmp
。
問:如果我的 AWS Lambda 函數需要磁盤暫存空間怎么辦?
每個 Lambda 函數在其自己的 /tmp 目錄中接收 500MB 的非永久性磁盤空間。
請注意,您還需要自己清理並刪除您創建的任何臨時文件,因為一旦一個函數完成執行,它的容器就可以在以后調用相同的函數時重用......這意味着這個相同的臨時空間可能會持續存在短時間並再次被看到(但只能通過相同的功能)。
Lambda是無狀態的,您無權訪問lambda容器的文件系統,並且所有操作都應在內存中完成。 如果不可能,則可以使用例如AWS S3。 在您的情況下,由於您可能只需要一些臨時文件,因此可以使用S3 Intelligent-Tiering存儲類型。
您還可以安裝彈性文件系統(請在實施前檢查定價): https ://aws.amazon.com/blogs/compute/using-amazon-efs-for-aws-lambda-in-your-serverless-applications/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.