Может ли кто-нибудь помочь мне в том, почему у меня возникла эта проблема, я запускаю этот код локально, он отлично работает, но в aws lambda я получил эту ошибку, даже если я увеличил время по сравнению с функцией тайм-аута лямбда, а также памятью.
В этом коде я выполняю базовую задачу для вызова, я просто конвертирую 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 Процесс завершен до завершения запроса" }





Ошибка кажется очевидной:
Error: EROFS: read-only file system, open '/var/task/assets/docs.zip'
/var/task - это место, где расположена ваша лямбда-функция код, и в реальной среде лямбда эта файловая система доступна только для чтения. Если вам нужно записать в файл, вам нужно записать на /tmp.
Q: What if I need scratch space on disk for my AWS Lambda function?
Each Lambda function receives 500MB of non-persistent disk space in its own /tmp directory.
Обратите внимание, что вам также необходимо очистить себя и удалить все созданные вами временные файлы, потому что после завершения выполнения функции ее контейнер доступен для повторного использования путем последующего вызова той же функции ... что означает, что это же временное пространство может сохраняться на короткое время и вас снова увидят (но только с помощью этой же функции).
Также вы можете смонтировать эластичную файловую систему (уточняйте цены перед внедрением): https://aws.amazon.com/blogs/compute/using-amazon-efs-for-aws-lambda-in-your-serverless-applications/
Я потратил много часов, пытаясь исправить свой код, затем понял, что это проблема лямбда ...