无服务器框架函数的AWS Lambda文件系统路径是什么?

7
这似乎很简单,但却很棘手。显然,Serverless会与webpack一起打包,然后在使用Cloud Formation部署之前上传到S3。
问题在于webpack对node __dirname有一些问题,您可以在此处阅读相关内容: https://github.com/webpack/webpack/issues/1599 基本上这意味着,在考虑使用__dirname获取绝对路径之前,您需要在webpack配置中添加以下内容(在target: node,之后):
  // assume target: 'node', is here

  node: {
    __dirname: false,
  },:

太好了。我的问题是:

对于一个有多个函数的无服务器项目,基于标准的起始套件,给定函数的根目录在基础 repo 中是什么?

我将上述代码添加到我的 webpack 配置中,现在 __dirname 再次工作了,但是我仍然找不到打包在 repo 中的文件。

而 repo 看起来像这样:

repo-root
——— src
——— ——— someFunction
——— ——— ——— some-sub-directory
——— ——— ——— ——— targetfile.json

我应该在 '__dirname' 后面添加什么才能访问 targetfile.json 文件呢?

我以前没有在无服务器环境中使用过 nodejs。我使用 Go,并且注意到根文件是 serverless.yml 所在的位置。例如,如果它在您的 repo-root 中,则该文件将位于 ./src/someFunction/some-sub-directory/targetfile.json。如果您想从 someFunction 调用该文件,则可以使用 ./some-sub-directory/targetFile.json。那么,在您的 serverless.yml 中,包含语句是什么样子的呢? - kkesley
1个回答

9

简短回答:

由Serverless Framework生成的AWS Lambda函数handler.js构建/生成将被放置在路径下:/var/task/src/handler.js

Lambda的默认运行目录(至少是Node8.10)为:/var/task

长回答:这是关于webpack包含JSON文件的问题。 我之前问了错误的问题来达到我想要的结果。我真正想知道的是:

如何告诉webpack在我使用Serverless Framework Lambda函数时包含一个json文件,以便lambda可以在运行时访问该json文件?

在你的存储库中,/src目录(可能是默认的Serverless项目结构)包含你的handler.js文件,并且是参考点(第一个从你的serverless项目复制进来的目录),没有任何上面的目录被复制进去。

话虽如此,假设你的本地文件/文件夹结构看起来像这样:

repo-root
——— src
——— ——— someFunction
——— ——— ——— some-sub-directory

重要的是要记住,无服务器 AWS Lambda 的文件结构(默认情况下)将如下所示:
——— src
——— ——— handler.js
——— node_modules

请注意,默认情况下,仅有您的handler.js文件,没有其他任何内容。

没有子目录,没有其他任何东西。这是因为尚未告诉webpack包含JSON文件(需要一些工作)。

通过'__dirname'正确设置Serverless Lambda绝对路径

首先需要做的是从代码库中包含/需要/引用JSON文件。这让webpack知道您以后会需要它:

let file = require('./some-sub-directory/targetfile.json');

如果你没有正确地要求JSON文件,无论你指向什么位置,它都不会出现。另一个更“hacky”的选项是将JSON文件重命名为.js,然后通过相同的过程包含。
Webpack文件加载器配置
仅仅包含JSON文件(在我的情况下)并没有触发webpack实际上将文件包含在打包程序中。我还需要添加webpack文件加载器:https://www.npmjs.com/package/file-loader 然后在我的webpack配置中添加以下内容 - 在rules下(webpack 4会略有不同):
{
        // type: 'javascript/auto', // this would be for webpack 4
        test: /\.json$/,
        use: [
          {
            loader: 'file-loader',
            options: {
              name: "./src/mypackedfiles/[name].[ext]"
            }
          }
        ]
      }

更多详细信息请参阅此处: https://github.com/webpack/webpack/issues/6586#issuecomment-379448638

请记住,仅包含文件并不解析其中包含的值——它只告诉webpack将其包括在内,以便您可以使用fs或其他方法在Lambda中本地读取它。

故障排除(查找文件)

这里的关键是(如果您正在尝试将json文件包含/访问到类似于我的Serverless AWS Lambda函数),要意识到这实际上更多地涉及到webpack而不是Lambda路径设置问题。

因此,发现问题/找到文件的最佳方法就是构建您的函数,然后解压它创建的文件,看看您的json是否已经被正确地包含在其中。

一旦它已被包含——然后您可以使用上述设置和__dirname跟踪并实际利用该文件。

位于Serverless Lambda中的最终JSON文件位置

基于上述webpack配置,您的目录结构(在zip中)应如下所示:

——— src
——— ——— mypackedfiles
——— ——— ——— targetfile.json
——— ——— someFunction
——— ——— ——— some-sub-directory
——— node_modules

因此,考虑到这一点,你对webpack添加的json文件的引用现在应该是这样的:
let filelocation = __dirname + '/mypackedfiles/targetfile.json'

现在,您可以从fs或您想要的任何解析器中访问filelocation,因为它已经正确地包含在您的无服务器lambda中。
对于一个仓库内有多个函数的情况,请注意:使用此方法将把json文件复制到由您的仓库生成的每个函数中。这对于您可能是好事也可能不是好事,但对于我来说,它完全可行,因为我的JSON文件并不是特别大。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接