web-dev-qa-db-fra.com

lecture d'un fichier empaqueté dans le package aws lambda

J'ai une fonction lambda de nœud très simple qui lit le contenu du fichier emballé. Je télécharge le code sous forme de fichier Zip. La structure du répertoire est la suivante.

index.js
readme.txt

Ensuite, ayez dans mon fichier index.js:

fs.readFile('/var/task/readme.txt', function (err, data) {
if (err) throw err;
});

Je reçois toujours l'erreur suivante NOENT: aucun fichier ou répertoire de ce type, ouvrez '/var/task/readme.txt'.

J'ai également essayé ./readme.txt.

Qu'est-ce que je rate ?

16
rOrlig

Essayez ceci, cela fonctionne pour moi:

'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;
        });
};

pour déboguer pourquoi votre code ne fonctionne pas, ajoutez le lien ci-dessous dans votre gestionnaire

console.log(path.resolve("./readme.txt"));

Sur le nœud AWS Lambda, le processus peut s'exécuter à partir d'un autre dossier et il recherche readme.txt fichier de ce dossier comme vous avez fourni relative chemin, la solution consiste à utiliser absolute chemin.

25
jaym

Il s'agit d'une question ancienne, mais qui apparaît en premier lorsque vous essayez de trier ce qui se passe avec les chemins de fichiers sur Lambda.

Étapes supplémentaires pour Framework sans serveur

Pour toute personne utilisant un environnement sans serveur à déployer (qui utilise probablement webpack pour construire), vous devrez également ajouter ce qui suit à votre fichier de configuration webpack (juste après target: node):

  // assume target: 'node', is here

  node: {
    __dirname: false,
  },

Sans cet élément, l'utilisation de __dirname avec Serverless ne vous donnera TOUJOURS PAS le chemin de répertoire absolu souhaité.

5
Necevil

Ce qui a fonctionné pour moi, c'est le commentaire par Vadorrequest d'utiliser process.env.LAMBDA_TASK_ROOT. J'ai écrit une fonction pour obtenir un fichier de modèle dans un /templates répertoire lorsque je l'exécute localement sur ma machine avec __dirname ou avec le process.env.LAMBDA_TASK_ROOT variable lors de l'exécution sur Lambda:

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