使用AWS CDK部署Python Lambda如何导入requirements.txt中的依赖?
带第三方依赖的Python Lambda AWS CDK 部署方案
核心逻辑说明
AWS Lambda运行时不会自动安装项目下requirements.txt定义的依赖,所有依赖需要在部署阶段提前打包到部署包或Lambda Layer中,运行时直接加载。CDK原生支持直接传入预构建的zip包,也支持通过构建配置自动打包代码和依赖,不需要额外手动操作。
方案一:Lambda Layer 实现(推荐,依赖可复用)
适合多Lambda共享同一套依赖的场景,依赖单独分层,减少重复部署体积。
步骤1:定义Lambda依赖层
在stack/ias_stack.py中添加Layer定义,将lambda/requirements.txt中的依赖打包到符合Lambda Layer规范的目录结构中:
from aws_cdk import ( Stack, Duration, aws_lambda as _lambda, BundlingOptions ) from constructs import Construct class IasStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # 定义Lambda依赖层 lambda_deps_layer = _lambda.LayerVersion( self, "PythonLambdaDepsLayer", code=_lambda.Code.from_asset( # 以lambda目录为构建上下文 path="lambda", bundling=BundlingOptions( # 打包镜像和Lambda运行时版本保持一致 image=_lambda.Runtime.PYTHON_3_10.bundling_image, command=[ "bash", "-c", # 将依赖安装到构建输出目录的python文件夹下(Lambda Layer规范要求) "pip install -r requirements.txt -t /asset-output/python" ] ) ), # 兼容的运行时版本和Lambda保持一致 compatible_runtimes=[_lambda.Runtime.PYTHON_3_10], description="Python Lambda 第三方依赖层" )
步骤2:绑定Layer部署业务Lambda
继续在Stack中定义Lambda函数,直接上传lambda目录下的业务代码,绑定上述依赖层即可:
# 定义业务Lambda函数 business_lambda = _lambda.Function( self, "BusinessLambda", runtime=_lambda.Runtime.PYTHON_3_10, # 对应lambda/handler.py中的lambda_handler入口函数 handler="handler.lambda_handler", # 直接上传lambda目录下的业务代码 code=_lambda.Code.from_asset("lambda"), # 绑定依赖层 layers=[lambda_deps_layer], memory_size=256, timeout=Duration.seconds(30) )
方案二:单包直接部署(适合单Lambda场景)
不需要单独维护Layer,直接将业务代码和依赖打包为单个部署包,和Terraform上传zip的逻辑完全一致:
from aws_cdk import ( Stack, Duration, aws_lambda as _lambda, BundlingOptions ) from constructs import Construct class IasStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) business_lambda = _lambda.Function( self, "BusinessLambda", runtime=_lambda.Runtime.PYTHON_3_10, handler="handler.lambda_handler", code=_lambda.Code.from_asset( path="lambda", bundling=BundlingOptions( image=_lambda.Runtime.PYTHON_3_10.bundling_image, command=[ "bash", "-c", # 同时将依赖和业务代码复制到构建输出目录,直接打包为部署包 "pip install -r requirements.txt -t /asset-output && cp -r . /asset-output" ] ) ), memory_size=256, timeout=Duration.seconds(30) )
方案三:直接使用预构建zip包
如果你已经在本地或CI/CD流程中提前打包好了包含代码和依赖的zip包,CDK原生支持直接传入zip包路径:
business_lambda = _lambda.Function( self, "BusinessLambda", runtime=_lambda.Runtime.PYTHON_3_10, handler="handler.lambda_handler", # 直接传入预构建zip包的路径 code=_lambda.Code.from_asset("path/to/your/prebuilt/lambda.zip"), memory_size=256, timeout=Duration.seconds(30) )
注意事项
- 运行时版本需要统一:依赖层打包镜像、依赖层兼容运行时、Lambda函数运行时三个配置必须完全一致,避免出现二进制依赖兼容问题。
- 含二进制的依赖(如numpy、pandas)必须使用Lambda对应架构的官方构建镜像打包,不要在本地Mac/Windows环境打包后上传,避免运行时加载失败。
- 可在
lambda目录下新增.dockerignore文件,排除__pycache__、.git等不必要文件,减少部署包体积。
内容的提问来源于stack exchange,提问作者Raymond Chenon
相关产品推荐
相关产品推荐

