2016-12-09 2 views
3

У меня очень простая функция лямбда узла, которая считывает содержимое упакованного файла в нем. Я загружаю код в виде zip-файла. Структура каталогов выглядит следующим образом.чтение упакованного файла в пакете aws лямбда

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 также.

Что мне не хватает?

+0

Похоже, что текстовый файл не может быть включен в ваш почтовый индекс, поэтому я бы сначала дважды проверить это, загрузив zip-файл с консоли. В противном случае, не могли бы вы добавить немного больше контекста? Как выглядит остальная функция вашего обработчика? – commandt

+0

Фактически я использую сервер без оболочки для упаковки и загрузки zip-файла на S3. Я проверил файл S3, и он содержит файл. То, что я пытаюсь сделать, - это прочитать ключи с зашифрованными ключами kms, чтобы моя лямбда могла получить ключи шифрования от kms для шифрования исходящих HTTP-вызовов третьей стороне. – rOrlig

+0

Имеет ли файл S3 файл txt в ожидаемом месте? Кроме того, использование относительного пути, такого как ./readme.txt, может не работать, если serverless изменяет cdd вашей функции. Возможно, попробуйте __dirname + '/readme.txt', или вы можете попробовать выполнить регистрацию cdd вашей лямбда-функции с помощью process.cwd() – commandt

ответ

9

Попробуйте, это работает для меня:

'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 может быть запущен из некоторые другие папки и ищет файл readme.txt из этой папки, как вы указали путь relative, решение должно использовать путь absolute.

+0

Использование __dirname при использовании Webpack имеет тенденцию к сбою и разрешению неправильной папки. В таком случае предпочитайте использовать 'process.env.LAMBDA_TASK_ROOT' и перестроить реальный путь на основе этой переменной env. – Vadorequest

Смежные вопросы