调用 API“找不到模块”时出现 AWS lambda 层错误

dc-*_*mpo 5 amazon-web-services aws-lambda aws-lambda-layers

我尝试使用无服务器 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
Run Code Online (Sandbox Code Playgroud)

当我部署它时,我的终端中没有任何错误,在 AWS 上,我看到了我的层,当我下载它时,我有我的 package.json 和 moment 依赖项,以及带有 moment 的 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
    }),
  };
};
Run Code Online (Sandbox Code Playgroud)

我的文件结构:

testLayer/
   node_modules/
      moment/
   package.json
serverless.yml
handler.js
package.json
Run Code Online (Sandbox Code Playgroud)

你知道我做错了什么吗?

Rah*_*oel 15

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

\n

发生这种情况的原因可能是您创建的 zip 不符合AWS 文档中提到的目录结构。

\n

根据官方文档:

\n
\n

在层中包含库依赖项您可以通过将运行时\n依赖项放入层中来将其从函数代码中移出。\nLambda 运行时包含 /opt 目录中的路径,以确保\n您的函数代码可以访问包含在\n中的库。 n层。

\n

要将库包含在层中,请将它们放置在运行时支持的\n文件夹之一中。

\n

Node.js \xe2\x80\x93 nodejs/node_modules、nodejs/node8/node_modules (NODE_PATH)

\n

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

\n
nodejs/node_modules/aws-xray-sdk\n
Run Code Online (Sandbox Code Playgroud)\n
\n

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

\n