关于无服务器:无服务器 – Lambda 层 \\”找不到模块 \\’request\\’\\”

Serverless - Lambda Layers "Cannot find module 'request'"

当我使用以下方式部署无服务器 API 时:

1
serverless deploy

创建了 lambda 层,但是当我运行该函数时,出现此错误:

1
"Cannot find module 'request'"

但如果我通过控制台手动上传 .zip 文件(与我部署时上传的完全相同的文件),它可以正常工作。

有人知道为什么会这样吗?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
environment:
SLS_DEBUG:"*"

provider:
name: aws
runtime: nodejs8.10
stage: ${opt:api-type, 'uat'}-${opt:api, 'payment'}
region: ca-central-1
timeout: 30
memorySize: 128
role: ${file(config/prod.env.json):ROLE}
vpc:
    securityGroupIds:
    - ${file(config/prod.env.json):SECURITY_GROUP}
    subnetIds:
    - ${file(config/prod.env.json):SUBNET}
apiGateway:
    apiKeySourceType: HEADER
apiKeys:
    - ${file(config/${opt:api-type, 'uat'}.env.json):${opt:api,"payment"}-APIKEY}

functions:
- '${file(src/handlers/${opt:api,"payment"}.serverless.yml)}'

package:
# individually: true
exclude:
    - node_modules/**
    - nodejs/**

plugins:
- serverless-offline
- serverless-plugin-warmup
- serverless-content-encoding

custom:
contentEncoding:
    minimumCompressionSize: 0 # Minimum body size required for compression in bytes

layers:
nodejs:
    package:
    artifact: nodejs.zip
    compatibleRuntimes:
    - nodejs8.10
    allowedAccounts:
    -"*"

这就是我的无服务器 yaml 脚本的样子。


如果有人遇到类似的问题 Runtime.ImportModuleError,可以公平地说,这个问题的另一个原因可能是 serverless.yml 文件中的包排除语句。

请注意,如果您有以下声明:

1
2
3
4
5
6
package:
  exclude:
    - './**'
    - '!node_modules/**'
    - '!dist/**'
    - '.git/**'

一旦您部署了 lambda 函数(使用无服务器框架),它将在运行时导致完全相同的错误。只是,确保删除可能在您的依赖项之间产生冲突的那些


确保在部署之前在层内运行 npm install,即:

1
cd ~/repos/repo-name/layers/utilityLayer/nodejs && npm install

否则,您的层将在没有 node_modules 文件夹的情况下部署。您可以从 Lambda UI 下载层的 .zip 以确认该层的内容。


在使用显式 layers 键定义 lambda 层时,我遇到了类似的错误。

我的错误(为了网络搜索)是这样的:

Runtime.ImportModuleError: Error: Cannot find module <package name>

我觉得这是一个临时解决方案 b/c 我想像你一样明确定义我的层,但它不起作用,所以它看起来像一个错误。

我为这个问题在无服务器中创建了一个错误报告。如果其他人遇到同样的问题,他们可以在那里进行跟踪。

解决方案

我根据 AWS 的这些文档在无服务器论坛中关注了这篇文章。

我将我的 node_modules 压缩到文件夹 nodejs 下,所以解压缩时看起来像这样 nodejs/node_modules/<various packages>.

然后我没有使用层的显式定义,而是使用 packageartifact 键,如下所示:

1
2
3
4
layers:
  test:
    package:
      artifact: test.zip

在功能层是这样称呼的:

1
2
3
4
5
functions:
  function1:
    handler: index.handler
    layers:
      - { Ref: TestLambdaLayer }

TestLambdaLayer<your name of layer>LambdaLayer 的约定,如此处所述


我正在使用带有 serverless-plugin-typescript 的typescript,我也遇到了同样的错误。

当我从

切换时

1
const myModule = require('./src/myModule');

1
import myModule from './src/myModule';

错误消失了。当我使用 require.

时,似乎 serverless 没有将文件包含在 zip 文件中

PS: 移除 serverless-plugin-typescript 并切换回 javascript 也解决了问题。