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

AWS SAM无代码变更仍重新部署所有TypeScript函数求助

问题:AWS SAM 每次部署都会重部署未修改的函数和RestAPI

背景

使用AWS SAM TypeScript模板(文件类型:Zip;通过esbuild构建),已成功部署CloudFormation栈。

问题现象

每次执行sam build && sam deploy --config-env dev时,即使未修改任何代码,SAM仍会部署函数及RestAPI。

构建CLI日志

Running NodejsNpmBuilder:LockfileCleanUp
Manifest is not changed for (HelloWorldPublicFunction), running incremental build
Building codeuri: C:\xsrc\test\helper-funcs\lw-puller-v3\lw-functions runtime: nodejs18.x metadata: {'BuildMethod': 'esbuild', 'BuildProperties': {'Minify': True, 'Target': 'es2020', 'Sourcemap': True, 'EntryPoints': ['public.ts']}} architecture: x86_64 functions: HelloWorldPublicFunction
Running NodejsNpmEsbuildBuilder:CopySource
Running NodejsNpmEsbuildBuilder:CopySource
Running NodejsNpmEsbuildBuilder:LinkSource
Running NodejsNpmEsbuildBuilder:EsbuildBundle
Running NodejsNpmEsbuildBuilder:LinkSource
Running NodejsNpmEsbuildBuilder:EsbuildBundle
Running NodejsNpmEsbuildBuilder:CopySource
Running NodejsNpmEsbuildBuilder:LinkSource
Running NodejsNpmEsbuildBuilder:EsbuildBundle

需求

如何忽略未变更的函数?后续将添加更多函数,希望仅部署代码变更的函数,避免全部重部署。


解决方案

1. 排查增量构建失效原因

从日志看已触发增量构建,但仍重复部署,大概率是构建产物哈希值被意外修改:

  • 检查.aws-sam目录是否被版本控制或手动修改,确保构建目录仅保留必要产物
  • 确认esbuild配置中没有生成动态内容(如随机注释、时间戳),这类内容会导致打包后的Zip哈希变化,触发不必要的部署

2. 预览变更集确认更新触发点

部署前先执行以下命令,查看CloudFormation生成的变更集,明确哪些资源被标记为需要更新:

sam build && sam deploy --config-env dev --no-execute-changeset

如果函数代码未变更却被列入更新列表,说明打包产物的哈希值确实发生了变化,需要进一步排查构建环节。

3. 启用函数代码哈希验证

在SAM模板的函数资源中添加AutoPublishAlias配置,让CloudFormation仅在代码哈希变化时更新函数:

Resources:
  HelloWorldPublicFunction:
    Type: AWS::Serverless::Function
    Properties:
      CodeUri: lw-functions/
      Handler: public.handler
      Runtime: nodejs18.x
      AutoPublishAlias: live
      Metadata:
        BuildMethod: esbuild
        BuildProperties:
          Minify: True
          Target: es2020
          Sourcemap: True
          EntryPoints: ['public.ts']

AutoPublishAlias会自动管理函数版本,结合SAM内置的代码哈希校验,只有代码实际变更时才会发布新版本并更新别名。

4. 单独部署指定函数

如果只需要更新特定变更的函数,可使用--function参数指定单个或多个目标函数:

sam build && sam deploy --config-env dev --function HelloWorldPublicFunction

这种方式仅部署指定函数,不会触发栈内其他资源(如RestAPI)的更新,除非函数变更直接影响API配置。

5. 修复RestAPI的不必要更新

如果RestAPI也被频繁更新,需检查模板中的API配置:

  • 避免使用!Sub等动态函数生成API路径或参数,防止每次部署时模板输出变化
  • 确保API的DefinitionBody或DefinitionUri内容稳定,没有引入每次构建都会变化的内容

内容的提问来源于stack exchange,提问作者Xin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 10:25:32