从lambda层加载时,无服务器的脱机未定义模块

时间:2019-04-09 10:03:00

标签: amazon-web-services serverless-framework serverless

我有以下项目树

enter image description here

nodejs文件夹是在以下serverless.yaml中定义的lambda层

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层在本地运行以进行测试?为了加快发展速度?

或者有什么方法可以在开发过程中动态设置node_module路径以指向图层文件夹,一旦我需要投入生产,它将更改为正确的路径

4 个答案:

答案 0 :(得分:4)

好几次尝试后,我找到了可行的解决方案

我添加了一个npm run命令,该命令将临时的node_module路径导出到路径列表中

"scripts": {
    "offline": "export NODE_PATH=\"${PWD}/nodejs/node_modules\" && serverless offline"
  },

因此,节点可以在子文件夹中查找节点模块

答案 1 :(得分:0)

我通过在容器中运行serverless-offline并使用gulp将各层复制到/ opt /目录中来解决此问题。我设置了一个gulp watch来监视所有图层更改并将其复制到/ opt /目录。

答案 2 :(得分:0)

我通过从本地文件系统安装一个层作为开发依赖项,在无服务器脱机状态下使用层。

import { Dimensions } from 'react-native';

const { width, height } = Dimensions.get('window');

答案 3 :(得分:-1)

顺便说一句,此问题已在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运行时上测试