如何让AWS SAM build缓存生效,避免重复下载Lambda容器依赖?
解决AWS Lambda容器构建重复下载依赖的问题
1. 重构Dockerfile,利用Docker分层缓存
这是解决重复下载问题的核心,Docker会缓存每一层的构建结果,只要某一层的输入没变化,就会直接复用缓存。你需要把依赖安装和代码拷贝的步骤拆分:
- 先把依赖配置文件(比如
requirements.txt、poetry.lock这类锁文件)单独拷贝到容器 - 先执行依赖安装命令
- 最后再拷贝你的Lambda业务代码
示例Dockerfile:
FROM public.ecr.aws/lambda/python:3.11 # 先拷贝依赖文件,这一层只有依赖文件变更时才会重新构建 COPY requirements.txt ${LAMBDA_TASK_ROOT} # 安装依赖,依赖不变时直接用Docker缓存,不会重新下载 RUN pip install -r requirements.txt --target "${LAMBDA_TASK_ROOT}" # 最后拷贝代码,代码修改只会重建这一层,不影响依赖层 COPY app.py ${LAMBDA_TASK_ROOT} CMD ["app.lambda_handler"]
2. 调整SAM Build的使用方式
针对你使用的SAM CLI 1.60.0版本:
- 确保
template.yaml里的函数是Image类型,并且指定了正确的Dockerfile路径 - 执行构建时用
sam build --cached即可,不需要加--beta-features(1.60.0版本的缓存功能已经脱离beta阶段) - 不要手动删除SAM默认缓存目录
~/.aws-sam/cache,这个目录存储着构建缓存数据
3. 预构建大依赖的Lambda层(可选)
如果sentence-transformers这类大依赖几乎不会改动,可以单独做成Lambda层:
- 用Docker构建层的压缩包:
# 生成依赖目录 docker run --rm -v "$PWD":/var/task public.ecr.aws/lambda/python:3.11 pip install sentence-transformers -t python/lib/python3.11/site-packages/ # 打包成zip zip -r sentence-transformers-layer.zip python/
- 把这个zip包上传到Lambda层,然后在
template.yaml的函数配置里添加Layers字段引用该层的ARN - 这样后续构建容器时,完全不需要再处理这个大依赖,只更新你的业务代码即可
4. 验证缓存是否生效
构建时查看日志,如果出现Using cache for image...或者依赖安装步骤直接跳过,说明缓存生效了。如果还是重新下载,检查:
- Dockerfile的步骤顺序是不是把依赖安装放在代码拷贝之前
- 依赖配置文件有没有被误修改(比如不小心加了空行,也会触发层重建)
内容的提问来源于stack exchange,提问作者AlwaysLearning
相关产品推荐
相关产品推荐

