首页 > 解决方案 > 使用 CDK 部署时,Lambda 无法从外部文件夹中找到模块

问题描述

我正在使用 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'",

我正在导入lodash如下,

import * as _ from "lodash";

我正在导入共享文件,如下所示,

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

import { validator } from "../../shared/validators" // This one doesn't work

标签: amazon-web-servicesaws-lambdaaws-cdk

解决方案


如果您的 lambda 函数使用依赖项,您必须将所有内容打包到 ZIP 文件中并告诉 CDK 在哪里可以找到 ZIP。然后它将为您上传到 S3。但包装将是您的责任。您需要包括所有依赖项以及您的代码。

CDK 目前支持 3 种“资产”:

  • InlineCode- 对单行 lambda 有用
  • AssetCode- 没有依赖关系的单文件 lambdas
  • S3Code- 已在 S3 存储桶中上传的现有 lambda 包

对于您的用例,您将需要AssetCode,但不是目录,而是指向本地 ZIP 文件。

相关答案:如何在使用 AWS CDK 构建 cdk 时安装 lambda 函数的依赖项

由于很多人问这个问题,我会看看我是否可以在 Python 中开源我的 lambda 打包结构。如果是,我会在这里链接。

编辑:我开源了一个 CDK 结构,用于 lambda 打包,其中包含 100 多个依赖项,包括 NumPy。

https://gitlab.com/josef.stach/aws-cdk-lambda-asset


推荐阅读