【问题标题】:AWS Lambda filesystem path for a Serverless Framework Function?无服务器框架函数的 AWS Lambda 文件系统路径?
【发布时间】:2019-01-04 01:29:34
【问题描述】:

所以这看起来很容易,但很棘手。显然 Serverless 与 webpack 捆绑,然后在使用 Cloud Formation 部署之前上传到 S3。

这里的问题是 webpack 在节点 __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

为了点击 targetfile.json,我应该在 '__dirname' 上附加什么内容?

【问题讨论】:

  • 我之前没有在 serverless 中使用过nodejs。我使用Go,我注意到根文件是serverless.yml 所在的位置。例如如果它在您的repo-root 中,那么该文件将在./src/someFunction/some-sub-directory/targetfile.json 中。如果要从 someFunction 调用文件,可以使用./some-sub-directory/targetFile.jsonserverless.yml 中的 include 语句是什么样的?

标签: webpack aws-lambda serverless aws-serverless


【解决方案1】:

简答:

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

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

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

如何告诉 webpack 在我的无服务器框架 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 绝对路径

首先需要在代码库中包含/要求/引用您的 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 配置中——根据规则(对于 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 路径。

因此,解决/查找文件的最佳方法就是构建您的函数,然后解压缩它创建的文件以查看您的 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 中。

一个 Repo 中的多个函数的注意事项:使用此方法,json 文件将被复制到您的 repo 生成的每个函数中。这对您来说可能是好事,也可能不是好事,但对我来说效果很好,因为我的 JSON 文件并不太大。

【讨论】:

    猜你喜欢
    • 2019-07-23
    • 2023-03-16
    • 2021-12-05
    • 1970-01-01
    • 2017-11-20
    • 2021-03-10
    • 2019-09-06
    • 2020-03-11
    • 1970-01-01
    相关资源
    最近更新 更多