繁体   English   中英

通过 CDK CodePipelines 将基础设施更改部署到现有堆栈

[英]Deploying infra changes into existing stack through CDK CodePipelines

如何在不重新创建旧堆栈/资源的情况下将具有 CDK 中定义的资源的现有堆栈迁移到代码管道?

我有一个通过 cdk deploy 从 Github Actions 部署的堆栈。 我正在尝试将管道的 CD 部分迁移到 CodePipeline。 但是,如果我将现有的 cdk.Stack 定义放入 cdk.Stage,它将删除旧堆栈(这是我的假设)。 你会怎么处理? 我知道有一种方法可以从堆栈中公开资源,但这意味着我需要保持这个堆栈正常运行,这没有任何意义。

您希望管道更新现有堆栈而不替换有状态资源1 为了让阶段部署按预期工作,(a) 您现有的堆栈必须为您要保留的资源提供显式(非默认)资源名称,(b) 新的阶段堆栈必须具有硬编码这些现有资源名称的结构(c) 新堆栈的构造必须避免有状态资源上的其他替换行为2

点“a”意味着如果您让 CDK(从技术上讲,CloudFormation)在现有资源上设置默认资源名称,您就不走运了。 从默认命名更改为显式名称会触发替换行为,即使新的显式名称与现有生成的名称匹配。 阶段部署将失败。

如果您做到这一点,剩下的就是为阶段部署的堆栈提供与现有堆栈相同的名称。 当管道执行时,CloudFormation 将执行堆栈更新。

不是必需的,但作为一项安全措施,您应该确保有状态资源具有cdk.RemovalPolicy.RETAIN removalPolicy集并进行备份。 保留的资源将在替换或删除操作时孤立在堆栈之外,如果东西 go 横向移动则不会被销毁。


(1) 替换意味着破坏和重建。 您不必担心(空)队列和 lambda 之类的无状态资源,它们可以安全地被替换,而是担心任何有状态的资源,例如数据库。

(2) 堆栈资源的更改导致更新或替换行为 大多数更改都是更新,最多会导致短暂的服务中断。 每个资源的 CloudFormation 文档列出了每个属性的更新行为,但至少,对资源名称(例如 CDK DynamoDB 表的tableName )的更改会导致替换。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM