如何结合Serverless部署与AWS Lambda PublishVersion版本发布?
回答
你完全不需要在serverless deploy执行完成后,手动逐个调用AWS CLI为每个Lambda发布版本,Serverless Framework原生支持Lambda版本管理能力,配置后可在部署流程中自动完成版本发布,和现有部署流程无缝衔接,不会增加额外操作步骤。
方案1:使用框架原生版本发布能力(推荐)
框架默认就内置了Lambda版本发布逻辑,只需要在serverless.yml中开启对应配置,原有部署命令不需要修改,执行部署时会自动完成所有关联函数的版本发布:
provider: name: aws region: eu-west-1 # 替换为你实际使用的区域 runtime: nodejs18.x # 替换为你实际使用的函数运行时 versionFunctions: true # 开启自动版本发布,该参数默认值即为true,多数场景下无需显式配置
如果你需要为发布的版本绑定固定别名(比如给integration环境的版本绑定integration别名,方便后续回滚、流量切分),可以直接在函数配置中声明别名,部署完成后框架会自动将别名指向本次发布的最新版本:
functions: test_lambda: handler: src/test.handler alias: integration # 自动绑定integration别名到本次发布的新版本 # 其余函数同理配置即可
这种方式的优势是部署和版本发布在同一个流程内完成,不会出现部署失败但发布了无效版本、漏发某个函数版本的问题,稳定性最高。
方案2:自定义发布逻辑(适配个性化需求)
如果你需要自定义版本描述、或者在版本发布后执行额外操作(比如配置版本级权限、对接内部发布流程),可以通过框架的部署生命周期钩子实现批量自动发布,不需要手动枚举所有函数名:
- 安装脚本钩子插件:
serverless plugin install -n serverless-scriptable-plugin - 在
serverless.yml中配置部署后钩子:custom: scriptHooks: after:deploy:finalize: - ./scripts/publishLambdaVersions.sh - 编写批量发版脚本
publishLambdaVersions.sh,框架会自动将本次部署的所有函数名、区域等信息注入环境变量,无需硬编码:#!/bin/bash set -e # 遍历本次部署成功的所有Lambda函数 for functionName in ${SERVERLESS_LAMBDA_FUNCTION_NAMES//,/ } do version=$(aws lambda publish-version \ --function-name $functionName \ --description "deployed at $(date "+%Y-%m-%d %H:%M:%S") for integration environment" \ --region $AWS_REGION | jq -r '.Version') echo "Published version $version for function $functionName" done
脚本会在所有函数部署成功后自动执行,批量完成版本发布,后续新增函数时也不需要修改脚本。
注意事项
- 不建议拆分部署和版本发布流程手动执行,一旦部署过程中部分函数更新失败,手动发版会导致版本和实际运行代码不一致,增加排障成本
- 开启版本发布后,旧版本不会自动删除,如果需要清理历史版本,可以搭配生命周期策略自动完成,避免存储配额占用过高
内容的提问来源于stack exchange,提问作者user7385060
相关产品推荐
相关产品推荐

