3

我有一个由 DynamoDB 流触发的 AWS DynammoDB 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 使用 Node 6.10 ,我使用 babel 转译到 node 6.10 。尝试使用node:boronubuntu:16.04图像作为 Docker 的构建器图像。

4

3 回答 3

0

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

  1. 在 GoCD 管道使用的构建 docker 容器内使用了相同的 localhost 环境(相同的节点版本,相同的纱线版本,Ubuntu 16:04)。但问题仍然存在。
  2. 移除 docker 并设置 GoCD 管道直接在构建服务器上运行(再次使用与我在本地机器上使用的相同节点版本、相同纱线版本、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;
于 2018-05-21T10:51:37.193 回答
0

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

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

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

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

AWS Lambda 测试下拉列表

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

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

于 2019-05-22T15:45:00.583 回答
0

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

于 2018-06-07T02:14:24.763 回答