node.js - 带有 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 文件的信息。否则称为node-addon-api
. 它允许您编译“本机扩展”(以 . 结尾的文件.node
)。是的,您需要为您的目标平台和节点版本执行此操作。但是,您不需要在每次部署/构建时启动 Docker 映像。您只需复制您的 .node 文件即可。您甚至可以只在本地运行 Docker 并执行此操作。它应该大大简化您的流程。
我在 AWS Lambda 和 Node.js 8.10 中使用它作为另一个专有驱动程序模块,它工作得很好。所以我可以确认这些原生模块在 AWS Lambda 中确实有效。事实上,编译它的公司是针对“linux”而不是我收集到的 Linux 的某些特定 AWS Lambda 变体这样做的。因此,当您需要编译时,它似乎是一种更宽容的方法。
推荐阅读
- android - Android WebView shouldOverrideUrlLoading 问题
- javascript - Javascript = AddEventlistener 仅适用于 Chrome
- python - 循环遍历数据框,一旦满足条件,从满足条件的地方再次开始循环?
- jhipster - JHipster 技术工作室无法实现单向 RS
- amazon-web-services - Ubuntu 服务器 Supervisord 未重新启动
- ios - 如何让 InputAccessoryView 出现在 UITabBarViewController 的标签上方?
- python-3.x - unpack 需要一个长度为 32 的字节对象
- asp.net-core - 检测到依赖约束之外的包版本:Microsoft.AspNetCore.App 2.1.1
- ios - 尝试通过 facebook 通过 ios App 登录时出错
- sql-server - 拥有基于 SQL Server 中特定列的唯一记录