You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:18:00