从 lambda 层加载时无服务器离线未定义模块
Serverless Offline undefined module when loaded from lambda layer
我有以下项目树
其中nodejs文件夹是下面定义的lambda层serverless.yaml
service: aws-nodejs # NOTE: update this with your service name
provider:
name: aws
runtime: nodejs8.10
stage: dev
plugins:
- serverless-offline
layers:
layer1:
path: nodejs # required, path to layer contents on disk
name: ${self:provider.stage}-layerName # optional, Deployed Lambda layer name
functions:
hello:
handler: handler.hello
layers:
- {Ref: Layer1LambdaLayer}
events:
- http:
path: /dev
method: get
layer1只包含UUID包。
所以当我尝试使用无服务器离线插件在本地 运行 lambda 时,它说找不到模块 UUID。
但是当我将代码部署到 AWS 时,它 运行 就像一个魅力。
有什么方法可以在本地获取 lambda 层 运行ning 以进行测试?并加快发展速度?
或者有什么方法可以让我在开发过程中动态设置 node_module 路径以指向层文件夹,一旦我需要推送到生产环境,它就会将路径更改为正确的路径
好的,经过多次试验,我找到了一个可行的解决方案
我添加了一个 npm 运行 命令,该命令将临时 node_module 路径导出到路径列表
"scripts": {
"offline": "export NODE_PATH=\"${PWD}/nodejs/node_modules\" && serverless offline"
},
因此,节点可以在子文件夹中查找节点模块
顺便说一句,这个问题已在 sls 1.49.0 中修复。
刚刚 运行:
sudo npm i serverless
那么你应该在serverless.yml的图层部分
指定包包含
service: aws-nodejs # NOTE: update this with your service name
provider:
name: aws
runtime: nodejs8.10
stage: dev
plugins:
- serverless-offline
layers:
layer1:
path: nodejs # required, path to layer contents on disk
package:
include:
- node_modules/**
name: ${self:provider.stage}-layerName # optional, Deployed Lambda layer name
functions:
hello:
handler: handler.hello
layers:
- {Ref: Layer1LambdaLayer}
events:
- http:
path: /dev
method: get
nodejs10.x运行时间
测试
我通过在容器中 运行 无服务器离线解决了这个问题,并使用 gulp 将我的层复制到 /opt/ 目录中。我设置了一个 gulp 手表来监视任何图层更改并将它们复制到 /opt/ 目录。
我通过从本地文件系统安装一个层作为开发依赖来在无服务器离线中使用层。
npm i <local_path_to_my_layer_package> --save-dev
我有以下项目树
其中nodejs文件夹是下面定义的lambda层serverless.yaml
service: aws-nodejs # NOTE: update this with your service name
provider:
name: aws
runtime: nodejs8.10
stage: dev
plugins:
- serverless-offline
layers:
layer1:
path: nodejs # required, path to layer contents on disk
name: ${self:provider.stage}-layerName # optional, Deployed Lambda layer name
functions:
hello:
handler: handler.hello
layers:
- {Ref: Layer1LambdaLayer}
events:
- http:
path: /dev
method: get
layer1只包含UUID包。
所以当我尝试使用无服务器离线插件在本地 运行 lambda 时,它说找不到模块 UUID。
但是当我将代码部署到 AWS 时,它 运行 就像一个魅力。
有什么方法可以在本地获取 lambda 层 运行ning 以进行测试?并加快发展速度?
或者有什么方法可以让我在开发过程中动态设置 node_module 路径以指向层文件夹,一旦我需要推送到生产环境,它就会将路径更改为正确的路径
好的,经过多次试验,我找到了一个可行的解决方案
我添加了一个 npm 运行 命令,该命令将临时 node_module 路径导出到路径列表
"scripts": {
"offline": "export NODE_PATH=\"${PWD}/nodejs/node_modules\" && serverless offline"
},
因此,节点可以在子文件夹中查找节点模块
顺便说一句,这个问题已在 sls 1.49.0 中修复。 刚刚 运行:
sudo npm i serverless
那么你应该在serverless.yml的图层部分
指定包包含service: aws-nodejs # NOTE: update this with your service name
provider:
name: aws
runtime: nodejs8.10
stage: dev
plugins:
- serverless-offline
layers:
layer1:
path: nodejs # required, path to layer contents on disk
package:
include:
- node_modules/**
name: ${self:provider.stage}-layerName # optional, Deployed Lambda layer name
functions:
hello:
handler: handler.hello
layers:
- {Ref: Layer1LambdaLayer}
events:
- http:
path: /dev
method: get
nodejs10.x运行时间
测试我通过在容器中 运行 无服务器离线解决了这个问题,并使用 gulp 将我的层复制到 /opt/ 目录中。我设置了一个 gulp 手表来监视任何图层更改并将它们复制到 /opt/ 目录。
我通过从本地文件系统安装一个层作为开发依赖来在无服务器离线中使用层。
npm i <local_path_to_my_layer_package> --save-dev