AWS Lambda添加CloudFront KeyValueStore遇botocore/awscrt依赖问题
解决AWS Lambda中CloudFront KeyValueStore的MissingDependencyException问题
问题根源
Lambda运行在Amazon Linux 2环境中,你本地安装的awscrt依赖系统底层库,和Lambda环境不兼容,直接打包本地的依赖文件会导致运行时找不到正确的依赖库,从而抛出异常。
解决方案1:用Docker模拟Lambda环境构建兼容依赖
这是最可靠的解决方式,能确保依赖和Lambda运行环境完全匹配:
- 拉取对应架构的Lambda Python基础镜像(x86_64用
public.ecr.aws/lambda/python:3.11,arm64用public.ecr.aws/lambda/python:3.11-arm64,替换成你实际使用的Python版本) - 在容器内将依赖安装到指定目录:
- 如果是直接打包函数代码,安装到当前工作目录:
docker run -v "$PWD:/var/task" public.ecr.aws/lambda/python:3.11 /bin/bash -c "pip install botocore[crt] awscrt boto3 -t /var/task/" - 如果准备用Lambda层托管依赖,安装到
python子目录:mkdir -p python/lib/python3.11/site-packages docker run -v "$PWD:/var/task" public.ecr.aws/lambda/python:3.11 /bin/bash -c "pip install botocore[crt] awscrt boto3 -t /var/task/python/lib/python3.11/site-packages/"
- 如果是直接打包函数代码,安装到当前工作目录:
- 将生成的依赖文件和你的Lambda代码一起打包成zip。
解决方案2:使用Lambda层托管依赖
把依赖单独打包成Lambda层,既能避免代码打包时的路径问题,也方便后续复用:
- 按照上面的步骤用Docker构建好
python目录结构的依赖 - 将
python文件夹打包成zip:zip -r cf-kvs-deps.zip python/ - 在AWS控制台创建新的Lambda层,上传这个zip包,然后将该层附加到你的目标Lambda函数上。
额外检查点
- 不要手动复制本地的
botocore、awscrt、boto3文件夹到zip,本地环境的依赖和Lambda环境不兼容,必须用匹配的环境构建。 - 确认Lambda函数的Python运行时版本和你构建依赖时使用的版本一致(比如都是3.11)。
- 查看Lambda函数的CloudWatch日志,确认错误是否还是依赖缺失,若提示具体系统库找不到,说明必须用Docker构建来获取兼容的二进制依赖。
内容的提问来源于stack exchange,提问作者Tomer Fikler
相关产品推荐
相关产品推荐

