带有Nodejs本机模块的AWS Lambda

时间:2018-07-10 18:17:17

标签: node.js aws-lambda serverless-framework

最近,我开始使用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进行编译。

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

2 个答案:

答案 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 .)

希望有帮助