AWS Lambda报错无法导入psycopg2模块,求技术解决方案
解决AWS Lambda导入psycopg2失败的问题
问题重现
导入模块时触发错误:
[ERROR] Runtime.ImportModuleError: Unable to import module 'expire_invites': No module named 'psycopg2'
已通过Terraform创建Lambda及psycopg2依赖层,Lambda创建成功但依赖无法识别,尝试过更换Python3.7适配包、用requirements.txt结合null_resource安装依赖均无效。
核心原因与解决方案
1. 修正Lambda层的zip包目录结构
Lambda的Python依赖层必须遵循固定目录结构:python/lib/<python版本>/site-packages/,依赖包需放在这个路径下才能被Lambda识别。
当前配置直接打包了psycopg2文件夹,导致zip内没有正确的层级,Lambda无法找到模块。调整步骤:
- 在
../../scripts/python/expire_invites/下创建目录结构:python/lib/python3.6/site-packages/ - 将下载的psycopg2包所有文件移入
site-packages/目录 - 修改Terraform的
archive_file配置,将source_dir指向最外层的python目录:
data "archive_file" "psycopg2_layer" { type = "zip" source_dir = "${path.module}/../../scripts/python/expire_invites/python" output_path = "${path.module}/../../scripts/python/expire_invites/psycopg2_layer.zip" }
2. 验证层包结构
解压生成的psycopg2_layer.zip,确认内部路径为:
python/ └── lib/ └── python3.6/ └── site-packages/ └── psycopg2/ ├── ...(psycopg2的所有文件)
若结构不符,重新调整目录后再打包。
3. 确保依赖包与Lambda环境兼容
Lambda运行在Amazon Linux 2环境中,普通环境编译的psycopg2可能存在兼容性问题:
- 若使用第三方预编译包,必须选择对应Python版本(如3.6)且适配Amazon Linux 2的版本
- 更可靠的方式是用Docker在Lambda兼容环境中编译依赖:
docker run -v "$(pwd):/var/task" lambci/lambda:build-python3.6 pip install psycopg2-binary -t python/lib/python3.6/site-packages/
编译完成后直接打包python目录作为层即可。
4. 核对运行时一致性
如果切换到Python3.7的包,需同步修改:
aws_lambda_layer_version的compatible_runtimes为["python3.7"]aws_lambda_function的runtime为python3.7
内容的提问来源于stack exchange,提问作者Christopher Moura
相关产品推荐
相关产品推荐

