无服务器框架功能的AWS Lambda文件系统路径?

时间:2018-07-27 00:33:40

标签: webpack aws-lambda serverless aws-serverless

因此,这似乎很容易,但一直很棘手。显然,无服务器与webpack捆绑在一起,然后上传到S3,然后再通过Cloud Formation进行部署。

这里的问题是webpack的节点__dirname有一些问题,您可以在这里阅读有关内容: https://github.com/webpack/webpack/issues/1599

基本上,这意味着您甚至需要考虑在使用__dirname来获取绝对路径之前(在{{1}之后)将以下内容添加到webpack配置中:

target: node,

所以。大。我的问题是:

  

对于基于标准入门工具包的具有多种功能的无服务器项目,基本存储库中给定功能的根目录是什么?

我将上述代码添加到了webpack配置中,并且__dirname现在可以再次使用,但是我仍然无法找到存储在仓库中的文件。

回购如下所示:

  // assume target: 'node', is here

  node: {
    __dirname: false,
  },:
  

为了击中targetfile.json,我要在'__dirname'后面附加什么?

1 个答案:

答案 0 :(得分:1)

简短回答:

  

由无服务器框架生成/生成的AWS Lambda函数handler.js将位于以下路径: /var/task/src/hander.js

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

长答案:这是关于包含JSON文件的webpack。 我确实在问一个错误的问题,以获得我想要的结果。我真正想知道的是:

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

在您的仓库中,/ src目录(可能是-如果使用的是默认的无服务器项目结构)可能包含您的handler.js文件,并且是仓库中的参考点(要从无服务器项目中复制的第一个目录)-复制该src目录上方的任何内容。

那是说,假设您的本地文件/文件夹结构看起来像这样:

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

请务必记住,无服务器的AWS Lambda文件结构将如下所示(默认情况下):

——— src
——— ——— handler.js
——— node_modules

请注意,在您的handler.js文件之外,没有其他内容(默认情况下)。

没有子目录什么也没有。这是因为没有告知webpack包含JSON文件(这需要一些工作)。

通过'__dirname'纠正无服务器Lambda绝对路径

需要做的第一件事是从代码库中包含/ require /引用您的json文件。这使webpack知道以后需要它:

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

如果您不正确地需要JSON文件,则指向的位置不会有任何变化。另一个更“棘手”的选择是将JSON文件重命名为.js,然后通过相同的过程进行包含。

Webpack文件加载器配置

仅包含JSON文件(以我为例)并没有触发webpack将文件实际包含在捆绑程序中。我还需要添加webpack文件加载器:https://www.npmjs.com/package/file-loader

然后将以下内容添加到我的webpack配置中-根据规则(对于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本地读取它方法。

故障排除(查找文件)

这里的关键(如果您想像我一样被包含/可用于无服务器AWS Lambda函数访问的json文件)是要意识到,这实际上是webpack的问题,而不是Lambda路径的问题。 / p>

因此,解决/查找文件的最佳方法是构建函数,然后解压缩其创建的文件,以查看是否已正确包含json。

一旦包含了该文件,您便可以将上述设置与__dirname一起使用,以跟踪并实际使用该文件。

无服务器Lambda中的最终JSON文件位置

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

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

因此请记住,您对webpack添加的json文件的引用现在看起来像这样:

let filelocation = __dirname + '/mypackedfiles/targetfile.json'

您现在可以从fs或任何您想要的解析器访问文件位置,因为它已正确包含在无服务器lambda中。

  

在一个存储库中提供多种功能的说明:通过这种方法,json文件将被复制到由您的存储库生成的每个函数中。这可能对您来说不是一件好事,但对我来说很好,因为我的JSON文件不是太大。

相关问题