【问题标题】:AWS Lambda: module initialization error: Error at Error (native) at Object.fs.openSync (fs.js:641:18)AWS Lambda:模块初始化错误:Object.fs.openSync (fs.js:641:18) 处的错误(本机)错误
【发布时间】:2018-10-09 14:06:06
【问题描述】:

我有一个由 DynamoDB 流触发的 AWS DynamoDB lambda。所有的实现都是在 JS 中用 ClaudiJS 完成的。当使用 claudia create 命令部署 lambda 时,没有问题。

问题是当使用 dockerized 构建服务器使用 GoCD 管道部署相同的函数时,在调用 lambda 函数时会发生以下错误。

module initialization error: Error
at Error (native)
at Object.fs.openSync (fs.js:641:18)
at Object.fs.readFileSync (fs.js:509:33)
at Object.Module._extensions..js (module.js:578:20)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.require (module.js:497:17)
at require (internal/module.js:20:19)

现在我已经花费了 10 多个小时,但我不知道如何解决这个问题。有人可以帮帮我吗?

Lambda 使用节点 6.10,我使用 babel 转译到节点 6.10。 尝试使用node:boronubuntu:16.04 图像作为 Docker 的构建器图像。

【问题讨论】:

    标签: node.js npm aws-lambda amazon-dynamodb claudiajs


    【解决方案1】:

    我在这个问题上花了一天多的时间。最后,我尝试了几乎所有可能的方法,最终通过从ClaudiaJS切换到Serverless解决了这个问题。为了大家的使用,我将在这里提到我尝试的结果。

    1. 在 GoCD 管道使用的构建 docker 容器内使用了相同的 localhost 环境(相同的节点版本,相同的纱线版本,Ubuntu 16:04)。但问题仍然存在。
    2. 删除 docker 并设置 GoCD 管道以直接在构建服务器上运行(再次使用相同的节点版本、相同的 yarn 版本、Ubuntu 16:04,就像我在本地机器上使用的那样)。但是再次没有锁定,问题没有任何改变。
    3. 将我本地机器的 node_modules 文件夹和 build 文件夹提交到 git 存储库,并使用相同的 node_modules 并通过 GoCD 管道构建文件,而不执行 yarn 并且没有在构建服务器上编译代码。但一切都没有改变。

    最后,我切换到了无服务器框架。在第一次尝试中,我使用了带 babel 和没有 webpack 的无服务器,即使无服务器推荐使用 webpack。但是,当 lambda 与管道一起部署时,再次发生了同样的问题。我将配置更改为将 webpack 与无服务器一起使用。然后所有问题都解决了,lambda 部署成功。这是我最后使用的webpack.config.js

    const path = require('path');
    
    const slsw = require('serverless-webpack');
    const nodeExternals = require('webpack-node-externals');
    
    const build = {
      entry: slsw.lib.entries,
      resolve: {
        extensions: ['.js'],
      },
      target: 'node',
      output: {
        libraryTarget: 'commonjs',
        path: path.join(__dirname, '.webpack'),
        filename: '[name].js',
      },
      module: {
        rules: [
          {
            test: /\.js$/,
            exclude: /node_modules/,
            use: [
              {
                loader: 'babel-loader',
              },
            ],
          },
        ],
      },
      mode: slsw.lib.webpack.isLocal ? 'development' : 'production',
      optimization: {
        // Do not minimize the code.
        minimize: false,
      },
      performance: {
        // Turn off size warnings for entry points
        hints: false,
      },
      externals: [nodeExternals()],
    };
    
    module.exports = build;
    

    【讨论】:

      【解决方案2】:

      当我的无服务器实例要读取 .json 文件并从中提取 json 对象时,会出现此错误。所以我在脚本中创建了那个 json 对象作为 json 对象。然后一切都很好..我使用了 webpack.config 的基本配置

      【讨论】:

      • 您是如何尝试读取文件的?无论如何,我提到的错误发生在我的实际代码开始执行之前。所以看起来你的情况和我的不一样。
      • 不,快递服务器当然不会启动。它找不到配置文件(config.json)。所以我在节点源中添加了配置json对象作为json对象
      • 是的,你是对的。但是这里的问题是我没有这样的文件。
      • 抛出此异常是因为它尝试在 lambda 函数中读取文件。所以我没有读取文件,而是将文件的内容放在节点脚本中
      【解决方案3】:

      让我先说我没有使用 GoCD 的特定经验,但我在其他情况下遇到过这个错误。

      此错误的一个潜在原因是在将代码部署到 VM 时存在文件权限问题。

      该错误是一般错误,表示 Lambda 函数无法启动。您也可以在 AWS 内部收到此错误。不幸的是,您使用 GoCD 看到的日志记录级别似乎与 AWS CloudWatch 处于同一级别,这不是很好,并且没有告诉您是什么阻止了 Lambda 启动。您需要更多的日志记录来确定您的情况的确切原因。

      如果您碰巧在 AWS 中遇到此错误,请打开您的 Lambda 函数。在 AWS 页面的顶部应该有一个下拉菜单,旁边有一个“测试”按钮。

      打开下拉菜单并选择“配置测试事件”。 您必须制作此测试以匹配您的特定 lambda 函数。 接下来,选择新测试并单击“测试”按钮。 Lambda 将向您显示成功或失败消息以及调用的详细信息。

      在我的例子中,我们在 Linux 机器上使用 AWS sam 实用程序编写了上传脚本,并且文件权限不太正确(错误是关于“权限被拒绝,打开 '/var/task/index .js'")。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-13
        • 2023-03-12
        • 2021-10-26
        • 1970-01-01
        相关资源
        最近更新 更多