【问题标题】:Serverless - Lambda Layers "Cannot find module 'request'"无服务器 - Lambda 层“找不到模块‘请求’”
【发布时间】:2019-08-27 14:00:45
【问题描述】:

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

serverless deploy

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

"Cannot find module 'request'"

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

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

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 脚本的样子。

【问题讨论】:

    标签: aws-lambda serverless-framework aws-serverless


    【解决方案1】:

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

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

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

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

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

    解决方案

    我在基于 AWS 的 these docs 的 Serverless 论坛中关注了 this 这篇帖子。

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

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

    layers:
      test:
        package:
          artifact: test.zip
    

    在功能层是这样称呼的:

    functions:
      function1:
        handler: index.handler
        layers:
          - { Ref: TestLambdaLayer }
    

    TestLambdaLayer<your name of layer>LambdaLayer 的约定,如文档中的 here 所述

    【讨论】:

    • 不适合我。仍然错误:Error: Cannot find module './json.js'
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

      请注意,如果您有此声明:

      package:
        exclude:
          - './**'
          - '!node_modules/**'
          - '!dist/**'
          - '.git/**'
      

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

      【讨论】:

        【解决方案4】:

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

        当我切换到

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

        import myModule from './src/myModule';
        

        错误消失了。当我使用require 时,serverless 似乎没有将这些文件包含到 zip 文件中。

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

        【讨论】:

          猜你喜欢
          • 2020-12-17
          • 2022-07-27
          • 1970-01-01
          • 2017-08-10
          • 1970-01-01
          • 2020-10-08
          • 2013-05-05
          • 2019-08-30
          • 1970-01-01
          相关资源
          最近更新 更多