最近我开始使用AWS Lambda函数,我的Nodejs应用程序一直运行良好,直到我尝试使用web3.js软件包。在我添加了这行代码后
const Web3 = require('web3');
我在 HTTP 终端点上遇到了 "Internal Server Error" 错误,并在 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
现在我在应用程序的根目录中运行以下命令,使用带有Amazon Linux的docker镜像安装npm包并编译本机模块。
docker run -it --rm -v $(pwd):/app -w /app docker/awslinuximage
我使用serverless框架进行部署。理论上,Lambda函数应该在部署后工作,但实际上并不是这样。我在Stackoverflow上找到了类似的问题,但没有什么帮助。
此外,我认为云函数支持Nodejs原生模块是一个普遍的问题,需要为特定的操作系统编译。
如果您有任何想法和帮助来解决这个问题,将不胜感激。谢谢。