Lambda执行报错:无法从botocore.compat导入awscrt依赖
解决Lambda中
cannot import name 'awscrt' from 'botocore.compat'错误 1. 确认Layer与Lambda运行时Python版本完全匹配
Lambda运行时用的是Python 3.10,打包Layer时必须使用完全相同版本的Python环境(比如用Docker的public.ecr.aws/sam/build-python3.10镜像,或本地用pyenv创建3.10虚拟环境)。跨版本打包的依赖会出现兼容性问题,直接导致awscrt无法被正确识别。
2. 重新打包awscrt Layer(避免本地环境干扰)
用Docker隔离环境打包,确保依赖适配Lambda运行时:
# 创建临时目录并安装依赖 docker run --rm -v "$PWD":/var/task public.ecr.aws/sam/build-python3.10:latest /bin/sh -c " mkdir -p python/lib/python3.10/site-packages/ pip install awscrt -t python/lib/python3.10/site-packages/ exit" # 打包成Layer压缩包 zip -r awscrt-layer.zip python/
将这个压缩包上传为新的Lambda Layer,替换原Layer。
3. 匹配Botocore与awscrt的版本兼容关系
Lambda自带的Botocore版本和awscrt存在版本绑定:
- 先在Lambda测试代码中运行以下命令,获取当前Botocore版本:
import botocore print(botocore.__version__) - 根据Botocore版本安装对应版本的awscrt(比如Botocore 1.29.x对应awscrt 0.16.x),打包Layer时指定版本:
pip install awscrt==0.16.20 -t python/lib/python3.10/site-packages/
4. 强制优先加载Layer中的依赖
Lambda自带的Botocore可能和Layer依赖冲突,在代码开头添加以下内容,让Python优先读取Layer中的依赖:
import sys # 将Layer的依赖路径插入到sys.path最前面 sys.path.insert(0, '/opt/python/lib/python3.10/site-packages')
5. 替代方案:改用requests-aws4auth实现SigV4签名
如果以上方法仍无效,可以避开awscrt依赖,用更轻量的requests-aws4auth库实现签名:
- 打包包含
requests和requests-aws4auth的Layer - 核心代码示例:
import requests from requests_aws4auth import AWS4Auth import boto3 session = boto3.Session() creds = session.get_credentials() aws_auth = AWS4Auth(creds.access_key, creds.secret_key, session.region_name, '目标服务的服务名') response = requests.post('https://目标服务端点', json=你的payload, auth=aws_auth) return response.json()
内容的提问来源于stack exchange,提问作者Vesko Vujovic
相关产品推荐
相关产品推荐

