Serverless Python插件:CI/CD容器中Lambda Layer无代码变更版本递增问题
我正在使用Serverless Framework部署Lambda函数与Lambda Layers。
创建Lambda Layers时,我们为每个层单独创建文件夹,每个文件夹内包含定义Lambda层的serverless.yaml文件,以及定义Python依赖库的requirements.txt文件,该文件供已安装的python requirements插件使用。
文件夹结构:
├── layers │ ├── <layer_name1> │ │ ├── requirements.txt │ │ └── serverless.yaml │ ├── <layer_name2> │ │ ├── requirements.txt │ │ └── serverless.yaml │ └── <layer_name3> │ ├── requirements.txt │ └── serverless.yaml ├── serverless.yaml ├── <app_folder>
我们发现每次触发应用的CI/CD流水线时,无论serverless.yaml和requirements.txt文件是否更新,Lambda Layer版本都会递增。流水线每次都会基于Ubuntu 22.04镜像的新容器执行serverless deploy命令。
在本地电脑执行serverless deploy部署Lambda Layer时表现正常:无代码变更则不会创建CloudFormation栈变更请求。但在新容器中执行相同命令时,首次部署会更新Lambda Layer版本号,再次执行则表现正常,不会创建变更请求。
停止容器并创建新容器后,重复上述现象:首次部署无代码变更却版本递增,后续执行则正常。
- 基于基础Docker镜像启动新容器(
$docker run <image_name>) - 将仓库内容复制到容器中(
$docker cp <folder_name> <container_name>:<folder_path>) - 在Docker容器中配置AWS凭证(
$aws configure) - 在仓库根目录安装Python requirements插件(
$cd <folder_path> && serverless plugin install -n serverless-python-requirements) - 进入
layers/<layer_name>目录($cd layers/<layer_name>) - 尝试部署新的Lambda Layer(
$serverless deploy)
结果:
即使代码与上次部署无变更,Layer版本仍会递增。再次执行部署命令时,系统识别到无代码变更,不会更新版本号。
注意: 每次执行上述复现流程时,都会创建新的.serverless文件夹,其中包含pythonRequierements.zip和cloudformation-template-update-stack.json文件。
再次执行复现流程时,生成的pythonRequierements.zip文件大小略有差异,但解压后内容完全一致(文件数量、大小均相同)。
分析cloudformation-template-update-stack.json文件,发现以下代码片段中的PythonRequirementsLambdaLayerHash值也不同:
"PythonRequirementsLambdaLayerHash": { "Description": "Current Lambda layer hash", "Value": "**c4e6c87314753740433442c351cb57f503240bce**", "Export": { "Name": "sls-contributor-backend-layer-utils-dev-PythonRequirementsLambdaLayerHash" } }
是否可能是Serverless Framework生成Lambda Layer哈希的算法依赖于运行操作系统?
若Lambda Layer代码(serverless.yaml和requirements.txt文件)无变更,执行serverless deploy后版本号应保持不变。
这应该是CI/CD集成中的常见问题,是否存在通用解决方案?
- Node版本:v14.21.3
- Serverless Framework版本:3.30.1
内容的提问来源于stack exchange,提问作者Martin Fernandez

