最近,我开始使用AWS Lambda函数,直到尝试使用web3.js软件包之前,我的Node.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软件包并使用docker image和Amazon Linux编译本机模块
docker run -it --rm -v $(pwd):/app -w /app docker/awslinuximage
我使用serverless框架进行部署。从理论上讲,Lambda函数在部署后应该可以工作,但实际上却不行。我在Stackoverflow上发现了类似的问题,但没有帮助。
此外,我认为这是云功能支持Nodejs本机模块的普遍问题,应针对特定OS进行编译。
任何想法和帮助解决此问题的方法,均表示赞赏。谢谢。
答案 0 :(得分:0)
我不想回答一个链接,但是您可以找到有关构建.node文件的信息。否则称为node-addon-api
。它允许您编译“本机扩展名”(以.node
结尾的文件)。是的,您需要针对目标平台和节点版本执行此操作。但是,您无需在每个部署/构建中启动Docker映像。您可以沿您的.node文件进行复制。您甚至可以只在本地运行Docker,也可以这样做。它应该大大简化您的过程。
我在带有Node.js 8.10的AWS Lambda中将其用于另一个专有驱动程序模块,它工作得很好。因此,我可以确认这些本机模块可以在AWS Lambda中正常工作。实际上,编译该文件的公司是针对“ Linux”而不是根据我收集到的某些特定的AWS Lambda Linux变体进行的。因此,当您需要编译内容时,这似乎是一种更宽容的方法。
答案 1 :(得分:0)
web3使用的scrypt二进制文件必须在docs中指定的Lambda的执行环境中进行编译,函数才能正常工作。即将结束的this博客文章中提供了详细说明。您可以使用下面的Dockerfile来自动执行该过程,而无需创建实例。
FROM amazonlinux:2017.03.1.20170812
SHELL ["/bin/bash", "-c"]
RUN yum update -y && \
yum groupinstall -y "Development Tools"
# Install node using nvm
ENV NVM_VERSION v0.33.11
ENV NVM_DIR /root/.nvm
RUN mkdir -p ${NVM_DIR}
RUN touch ~/.bashrc && chmod +x ~/.bashrc
RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh | bash
ENV NODE_VERSION v8.10.0
RUN source ${NVM_DIR}/nvm.sh && \
nvm install ${NODE_VERSION} && \
nvm alias default ${NODE_VERSION} && \
nvm use default
ENV NODE_PATH ${NVM_DIR}/${NODE_VERSION}/lib/node_modules
ENV PATH ${NVM_DIR}/versions/node/${NODE_VERSION}/bin:${PATH}
# Install global dependencies
RUN npm install -g node-gyp && \
npm i -g serverless@1.39.1
# Set aws credentials in the image for serverless to use
# Save your aws (credentials/config) files at ./secrets.aws.(credentials/config)
COPY ./secrets.aws.credentials /root/.aws/credentials
COPY ./secrets.aws.config /root/.aws/config
ENV APP_PATH /usr/src/app
WORKDIR ${APP_PATH}
# Install app dependencies
COPY package*.json ./
RUN npm install
COPY . .
CMD [ "sls", "deploy" ]
构建并运行Dockerfile
docker run --rm -it $(docker build -q .)
希望有帮助