使用 CDK 部署时,Lambda 无法从外部文件夹中找到模块

Las*_*apa 7 amazon-web-services aws-lambda aws-cdk

我正在使用 cdk 将一些 api 部署到 API Gateway。我的问题是包含 lambda(index.ts) 的文件无法导入该文件夹(名为 的文件夹get-users)之外的任何文件或 npm 模块。

我尝试将 node_modules 文件夹和其他文件(位于文件夹之外get-users)复制到该文件夹​​中get-users,并且效果很好。

导入lodash时的示例错误如下,

"errorType": "Runtime.ImportModuleError",
"errorMessage": "Error: Cannot find module 'lodash'",
"stack": [
    "Runtime.ImportModuleError: Error: Cannot find module 'lodash'",
Run Code Online (Sandbox Code Playgroud)

lodash按如下方式导入,

import * as _ from "lodash";
Run Code Online (Sandbox Code Playgroud)

我按如下方式导入共享文件,

import { validator } from "./shared/validators" // This one works

import { validator } from "../../shared/validators" // This one doesn't work
Run Code Online (Sandbox Code Playgroud)

Las*_*apa 4

经过一番研究后我找到了答案。问题是 CDK 未部署 node_modules 文件夹以及包含 lambda 源文件的文件夹之外的其他文件夹。

创建 lambda 文件时,必须将根路径添加到“code”属性中,以便它将获取其中的所有文件夹/文件并部署到 lambda。

    const pathToRoot = //absolute path to the root folder
    const pathToHandler = //path to handler from root folder
    const lambdaFunction: Function = new Function(construct, name, {
        functionName: name,
        code: Code.asset(pathToRoot),
        handler: `${pathToHandler}/index.handler`,
        runtime: Runtime.NODEJS_10_X
    });
Run Code Online (Sandbox Code Playgroud)

更新

经过更多研究发现处理此问题的最佳方法是使用Lambda Layers。我已将节点模块文件夹添加为一层。