web-dev-qa-db-ja.com

aws lambdaパッケージのパッケージファイルを読み取る

パッケージ化されたファイルの内容を読み取る非常に単純なノードラムダ関数があります。コードを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も試しました。

何が欠けていますか?

16
rOrlig

これを試してください、それは私のために働きます:

'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パスを使用することです。

25
jaym

これは古い質問ですが、Lambdaのファイルパスで何が起こっているのかを整理しようとするときに最初に出てきます。

サーバーレスフレームワークの追加手順

サーバーレスフレームワークを使用してデプロイする場合は(おそらくwebpackを使用してビルドします)、webpack構成ファイル(target: nodeの直後)にも以下を追加する必要があります。

  // assume target: 'node', is here

  node: {
    __dirname: false,
  },

この部分がないと、サーバーレスで__dirnameを使用しても、希望する絶対ディレクトリパスを取得できません。

5
Necevil

私にとってうまくいったのは、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)
  }
}
1
Chris Livdahl