AWS CDK部署Python Lambda报Unzipped size超262144000字节错误如何解决
该报错是因为AWS Lambda要求函数代码+绑定的所有层解压后的总大小不能超过250MB,你本地打包的依赖(尤其是numpy等带二进制文件的科学计算库)体积过大导致超限,结合你使用CDK的场景,有以下可行解决方案:
- 方案1:精简依赖包体积
你直接本地执行pip安装的依赖会包含多架构二进制、测试文件、文档等冗余内容,可通过以下操作裁剪:
安装依赖时指定Lambda运行时的对应架构,仅安装必要二进制:python -m pip install numpy -t lib/python --platform manylinux2014_x86_64 --only-binary=:all: --no-deps
安装完成后删除lib目录下的__pycache__、.dist-info、测试目录、.pyc等非必要文件,最多可缩减60%以上的依赖体积。
也可以直接使用AWS官方预构建的常用依赖层ARN,无需自己打包,直接在CDK的LayerVersion中指定对应ARN即可,进一步减少打包体积。 - 方案2:拆分依赖为多个Lambda层
Lambda单函数最多支持绑定5个层,单个层解压后最大为50MB,总大小不超过250MB即可。你可以将不同类型的依赖拆分打包到多个层中,比如把numpy、pandas等大体积计算包单独打一个层,其他轻量工具依赖打另一个层,在CDK中声明多个LayerVersion实例,全部加入函数的layers参数即可。 - 方案3:使用容器镜像部署绕过大小限制
如果依赖总大小确实超过250MB,可改用Lambda容器镜像部署模式,该模式支持最大10GB的镜像大小,完全没有解压体积限制。
你只需编写对应的Dockerfile,将依赖和函数代码都打包进镜像,在CDK中替换原有的函数定义即可:
参考Dockerfile示例:makeQFn = lam.DockerImageFunction( self, "Singleton", function_name='makeQ', code=lam.DockerImageCode.from_image_asset('./lambda-image'), # 该目录存放Dockerfile和业务代码 timeout=core.Duration.seconds(300), )FROM public.ecr.aws/lambda/python:3.7 COPY requirements.txt ./ RUN pip install -r requirements.txt --no-cache-dir COPY ./code/* ./ CMD ["makeQ.main"] - 方案4:运行时动态加载大依赖
你可以将大体积依赖单独打包成zip上传到S3,函数启动时先将依赖包下载到/tmp目录(该目录有512MB临时存储空间),再把/tmp路径加入Python的sys.path后导入依赖,这样函数代码和层仅保留核心逻辑,体积会大幅降低。
内容的提问来源于stack exchange,提问作者nemy
相关产品推荐
相关产品推荐

