【发布时间】:2018-12-18 16:28:06
【问题描述】:
最近我开始使用 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
我使用serverless 框架进行部署。理论上,部署 Lambda 函数后应该可以工作,但实际上却不行。我在 Stackoverflow 上发现了类似的问题,但没有任何帮助。
此外,我认为这是云功能支持Nodejs原生模块的常见问题,应该针对特定操作系统进行编译。
对解决此问题的任何想法和帮助表示赞赏。谢谢。
【问题讨论】:
-
不,我的问题不是部署。我使用无服务器进行部署,效果很好。问题似乎是 lambda 在使用 nodejs 本机模块时存在一些问题,即使我使用 amazon linux docker 映像编译它们也是如此。否则我可能会错过一些重要的事情。
-
我不熟悉 docker 镜像的过程,但是有一个 official AMI 用于创建兼容的构建环境。
-
我使用了 amazonlinux docker 镜像,也许值得尝试 lambda image hub.docker.com/r/lambci/lambda 。感谢您的链接和想法,我会检查它。
标签: node.js aws-lambda serverless-framework