Glue可正常导入pg8000包,Lambda用同包却报错,需重新打包吗?
问题解析与解决方案
是的,你需要针对Lambda层重新打包pg8000库,核心原因是Glue与Lambda对Python包的目录结构要求存在差异:
- Glue的兼容逻辑:Glue允许直接上传包含模块文件的zip包,无论是否嵌套目录,它都会自动将zip内的根路径加入Python搜索路径,所以你当前的包能正常工作。
- Lambda层的强制要求:Lambda层的Python包必须放在
python/子目录下。也就是说,你的pg8000.zip解压后,必须呈现python/pg8000/的层级结构(包含库的所有核心文件及元数据目录),而非将pg8000的文件直接放在zip根目录。
重新打包步骤
- 解压现有pg8000.zip文件
- 创建名为
python的文件夹,将解压得到的pg8000目录以及对应的.dist-info元数据目录移动到python文件夹内 - 重新压缩
python文件夹为zip包(注意:压缩时需选中python文件夹本身,而非直接压缩其内部内容) - 将新zip包上传至S3的
mybucket/devops/路径(可替换原文件或使用新文件名) - 更新CloudFormation模板中的
S3Key字段,指向新生成的zip包
验证正确目录结构
重新打包后的zip解压后应呈现如下结构:
python/ ├── pg8000/ │ ├── __init__.py │ ├── ...(库的其他核心文件) └── pg8000-x.x.x.dist-info/ ├── ...(库的元数据文件)
这样Lambda加载层时,会自动将/opt/python路径加入Python的搜索路径,就能正确导入pg8000模块了。
内容的提问来源于stack exchange,提问作者Johnson Manion
相关产品推荐
相关产品推荐

