Lambda Python 3.9运行时botocore导入DEPRECATED_SERVICE_NAMES报错求助
解决Lambda Python 3.9中"cannot import name 'DEPRECATED_SERVICE_NAMES' from 'botocore.docs'"的问题
以下是无需手动添加完整botocore包的解决思路:
排查第三方依赖冲突
大概率是你的代码依赖的某个第三方包(比如awscli、特定AWS SDK封装库)强制要求了与Lambda默认版本不兼容的botocore版本,导致导入时寻找不存在的变量。- 运行
pip freeze列出所有依赖包,检查requirements.txt内容 - 定位到指定了botocore版本范围的包
- 要么将该包更新到兼容Lambda默认botocore的版本,要么用
pip install --no-deps [包名]安装,避免它替换Lambda自带的botocore
- 运行
适配Lambda默认botocore版本
Lambda的Python 3.9运行时自带的botocore版本可能已更新,DEPRECATED_SERVICE_NAMES这个变量可能被移除或迁移到了其他模块:- 在Lambda函数中添加代码打印当前版本:
import botocore; print(botocore.__version__) - 查看对应版本的botocore源码或文档,确认该变量的状态
- 如果是你自己的代码导入了这个变量,替换为当前版本的等效实现(比如改用botocore中判断服务废弃的其他API)
- 在Lambda函数中添加代码打印当前版本:
清理部署包冗余文件
本地开发环境的botocore文件夹可能被误打包进部署包,导致Lambda加载本地旧版本,与默认运行时版本冲突:- 打包时排除本地的boto3、botocore目录,例如使用zip命令:
zip -r function.zip . -x "*/botocore/*" "*/boto3/*" - 检查部署包内容,确保未包含这两个文件夹
- 打包时排除本地的boto3、botocore目录,例如使用zip命令:
用轻量级层隔离依赖
如果确实需要特定依赖,不要打包整个botocore,而是将冲突的第三方包单独做成Lambda层,既不会大幅增加体积,又能隔离依赖避免影响Lambda默认的botocore
内容的提问来源于stack exchange,提问作者Elad Hazan
相关产品推荐
相关产品推荐

