【问题标题】:AWS lambda layers error when call API "cannot find module"调用 API“找不到模块”时出现 AWS lambda 层错误
【发布时间】:2020-08-03 03:55:42
【问题描述】:

我尝试使用 AWS Lambda 层,观看了有关它的教程,但我收到错误“找不到模块...”

service: aws-nodejs 

package:
  exclude:
    - .gitignore
    - package.json
    - .git/**

provider:
  name: aws
  profile: sandbox
  runtime: nodejs12.x

layers:
  testLayer:
    path: testLayer
    compatibleRuntimes:
      - nodejs12.x
    allowedAccounts:
      - '*'

functions:
  hello:
    handler: handler.hello
    layers:
      -  arn:aws:lambda:us-east-1:*:layer:testLayer:15
    events:
      - http:
          path: test
          method: get
          cors: true

当我部署它时,我的终端没有任何错误,在 AWS 上,我看到了我的层,当我下载它时,我有我的 package.json 与时刻依赖,以及 node_modules 文件夹与时刻

我的 handler.js 看起来像这样:

'use strict';
module.exports.hello = async (event, context) => {
    const moment = require('moment')
    const a = moment('2016-01-01')
  return {
    statusCode: 200,
    body: JSON.stringify({
      message: 'Hey' + a
    }),
  };
};

我的文件结构:

testLayer/
   node_modules/
      moment/
   package.json
serverless.yml
handler.js
package.json

你知道我做错了什么吗?

【问题讨论】:

    标签: amazon-web-services aws-lambda aws-lambda-layers


    【解决方案1】:

    是的,您的节点模块可能在您的 lambda 层中,但 lambda 抛出“找不到模块..”的错误。

    这可能是因为您创建的 zip 不符合 AWS documentation. 中提到的目录结构

    根据官方文档:

    在层中包含库依赖项您可以移动运行时 通过将它们放置在一个层中来摆脱函数代码的依赖关系。 Lambda 运行时在 /opt 目录中包含路径,以确保 您的函数代码可以访问包含在 层。

    要在图层中包含库,请将它们放在其中一个文件夹中 您的运行时支持。

    Node.js – nodejs/node_modules, nodejs/node8/node_modules (NODE_PATH)

    适用于 Node.js 的示例 AWS X-Ray 开发工具包

    nodejs/node_modules/aws-xray-sdk
    

    确保您的 zip 包含正确的目录结构,否则请尝试从 /opt/your_node_module_directory 导入您的模块

    【讨论】:

    • 感谢您的回答,我在 testLayer 中添加了一个 nodejs 文件夹,并在其中添加了 package.json 和 node_modules,它可以正常工作 感谢您的帮助
    • 我很高兴,我能够提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-20
    • 2021-11-07
    • 2020-10-14
    • 2019-11-27
    • 1970-01-01
    • 2017-06-04
    • 2015-08-21
    相关资源
    最近更新 更多