在AWS Lambda中导入Rasterio时出现AttributeError错误
在AWS Lambda中导入Rasterio时出现AttributeError错误
这个问题我之前也踩过坑,根源其实是跨平台构建Lambda层导致的兼容性问题,咱们来拆解一下原因和解决办法:
错误原因
你是在Windows环境下打包的Python 3.10版本Rasterio层,但AWS Lambda的运行环境是Linux(比如Amazon Linux 2)。Windows版本的Rasterio依赖里会用到Windows特有的os.add_dll_directory方法,而Linux版的Python标准库os模块根本没有这个属性,所以当Lambda在Linux环境下导入Rasterio时,就会触发这个AttributeError。
解决办法
方法一:用Lambda兼容的Linux环境打包层
最稳妥的方式是用和Lambda一致的Linux环境来构建依赖,推荐用Docker模拟:
- 第一步:拉取Lambda官方的Python 3.10镜像
docker pull public.ecr.aws/lambda/python:3.10 - 第二步:启动容器并挂载本地目录,进入交互模式
docker run -v "$PWD":/var/task -it public.ecr.aws/lambda/python:3.10 bash - 第三步:在容器内安装Rasterio到指定目录(Lambda层的目录结构要求是
python/lib/python3.10/site-packages/)pip install rasterio -t python/lib/python3.10/site-packages/ - 第四步:退出容器后,把
python目录打包成zip文件,上传到Lambda作为层即可。
方法二:使用现成的兼容层
如果你不想自己折腾构建,可以找已经编译好、适配Lambda Linux环境的Rasterio层,注意一定要匹配Python 3.10版本,避免版本不兼容的问题。
额外注意事项
- 打包层的时候,记得清理掉Windows系统生成的冗余文件(比如
.dll文件、__pycache__里的Windows字节码),只保留Linux环境的依赖文件。 - 确认Lambda的运行时版本和你构建层的Python版本完全一致(都是3.10),版本不匹配也可能引发奇怪的导入错误。
备注:内容来源于stack exchange,提问作者Foncho
相关产品推荐
相关产品推荐

