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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:55:58