首页 > 解决方案 > 带有 Nodejs 原生模块的 AWS Lambda

问题描述

最近我开始使用 AWS Lambda 函数,我的 Nodejs 应用程序运行良好,直到我尝试使用web3.js包。在我添加该行之后

const Web3 = require('web3');

我收到 HTTP 端点的错误“内部服务器错误”,CloudWatch 日志中出现以下错误

module initialization error: Error
at Object.Module._extensions..node (module.js:681:18)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)
at Module.require (module.js:596:17)
at require (internal/module.js:11:18)
at Object.<anonymous> (/var/task/node_modules/scrypt/index.js:3:20)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)

在本地,我使用 web3.js 包没有问题。所以我开始深入挖掘以了解这里出了什么问题。依赖关系中有一些本机模块。一些谷歌搜索最终得出这些包应该在 Amazon Linux 平台上编译的想法,否则它将无法工作。我开始创建 docker 镜像来实现这个目标。

Dockerfile

FROM amazonlinux:latest

# Install development tools
RUN yum update -y \
  && yum install gcc gcc44 gcc-c++ libgcc44 make cmake tar gzip git -y

# Install nvm and nodejs
RUN touch ~/.bashrc \
  && curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash \
  && source ~/.bashrc \
  && nvm install v8.10

CMD source ~/.bashrc && npm install

现在在我的应用程序的根目录中,我运行以下命令来安装 npm 包并使用带有 Amazon Linux 的 docker 映像编译本机模块

docker run -it --rm -v $(pwd):/app -w /app docker/awslinuximage

我使用无服务器框架进行部署。理论上,部署 Lambda 函数后应该可以工作,但实际上它不会。我在 Stackoverflow 上发现了类似的问题,但没有任何帮助。

此外,我认为这是云功能支持Nodejs原生模块的常见问题,应该针对特定的操作系统进行编译。

任何解决此问题的想法和帮助表示赞赏。谢谢你。

标签: node.jsaws-lambdaserverless-framework

解决方案


我不想用链接回答,但你可以找到一些关于构建 .node 文件的信息。否则称为node-addon-api. 它允许您编译“本机扩展”(以 . 结尾的文件.node)。是的,您需要为您的目标平台和节点版本执行此操作。但是,您不需要在每次部署/构建时启动 Docker 映像。您只需复制您的 .node 文件即可。您甚至可以只在本地运行 Docker 并执行此操作。它应该大大简化您的流程。

我在 AWS Lambda 和 Node.js 8.10 中使用它作为另一个专有驱动程序模块,它工作得很好。所以我可以确认这些原生模块在 AWS Lambda 中确实有效。事实上,编译它的公司是针对“linux”而不是我收集到的 Linux 的某些特定 AWS Lambda 变体这样做的。因此,当您需要编译时,它似乎是一种更宽容的方法。


推荐阅读