如何通过CDK部署含多模块的Lambda函数并解决lib模块导入报错
问题根因
你当前使用的lambda_.InlineCode仅会上传单个makeQ.py的代码内容,不会携带同级的lib目录及目录下的自定义模块,同时你配置的handler="index.main"和实际入口文件名makeQ.py不匹配,两个问题共同导致了导入报错。
解决方案
放弃使用仅支持单文件上传的内联代码方式,改用lambda_.Code.from_asset指定Lambda代码所在的根目录,CDK会自动将整个目录(包括所有子目录、文件)打包上传到Lambda运行环境。
调整后的实现示例
1. 目录结构不需要改动,保持原有结构即可:
./ |- makeQ.py |- lib/ |- module1.py |- app.py
2. 修正后的app.py代码
from aws_cdk import ( aws_lambda as lambda_, core, ) class MyStack(core.Stack): def __init__(self, app: core.App, id: str) -> None: super().__init__(app, id) makeQFn = lambda_.Function( self, "Singleton", function_name='makeQ', # 直接指定当前目录为代码资产目录,CDK会全量打包上传 code=lambda_.Code.from_asset("./"), # 入口为makeQ.py中的main函数,修正handler配置 handler="makeQ.main", timeout=core.Duration.seconds(300), runtime=lambda_.Runtime.PYTHON_3_7, ) app = core.App() MyStack(app, "MyStack") app.synth()
额外说明
- 如果你希望Lambda代码和CDK工程代码分离,可以单独创建
lambda_src目录,将makeQ.py和lib目录移入该文件夹,之后将code参数改为lambda_.Code.from_asset("./lambda_src")即可,避免CDK相关的配置文件被意外上传到Lambda环境。 - 如果你的代码还依赖第三方Python库,可以在
lambda_src目录下执行pip install 依赖包名 -t ./将依赖安装到当前目录,打包时会一同上传,或者单独封装为Lambda层挂载使用。
内容的提问来源于stack exchange,提问作者nemy
相关产品推荐
相关产品推荐

