首页 > 解决方案 > 调用 API“找不到模块”时出现 AWS lambda 层错误

问题描述

我尝试使用 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-servicesaws-lambdaaws-lambda-layers

解决方案


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

这可能是因为您创建的 zip 与AWS 文档中提到的目录结构不同。

根据官方文档:

在层中包含库依赖项 您可以将运行时依赖项从函数代码中移出,方法是将它们放在层中。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


推荐阅读