当前位置: 首页 > 知识库问答 >
问题:

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

劳高爽
2023-03-14

我正在使用cdk部署一些API到API网关。我的问题是包含lambda(index.ts)的文件不能导入该文件夹之外的任何文件或npm模块(名为get-user的文件夹)。

我尝试将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

共有3个答案

朱兴运
2023-03-14

我只是想给这个问题一个新的答案。在CDK中,查看aws lambda nodejs模块,该模块未包含在该问题的其他答案中。简而言之,它是为了解决这个问题而设计的。例如,只需使用此contstruct即可将其带来的所有其他功能放在一边:

  const testLambda = new lambda_nodejs.NodejsFunction(this, 'fox-get', {
    runtime: lambda.Runtime.NODEJS_12_X,
    entry: 'lambda/fox-get/fox-get.js',
    handler: 'handler',
    functionName: 'sn-v1-fox-get',
    description: 'Get all devices from fox API.',
    memorySize: 256,
    timeout: Duration.seconds(360)
  });

它将启动docker并产生一个很好的缩小的单个文件。它还允许您在项目中使用节点模块。我还没有这样做过,但是很多其他开发者都做过,你可以很容易地用谷歌搜索他们做了什么。

这对我来说已经足够了。我可以在一个干净的文件夹树中开发lambda函数,避免重复源文件,这就是我所需要的!

养振濂
2023-03-14

在花了一些时间考虑同样的问题后,我终于求助于使用webpack来构建我的lambda包,这绝对是我推荐的方式。

在这种情况下,您要做的是将您的AssetCode指向一个目录,在该目录中,Webpack以前已经打包了整个内容,例如src/your function/build

额外的好处是,您可以配置Webpack来缩小文件,这样您就可以加快部署速度,也可以加快lambda冷启动速度。

方高丽
2023-03-14

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

CDK目前支持3种"资产":

  • InlineCode-对one-line-lambdas有用
  • AssetCode-没有依赖关系的单文件lambdas
  • S3Code-现有lambda包已经上载在S3桶中

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

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

因为有很多人会问这个问题,我将看看是否可以用Python开源我的lambda打包构造。如果是的话,我会把它链接到这里。

编辑:我开放了一个CDK构造,用于lambda打包,包括NumPy在内的一百多个依赖项。

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

 类似资料:
  • 我正在做一个ML项目,利用AWS Lambda构建模型和生成预测。Lambdas是用python编写的,并使用几个ML库,如熊猫、skLearning、Numpy和Scikit学习。这些lambda使用由Lambda层打包的共享代码。我使用AWS CDK进行项目部署。CDK代码是用TypeScript编写的,不要问我为什么要混合Python和TypeScript,这与此情况无关。 由于存在ML库,

  • 我正在完成一个项目,我必须将它部署为一个jar文件,在eclipse中它工作得很好,我的项目依赖于两个库,这两个库也都依赖于dll文件。我已经将这些DLL的路径添加到每个外部JAR的本机库位置。然后,我使用eclipse可运行的jar文件导出向导将project导出为一个jar文件我在指定的位置得到了jar文件,它运行了,但是当我单击一个调用我得到的库之一的按钮时,我得到了java.lang.Un

  • 我想用Lambda函数部署AWS CDK堆栈。用例是支持类似于Trek10无服务器CI/CD管道中描述的功能,相关代码如下。 简而言之,AWS代码管道仅支持在单个Git分支中侦听更改。我想听听与创建repo和分支相关的GitHub事件,并创建代码管道实例来响应这些事件,以便每个Git存储库的每个分支都有一个管道。我想要一个Lambda来监听GitHub事件并创建CDK堆栈。Trek10示例使用Py

  • 我正在使用SpringBoot和thymeleaf从html模板生成文档。 随着模板的不断变化,我希望ti从外部加载模板,只是从外部添加或删除模板,而不是重新部署应用程序。 作为POC,使用/resources文件夹时效果良好。 这就是错误: 解析模板“凭证”时出错,该模板可能不存在,或者任何已配置的模板解析程序都无法访问该模板 这就是背景: applycation.yml 这是我的方法:其中te

  • 我正在尝试使用AWS CDK部署lambda,但它似乎无法正常工作/部署。管道中的“框”为绿色,因此不会返回任何错误。 一切似乎都很好,但是当我手动运行它进行测试时,我收到了下一条消息: 问题是,如果我手动将人工制品下载到我的机器上,并使用上传按钮将其上载,它将正常工作。 我有一个,其中包含,这是我用来创建lambda的堆栈。 然后我有管道,其中一个步骤是构建lambda: 还有更多的步骤,但它们

  • 我无法从dockerfile文件夹的外部复制文件。docker compose build出现错误: 有文件夹结构 这是Dockerfile 这是我的docker compose文件 非常感谢你的帮助。