上下文
我有一个Lambda函数,该函数使用需要编译才能运行的本机节点模块(node-snowball)。当我运行macOS时,在本地计算机上运行的已编译代码将无法在AWS Lambda的Amazon Linux环境中运行。因此,我使用Docker和lambci/lambda:build-nodejs8.10
IMAGE编译为将在Lambda上运行的代码,然后通过Serverless进行部署。
问题
在装有用于Mac节点模块的已编译编译的项目目录中,我使用以下命令运行容器。
# To compile native deps in node_modules (runs `npm rebuild`)
docker run --rm -v "$PWD":/var/task lambci/lambda:build-nodejs8.10
9/10次编译步骤成功完成,但是在node postinstall
步骤中出错,并出现ENOENT
错误,该错误正在寻找无服务器(下面的完整输出)。
> node-snowball@0.2.0 install /var/task/node_modules/node-snowball
> node-gyp rebuild
make: Entering directory `/var/task/node_modules/node-snowball/build'
CXX(target) Release/obj.target/snowball/src/snowball.o
...
CC(target) Release/obj.target/snowball/src/libstemmer/src_c/stem_UTF_8_turkish.o
SOLINK_MODULE(target) Release/obj.target/snowball.node
COPY Release/snowball.node
make: Leaving directory `/var/task/node_modules/node-snowball/build'
> spawn-sync@1.0.15 postinstall /var/task/node_modules/spawn-sync
> node postinstall
npm ERR! path /var/task/node_modules/serverless/bin/serverless
npm ERR! code ENOENT
npm ERR! errno -2
npm ERR! syscall chmod
npm ERR! enoent ENOENT: no such file or directory, chmod '/var/task/node_modules/serverless/bin/serverless'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent
npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2019-02-21T11_46_54_327Z-debug.log
但是在我的项目目录中,我可以看到无服务器文件在那里。
my-app-directory/
|__node_modules/
|__serverless/
|__bin/
|__serverless
更令人困惑的是,该操作将成功完成1/10次而不会引发任何错误(下面的输出)。
> node-snowball@0.2.0 install /var/task/node_modules/node-snowball
> node-gyp rebuild
make: Entering directory `/var/task/node_modules/node-snowball/build'
CXX(target) Release/obj.target/snowball/src/snowball.o
...
CC(target) Release/obj.target/snowball/src/libstemmer/src_c/stem_UTF_8_turkish.o
SOLINK_MODULE(target) Release/obj.target/snowball.node
COPY Release/snowball.node
make: Leaving directory `/var/task/node_modules/node-snowball/build'
> spawn-sync@1.0.15 postinstall /var/task/node_modules/spawn-sync
> node postinstall
> serverless@1.37.1 postinstall /var/task/node_modules/serverless
> node ./scripts/postinstall.js
aws-sdk@2.404.0 /var/task/node_modules/aws-sdk
...
serverless@1.37.1 /var/task/node_modules/serverless
async@1.5.2 /var/task/node_modules/serverless/node_modules/async
raven@1.2.1 /var/task/node_modules/raven
uuid@3.0.0 /var/task/node_modules/raven/node_modules/uuid
uuid@2.0.3 /var/task/node_modules/serverless/node_modules/uuid
是什么原因导致这种不一致的行为,我该如何解决?
答案 0 :(得分:2)
直到无服务器删除自动完成(tabtab)依赖项之前,一种解决方案是运行docker命令以仅重建需要它的模块,而不是重建所有模块的默认模块。
因此,在您的情况下,如果您只需要重建节点-雪球,则可以使用此命令
# only rebuild node-snowball
docker run --rm -v "$PWD":/var/task lambci/lambda:build-nodejs8.10 npm rebuild node-snowball