
AWS CLI CloudFormation create-change-set 命令实战指南创建变更集并安全审查堆栈变更【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli导读aws cloudformation create-change-set是 AWS CLI 中用于先预览、后执行堆栈变更的核心命令。它不会直接修改任何资源而是生成一份变更集Change Set列出 CloudFormation 将要对堆栈执行的所有创建、更新或删除操作供你在真正落地前逐条审查。本文将基于 create-change-set.rst 官方示例结合 service-2.json 中的 API 定义与 deployer.py 的底层实现完整讲解命令语法、全部核心参数、适用场景与配套命令让你能够把变更集驱动的部署流程安全地用于生产环境。一、命令作用与适用场景create-change-set对应 CloudFormation 的CreateChangeSetAPI。其官方语义是Creates a list of changes that will be applied to a stack so that you can review the changes before executing them创建一份将要应用于堆栈的变更列表以便在执行前审查这些变更。它覆盖三种典型场景由--change-set-type参数区分见 service-2.json 中ChangeSetType枚举定义CREATE/UPDATE/IMPORT变更集类型适用场景说明CREATE堆栈尚不存在变更集展示 CloudFormation 将创建的全部资源执行前堆栈处于REVIEW_IN_PROGRESS状态UPDATE堆栈已存在CloudFormation 对比堆栈当前信息与提交的新信息列出差异默认类型IMPORT导入存量资源为资源导入操作创建变更集配合--resources-to-import使用工作流程固定为三步创建变更集 → 审查变更内容 → 执行变更集。CloudFormation 在调用ExecuteChangeSet之前不会对堆栈做任何修改这是变更集机制最核心的安全价值。二、命令语法与官方示例官方示例create-change-set.rst演示了带CAPABILITY_IAM能力的变更集创建其中template.yaml是当前目录下、定义了一个包含 IAM 资源的堆栈的 CloudFormation 模板aws cloudformation create-change-set \ --stack-name my-application \ --change-set-name my-change-set \ --template-body file://template.yaml \ --capabilities CAPABILITY_IAM命令输出CreateChangeSetOutput形状见 service-2.json{ Id: arn:aws:cloudformation:us-west-2:123456789012:changeSet/my-change-set/bc9555ba-a949-xmpl-bfb8-f41d04ec5784, StackId: arn:aws:cloudformation:us-west-2:123456789012:stack/my-application/d0a825a0-e4cd-xmpl-b9fb-061c69e99204 }返回的两个字段含义如下Id变更集的 ARN形如arn:aws:cloudformation:region:account:changeSet/change-set-name/uuid。后续describe-change-set、execute-change-set都需要用它定位变更集StackId目标堆栈的 ARN。注意当目标堆栈不存在时CREATE类型CloudFormation 也会先创建一个具有唯一 StackId 的占位堆栈使其进入REVIEW_IN_PROGRESS状态待执行变更集后才会真正创建资源。三、核心参数详解依据 service-2.json 中CreateChangeSetInput形状的定义除上述示例用到的参数外还有以下关键参数3.1 模板来源三选一条件必填TemplateBody、TemplateURL、UsePreviousTemplate三者必须且只能指定一个--template-body内联模板内容或本地文件路径如file://template.yaml。正文最小 1 字节、最大51,200 字节50 KB--template-url指向 S3 存储桶或 Systems Manager 文档中模板文件的 URL模板最大1 MB。S3 URL 必须以https://开头且不支持 S3 静态网站 URL--use-previous-template布尔值复用堆栈当前关联的模板生成变更集常用于只改参数不换模板的场景。官方文档特别提示使用AWS::LanguageExtensionstransform 的模板应显式提供模板避免新参数值和 Systems Manager 参数更新无法正确应用。3.2 必填参数--stack-name目标堆栈的名称或唯一 IDStackNameOrId形状必填--change-set-name变更集名称必填。命名约束只能包含字母数字与连字符必须以字母开头最大128 个字符且在同一个堆栈下必须唯一。3.3 Capabilities能力声明--capabilities是示例中的关键参数Capability枚举包含三个合法值CAPABILITY_IAM模板包含影响账户权限的 IAM 资源如创建 IAM 用户、角色、策略必须显式声明CAPABILITY_NAMED_IAM模板包含自定义名称的 IAM 资源如AWS::IAM::Role显式指定了RoleName时必须使用此值CAPABILITY_AUTO_EXPAND模板包含需要展开的宏macro如AWS::Serverlesstransform。注意Capabilities与ResourceTypes参数只能指定其中一个。3.4 变更集类型与生命周期--change-set-typeCREATE/UPDATE/IMPORT默认UPDATE。不能对不存在的堆栈用UPDATE也不能对已存在堆栈用CREATE--description变更集描述便于识别--client-token幂等令牌。重试CreateChangeSet请求时携带相同 tokenCloudFormation 可据此识别这不是重复创建同名变更集。3.5 堆栈行为控制--parameters为变更集指定的输入参数列表Parameter结构数组--tags关联到堆栈的键值对标签最多50 个CloudFormation 会向堆栈内资源传播--role-arn执行变更集时 CloudFormation 代入的 IAM 角色 ARN遵循最小权限原则未指定时使用堆栈此前关联的角色否则使用你的用户凭证生成的临时会话--rollback-configuration回滚触发器配置--notification-arns关联到堆栈的 SNS 主题 ARN 列表--on-stack-failure堆栈创建失败时的处理策略枚举为DO_NOTHING/ROLLBACK/DELETE。其中DELETE仅在ChangeSetTypeCREATE时有效且与ExecuteChangeSet的DisableRollback参数互斥。3.6 高级功能参数--include-nested-stacks布尔值默认false设为true可为模板中的所有嵌套堆栈一并创建变更集--resources-to-import导入操作要导入到堆栈中的资源描述列表--import-existing-resources布尔值指示变更集是否自动导入已存在的资源仅限模板中可自定义名称的资源如 EC2 实例等不接受自定义名称的资源需改用--resources-to-import--deployment-mode当前枚举值为REVERT_DRIFT创建漂移感知变更集drift-aware change set对实际状态、上次部署状态与期望状态做三方对比将资源实际状态拉回与模板定义一致--deployment-config堆栈操作的部署配置含部署模式--disable-validation布尔值默认false设为true可禁用变更集和堆栈操作中的部署前校验。四、配套命令审查与执行变更集创建变更集只是流程第一步官方文档明确建议配合以下操作完成闭环查看变更集状态与内容aws cloudformation describe-change-set \ --change-set-name my-change-set \ --stack-name my-application返回中的Status、StatusReason反映变更集是否可用Changes数组逐条列出 CloudFormation 将要执行的具体资源操作增删改ExecutionStatus指示是否已执行。确认无误后执行aws cloudformation execute-change-set \ --change-set-name my-change-set \ --stack-name my-application只有调用ExecuteChangeSet之后CloudFormation 才会真正修改堆栈。五、源码视角变更集在部署流程中的底层实现在 AWS CLI 仓库中变更集逻辑并非只暴露为单条命令还内嵌于高层部署命令的实现中。aws cloudformation deploy命令就是围绕CreateChangeSet构建的完整自动化流水线见 deployer.py自动判断变更集类型Deployer.has_stack()先调用describe_stacks探测堆栈是否存在并专门处理了REVIEW_IN_PROGRESS状态——由先前CreateChangeSet创建的占位堆栈会被视为不存在从而改用CREATE类型而非UPDATE对应源码第 50-57 行注释自动生成变更集名称create_changeset()使用awscli-cloudformation-package-deploy-timestamp前缀按时间生成唯一变更集名并自动附加 Created by AWS CLI 描述第 88-92 行等待变更集创建完成wait_for_changeset()通过change_set_create_completewaiter 每 5 秒轮询一次若状态为FAILED且原因包含 The submitted information didnt contain changes 或 No updates are to be performed则抛出ChangeEmptyError第 146-178 行对应无变更可执行的常见场景执行与等待execute_changeset()调用execute_change_set随后根据变更集类型选择stack_create_complete或stack_update_completewaiter每 30 秒轮询、最多 120 次第 195-221 行轮询间隔特意拉大以避免触发DescribeStacks的速率限制。从源码结构可以看出无论是手写create-change-set命令还是使用deploy命令底层都走同一条CreateChangeSet → 等待 → ExecuteChangeSet调用链区别仅在于deploy帮你自动完成了类型判断、命名与轮询等待。六、实战建议与注意事项IAM 能力声明不可省略模板一旦包含 IAM 资源而未指定Capabilities变更集创建将失败包含自定义名称 IAM 资源时必须用CAPABILITY_NAMED_IAM模板来源三选一--template-body≤50 KB、--template-url≤1 MB须https://S3 或 SSM 文档、--use-previous-template互斥勿同时指定多个执行前务必审查变更集的本质是零风险预览先describe-change-set核对Changes列表再execute-change-set落地是生产环境的标准姿势无变更是常态当模板与参数相对堆栈没有差异时变更集会以FAILED状态结束原因即 No updates are to be performed此时直接删除变更集即可无需担心留意默认类型不指定--change-set-type时默认UPDATE对不存在堆栈的首次创建请显式使用CREATE。七、参考资料官方命令示例awscli/examples/cloudformation/create-change-set.rstAPI 完整形状定义awscli/botocore/data/cloudformation/2010-05-15/service-2.json变更集底层调用实现awscli/customizations/cloudformation/deployer.py变更集相关测试可参考tests/unit/customizations/cloudformation 与 tests/functional/cloudformation【免费下载链接】aws-cliUniversal Command Line Interface for Amazon Web Services项目地址: https://gitcode.com/GitHub_Trending/aw/aws-cli创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考