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

使用CreateChangeSet API创建AWS CloudFormation栈时如何上传关联资产

报错原因

该参数缺失报错的本质是:CloudFormation 原生服务端接口不感知CDK的资产逻辑,所有资产上传、参数注入的动作都是CDK客户端侧完成的,CreateChangeSet本身只会校验传入的模板和参数,不会自动处理模板引用的本地资产。

实现方案

直接复用CDK官方的资产部署能力即可,不需要自己从零实现上传逻辑,你已经拿到synth后的CloudAssembly对象,只需要补全资产上传步骤即可:

  • 安装CDK资产部署依赖:@aws-cdk/cloud-asset-deploy,这个包是cdk deploy命令内部处理资产的核心模块,行为和官方CLI完全对齐。
  • 从CloudAssembly中提取目标栈的artifact对象,所有资产配置、参数映射都已经在synth阶段生成在这个对象里,不需要手动解析模板找随机命名的资产参数:
    const stackArtifact = cloudAssembly.getStackArtifact('SuperAwesomeStack');
    
  • 调用资产部署方法,自动完成资源创建、资产上传、参数生成全流程:
    import { deployStackAssets } from '@aws-cdk/cloud-asset-deploy';
    
    // 方法会自动完成S3桶创建、资产哈希校验、增量上传,返回所有资产对应的CloudFormation参数键值对
    const assetParameters = await deployStackAssets({
      stack: stackArtifact,
      sdkConfig: cfClient.config, // 复用你现有CloudFormation客户端的AWS认证、区域配置
    });
    
  • 将生成的资产参数传入CreateChangeSet接口即可解决参数缺失报错:
    const changeSet = await cfClient.send(new CreateChangeSetCommand({
        StackName: stackName,
        ChangeSetName: changeSetName,
        ChangeSetType: 'CREATE',
        TemplateBody: '<MY JSON TEMPLATE HERE>',
        Parameters: Object.entries(assetParameters).map(([paramKey, paramValue]) => ({
          ParameterKey: paramKey,
          ParameterValue: paramValue,
        }))
    }));
    
    await cfClient.send(new ExecuteChangeSetCommand({ StackName: stackName, ChangeSetName: changeSetName }));
    
补充说明
  • 该方案自带增量上传能力,会根据资产内容哈希判断是否需要重新上传,未修改的资产不会重复执行上传操作,和cdk deploy的缓存逻辑一致。
  • 不需要提前手动创建资产存储用的S3桶、ECR仓库,方法会自动按照CDK的规则检查并创建缺失的存储资源。
  • 如果你需要自定义资产上传行为(比如加代理、自定义KMS密钥、跨账号部署),直接给deployStackAssets传入对应配置项即可,不需要修改核心流程。
  • 不推荐手动解析资产清单实现上传逻辑,你需要自行处理大文件分段上传、权限校验、缓存、存储资源生命周期、嵌套模板资产递归处理等大量边缘场景,稳定性远低于官方实现。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 13:33:25