ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Serverless Framework AWS 函数级回滚完全指南:serverless rollback function 用法与源码原理

Serverless Framework AWS 函数级回滚完全指南:serverless rollback function 用法与源码原理 Serverless Framework AWS 函数级回滚完全指南serverless rollback function 用法与源码原理【免费下载链接】serverless⚡ Serverless Framework – Effortlessly build apps that auto-scale, incur zero costs when idle, and require minimal maintenance using AWS Lambda and other managed cloud services.项目地址: https://gitcode.com/GitHub_Trending/se/serverless导读当线上 AWS Lambda 函数出现回归时与其手动重打包代码不如直接回滚到历史已部署版本。serverless rollback function正是 Serverless Framework 提供的函数级Function-level快速回滚命令它可以仅将某一个 Lambda 函数回退到serverless deploy全量部署时生成的指定版本如 version 23而不触碰服务中其他函数与周边资源。本文将以 docs/sf/providers/aws/cli-reference/rollback-function.md 为核心骨架结合仓库内 rollback-function.js、deploy-list.js 等源码实现与单元测试讲透该命令的触发条件、完整操作流程、底层调用链与常见陷阱。一、为什么需要函数级回滚Serverless Framework 部署 AWS 服务时存在两个回滚粒度服务级回滚使用 serverless rollback通过serverless rollback -t timestamp将整个 CloudFormation 栈回退到某次部署快照会重建该次部署涉及的所有资源。函数级回滚即本文主角serverless rollback function仅针对单个 Lambda 函数的代码版本进行回退不改动其他函数与资源。两者的关系可以在源码中清楚看到服务级回滚插件 rollback.js 内部基于 S3 部署桶中的时间戳目录重建整个栈它复用findAndGroupDeployments、updateStack、monitorStack等逻辑并通过 CloudFormation 变更集执行而函数级回滚插件 rollback-function.js 只调用Lambda#updateFunctionCode修改单个函数的代码。二者在同一目录下并列存在加载顺序见 plugins/index.js 中的import(./aws/rollback.js)与import(./aws/rollback-function.js)。适用场景某函数新版本存在逻辑缺陷、依赖问题或配置错误需要快速恢复该函数到此前某个被验证过的版本此时函数级回滚比整栈回滚更快、影响面更小。二、重要前提只有serverless deploy部署的函数才有版本官方文档在此处给出了一条非常关键的约束Note:You can only rollback a function which was previously deployed throughserverless deploy. Functions are not versioned when runningserverless deploy function.即serverless deploy完整部署会为服务内的 Lambda 函数发布正式版本号1、2、3…23…同时将别名指向新版本——这是函数级回滚的存档来源。serverless deploy function仅部署单个函数只更新$LATEST不会创建新版本因此不存在可供回滚的版本历史。若想回滚一个只通过deploy function更新过的函数你会先收到找不到该版本的报错。从源码实现也可以印证这一点回滚第一步是通过Lambda#getFunction携带Qualifier: function-version去 AWS 上解析目标版本是否存在若 AWS 返回ResourceNotFoundException或错误消息匹配not found插件会抛出错误码为AWS_FUNCTION_NOT_FOUND的 ServerlessError提示信息明确要求你检查该函数是否通过serverless deploy部署、且目标版本确实存在// packages/serverless/lib/plugins/aws/rollback-function.js#L59-L71 if ( error.message.match(/not found/) || _.get(error, providerError.code) ResourceNotFoundException ) { const errorMessage [ Function ${funcName} with version ${funcVersion} not found., Please check if youve deployed ${funcName}, and version ${funcVersion} is available for this function., Please check the docs for more info., ].join() throw new ServerlessError(errorMessage, AWS_FUNCTION_NOT_FOUND) }因此函数级回滚的合理前提是该函数曾经由一次完整的serverless deploy所部署。三、命令语法与参数说明serverless rollback function需要同时提供两个参数目标函数名与目标版本号。serverless rollback function --function name \ --function-version versionOptions 一览Option简写必填说明--function-f是需要回滚的函数名对应serverless.yml中functions下的逻辑名如my-function--function-version无是要将函数回退到的目标版本号正整数如23补充说明依据 rollback-function.js 实现版本号在传给 AWS 前会被强制转换为字符串funcVersion String(this.options[function-version])。因为 Lambda 的Qualifier参数要求字符串形式命令行即使传入纯数字也能正确匹配。回滚过程中会打印进度与结果日志例如Rolling back function my-function to version 23成功时输出Successfully rolled back function my-function to version 23 (Xs)其中Xs为该命令的总耗时由pluginManager.commandRunStartTime计算见 rollback-function.js。回滚不会改变serverless.yml中该函数原有的环境变量、内存、超时等配置仅替换代码内容——因为它走的是updateFunctionCode而非updateFunctionConfiguration。四、实操步骤从查看版本到完成回滚官方文档给出的标准工作流分两步。第 1 步用deploy list functions查看函数与版本回滚前必须先确定要回滚到哪个版本。运行serverless deploy list functions输出会按函数分组展示版本列表例如每个函数下会显示All Versions: 1, 2, 3或Latest Versions: ...版本过多时仅展示最近 5 个版本号。底层实现位于 deploy-list.jsgetFunctions()通过serverless.service.getAllFunctionsNames()拿到服务内全部函数并对每个函数调用Lambda#getFunction获取其配置deploy-list.jsgetFunctionVersions()再对每个函数调用Lambda#listVersionsByFunction并利用NextMarker做分页拉取deploy-list.js确保版本再多也能完整列出displayFunctions()将 CloudFormation 生成的函数全名如service-stage-my-function剥离掉服务和阶段前缀还原成用户可读的逻辑名并默认只打印最近 5 个版本号deploy-list.js。注意serverless deploy list functions与serverless deploy list是两个命令——前者列出函数版本本场景使用后者列出服务的部署时间戳服务级rollback -t使用。第 2 步执行函数级回滚选定函数与目标版本后执行serverless rollback function -f my-function --function-version 23该命令会把my-function回滚到版本23。执行成功后会看到形如Successfully rolled back function my-function to version 23 (12s)的成功日志。完整示例串联# 1. 查看当前服务的函数与各自版本 serverless deploy list functions # 2. 假设看到 my-function 的版本历史为 21, 22, 23而 23 是问题版本 # 3. 将 my-function 回滚到上一个正常版本 serverless rollback function --function my-function --function-version 22五、底层原理回滚到底做了什么命令的完整生命周期由AwsRollbackFunction插件在rollback:function:rollback生命周期钩子中驱动rollback-function.jsthis.hooks { rollback:function:rollback: async () { await this.validate() const func await this.getFunctionToBeRestored() if (func.Code func.Code.ResolvedS3Object) { await this.restoreReferenceFunction(func.Code.ResolvedS3Object) return } const zipBuffer await this.fetchFunctionCode(func) await this.restoreFunction(zipBuffer) }, }对应的流程分四段1. 校验参数validate复用./lib/validate.js通过Object.assign(this, validate)挂载校验 stage、region 等运行期上下文是否合法。2. 解析目标函数与版本getFunctionToBeRestored调用Lambda#getFunction参数为{ FunctionName: funcObj.name, Qualifier: funcVersion }其中funcObj来自serverless.service.getFunction(funcName)用于把serverless.yml中的逻辑名解析为最终部署名。该调用强制走 v3 SDK 路径{ sdkVersion: 3 }原因在注释中写得很清楚——冻结的 v2aws-sdkLambda API 模型不认识Code.ResolvedS3Object字段并会静默丢弃而判断函数是否属于reference 模式引用模式恰恰依赖该响应字段因此必须使用 v3 SDK 才能从响应中探测函数模式rollback-function.js。3. 普通模式下载代码包并回传restoreFunction大多数函数的getFunction响应会带Code.Location一个可直接下载函数 zip 的预签名 URL。插件通过fetch(codeUrl)拉取该版本的代码包字节流fetchFunctionCoderollback-function.js再调用Lambda#updateFunctionCode以ZipFile形式上传const params { FunctionName: funcObj.name, ZipFile: zipBuffer, } return this.provider.request(Lambda, updateFunctionCode, params)4. Reference 模式直接改指向 S3 的坐标restoreReferenceFunction若响应中包含Code.ResolvedS3Object说明目标函数处于reference引用/自管理存储模式——代码不内嵌上传而是由 Lambda 从 S3 的特定对象版本加载。此时无需下载再上传插件直接构造包含S3Bucket、S3Key、S3ObjectVersion与S3ObjectStorageMode: REFERENCE的请求让 Lambda 重新指向 S3 中该版本的对象rollback-function.js。由于S3ObjectStorageMode同样不被 v2 SDK 接受此调用也必须走 v3 SDK 路径。测试用例如何验证仓库单元测试 packages/serverless/test/unit/lib/plugins/aws/rollback-function.test.js 直接对上述两条分支进行了断言reference-mode 分支mockgetFunction返回Code.ResolvedS3Object断言updateFunctionCode收到的参数恰好是 S3 三元组 S3ObjectStorageMode: REFERENCE且不含ZipFile同时验证两次请求都携带{ sdkVersion: 3 }普通分支mock 返回常规 Code.Location 时走ZipFile上传路径。相关权限函数级回滚需要 AWS 凭证至少具备以下能力lambda:GetFunction解析目标函数与版本lambda:UpdateFunctionCode回写代码对 reference 模式通常还涉及s3:GetObject如果代码包需要从部署桶读取及对象版本相关权限。具体 IAM 组合以你的部署策略为准可参照 docs/sf/providers/aws/guide/iam.md 进行裁剪。六、限制与注意事项综合文档与源码使用函数级回滚时需留意以下几点版本来源受限只能回滚到serverless deploy全量部署产生的版本用serverless deploy function更新的函数不被版本化无法回滚。只回滚代码该命令通过updateFunctionCode完成不会还原该函数的配置环境变量、层、超时等。若问题出在配置而非代码应检查该次部署引入的配置变更或考虑服务级回滚。版本字符串语义AWS 中$LATEST与具体版本号是不同的限定符。请务必使用明确的数字版本号回滚传入的版本号会被String()化后作为Qualifier查询。服务级与函数级是两套机制若需要整体还原整个 CloudFormation 栈包含函数配置、事件源、IAM 等请参考 rollback 命令文档 与 deploy list 文档使用时间戳机制回滚函数级回滚是其轻量补充两者并不互斥可组合使用。失败排查若回滚报Function xxx with version yyy not found请再次运行serverless deploy list functions核对目标函数名逻辑名与版本号是否真实存在于当前 stage/region报Cannot resolve function错误码AWS_FUNCTION_NOT_ACCESIBLE则多为凭证或网络问题对应源码见 rollback-function.js。七、总结serverless rollback function是 Serverless Framework AWS 提供者中用于快速、精准修复单个函数回归的命令。使用前先通过serverless deploy list functions确认版本存档再以--function/-f配合--function-version一键回滚即可。从源码角度它本质上是读取目标版本代码 → 通过updateFunctionCode覆盖当前函数代码同时为 reference 模式函数提供了直接改写 S3 引用坐标的高效路径。将其与 服务级 rollback 按需配合即可建立起先看版本、再定点恢复、必要时整栈回退的完整灾难恢复体系。【免费下载链接】serverless⚡ Serverless Framework – Effortlessly build apps that auto-scale, incur zero costs when idle, and require minimal maintenance using AWS Lambda and other managed cloud services.项目地址: https://gitcode.com/GitHub_Trending/se/serverless创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表