You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 22:07:33