如何在不删除现有堆栈的情况下从 cloudformation 迁移到 CDK?

How can I migrate from cloudformation to CDK without delete existing stacks?

我正在使用 cloudformation 模板构建应用程序,现在迁移到使用 CDK。但是当我 运行 cdk deploy 命令时,它总是抱怨资源已经存在,即使我使用相同的堆栈名称。有没有办法 运行 CDK 无需拆除任何 cloudformation 堆栈?

我知道有导入资源功能,但我的情况是资源将属于 CDK 管理的堆栈。如果我使用 import,这意味着资源存在于堆栈之外。我怎样才能让它自动工作?逻辑应该是import the resource if it exists, otherwise create it.

您必须 现有资源导入 CDK。 CDK 的 AWS 文档中提供了关于此的更多信息以及此操作的示例:

You can turn the resource's ARN (or another identifying attribute, or group of attributes) into an AWS CDK object in the current stack by calling a static factory method on the resource's class.

不幸的是,会有一些手动步骤,但是只要稍加努力,这些步骤中的大部分都可以编写脚本。以下是我过去如何完成 CF 到 CDK 堆栈迁移的大致过程:

  1. 对于您要从旧 CF 堆栈中迁移出的所有资源,将 DeletionPolicy 设置为 Retain。
  2. 使用这些更改执行 CloudFormation 堆栈更新 - 当您在下一步中删除堆栈时,这将从您的堆栈中 'detach' 这些资源,以便它们可以导入到您的 CDK 堆栈中。
  3. 删除 CloudFormation 堆栈。堆栈中的资源应该继续存在。
  4. 重新定义您准备在 CDK 堆栈中导入的资源。尝试尽可能接近地反映您现有的资源,这将帮助您在导入后巩固任何漂移。
  5. 通过 ChangeSet 将这些分离的资源导入您的 CDK 堆栈。您可以直接通过 AWS 控制台或通过 CLI(例如 aws cloudformation create-change-set --change-set-type IMPORT --resources-to-import ...
  6. 运行 在您的 CDK CF 堆栈上进行漂移检测。修复任何漂移。理想情况下,如果您已在 CDK 中正确建模资源,那么会有 none,但是由于 CDK 设置的默认值,可能会有细微差异。