パッケージ化されたファイルの内容を読み取る非常に単純なノードラムダ関数があります。コードをZipファイルとしてアップロードします。ディレクトリ構造は以下の通りです。
index.js
readme.txt
次に、私のindex.jsファイルに入れます:
fs.readFile('/var/task/readme.txt', function (err, data) {
if (err) throw err;
});
次のエラーNOENTが発生し続けます:そのようなファイルまたはディレクトリはありません。'/var/task/readme.txt'.
を開いてください
./readme.txtも試しました。
何が欠けていますか?
これを試してください、それは私のために働きます:
'use strict'
let fs = require("fs");
let path = require("path");
exports.handler = (event, context, callback) => {
// To debug your problem
console.log(path.resolve("./readme.txt"));
// Solution is to use absolute path using `__dirname`
fs.readFile(__dirname +'/readme.txt', function (err, data) {
if (err) throw err;
});
};
コードが機能しない理由をデバッグするには、ハンドラーの下にリンクを追加します
console.log(path.resolve("./readme.txt"));
AWS Lambdaノードプロセスは他のいくつかのフォルダーから実行されている可能性があり、relative
パスを指定したときにそのフォルダーからreadme.txt
ファイルを検索します。解決策はabsolute
パスを使用することです。
これは古い質問ですが、Lambdaのファイルパスで何が起こっているのかを整理しようとするときに最初に出てきます。
サーバーレスフレームワークを使用してデプロイする場合は(おそらくwebpackを使用してビルドします)、webpack構成ファイル(target: node
の直後)にも以下を追加する必要があります。
// assume target: 'node', is here
node: {
__dirname: false,
},
この部分がないと、サーバーレスで__dirnameを使用しても、希望する絶対ディレクトリパスを取得できません。
私にとってうまくいったのは、process.env.LAMBDA_TASK_ROOT
を使用するVadorrequestによる comment でした。私のマシンで__dirnameまたはLambdaで実行しているときに/templates
変数を使用してローカルで実行しているときに、process.env.LAMBDA_TASK_ROOT
ディレクトリにテンプレートファイルを取得する関数を記述しました。
function loadTemplateFile(templateName) {
const fileName = `./templates/${templateName}`
let resolved
if (process.env.LAMBDA_TASK_ROOT) {
resolved = path.resolve(process.env.LAMBDA_TASK_ROOT, fileName)
} else {
resolved = path.resolve(__dirname, fileName)
}
console.log(`Loading template at: ${resolved}`)
try {
const data = fs.readFileSync(resolved, 'utf8')
return data
} catch (error) {
const message = `Could not load template at: ${resolved}, error: ${JSON.stringify(error, null, 2)}`
console.error(message)
throw new Error(message)
}
}