如何通过Serverless GitHub Action实现部署零停机?
解决Serverless GitHub Action部署时函数长时间不可用的方案
核心问题分析
当前部署流程会先批量禁用所有函数,再统一打包、上传、更新,导致整个部署周期内所有函数处于不可用状态。要解决这个问题,核心是避免批量禁用+批量更新的模式,改为渐进式部署或者零停机部署策略。
可行解决方案
1. 利用Serverless Framework的--function参数单独部署单个函数
虽然GitHub Action本身没直接提供逐个部署的选项,但可以通过在Action中指定Serverless命令的参数来实现。修改GitHub Action的配置,循环遍历函数名,依次执行单个函数的部署命令:
- name: Deploy individual functions run: | FUNCTIONS=("function01" "function02") for func in "${FUNCTIONS[@]}"; do serverless deploy --function $func --stage ${{ secrets.STAGE }} done
这种方式会逐个部署函数,每个函数的更新过程独立,不会批量禁用所有函数,其他未部署的函数仍可正常提供服务。
2. 启用Serverless Framework的零停机部署(Lambda Alias + Traffic Shifting)
通过配置Serverless Framework的deploymentSettings,利用Lambda的别名和流量转移功能,实现零停机部署:
在serverless.yml中添加配置:
functions: function01: handler: handler.main deploymentSettings: type: Linear10PercentEvery1Minute alias: live function02: handler: handler.main deploymentSettings: type: Linear10PercentEvery1Minute alias: live
这样部署时,Serverless会创建新版本的Lambda函数,然后逐步将流量从旧版本转移到新版本,同时不会禁用原有函数,全程保持服务可用。
3. 优化打包与依赖安装速度
部署耗时久的部分原因可能是打包和依赖安装,可以通过以下方式优化:
- 缓存依赖:在GitHub Action中缓存
node_modules目录,避免每次部署都重新安装依赖- name: Cache node modules uses: actions/cache@v3 with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: | ${{ runner.os }}-node- - 拆分Webpack打包:如果函数之间依赖重叠度低,可以考虑为每个函数单独配置Webpack,或者并行打包多个函数,减少打包总耗时
4. 避免批量禁用函数
检查serverless.yml中是否有自定义的禁用函数钩子,或者是否使用了第三方插件导致部署前批量禁用函数。如果有,可以移除相关配置,让Serverless默认的部署流程(只更新函数版本,不主动禁用)来运行。
内容的提问来源于stack exchange,提问作者Wild
相关产品推荐
相关产品推荐

