将现有资源和 AWS CloudFormation 模板迁移到 AWS CDK - AWS Cloud Development Kit (AWS CDK) v2

这是 AWS CDK v2 开发者指南。较旧的 CDK v1 于 2022 年 6 月 1 日进入维护阶段,并于 2023 年 6 月 1 日终止支持。

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

将现有资源和 AWS CloudFormation 模板迁移到 AWS CDK

CDK Migrate 功能处于预览版 AWS CDK ,可能会发生变化。

使用 AWS Cloud Development Kit (AWS CDK) 命令行界面 (AWS CDK CLI) 将已部署的 AWS 资源、已部署的 AWS CloudFormation 堆栈和本地 AWS CloudFormation 模板迁移到 AWS CDK。

迁移的工作原理

使用 AWS CDK CLIcdk migrate命令从以下来源迁移:

  • 已部署的 AWS 资源。

  • 已部署 AWS CloudFormation 堆栈。

  • 本地 AWS CloudFormation 模板。

已部署的 AWS 资源

您可以从特定环境(AWS 账户 和 AWS 区域)迁移未与 AWS CloudFormation 堆栈关联的已部署 AWS 资源。

利 AWS CDK CLI用 IaC 生成器服务扫描 AWS 环境中的资源以收集资源详细信息。要了解有关 IaC 生成器的更多信息,请参阅AWS CloudFormation 用户指南中的为现有资源生成模板

收集资源详细信息后,将 AWS CDK CLI创建一个新的 CDK 应用程序,其中包含一个包含已迁移资源的堆栈。

已部署的 AWS CloudFormation 堆栈

您可以将单个 AWS CloudFormation 堆栈迁移到新 AWS CDK 应用程序中。 AWS CDK CLI将检索您的堆栈 AWS CloudFormation 模板并创建一个新的 CDK 应用程序。CDK 应用程序将由包含您迁移的堆栈的单个 AWS CloudFormation 堆栈组成。

本地 AWS CloudFormation 模板

您可以从本地 AWS CloudFormation 模板迁移。本地模板可能包含也可能不包含已部署的资源。 AWS CDK CLI将创建一个新的 CDK 应用程序,其中包含一个包含您的资源的堆栈。

迁移后,您可以管理、修改和部署您的 CDK 应用程序, AWS CloudFormation 以配置或更新您的资源。

CDK 迁移的好处

从历史上看 AWS CDK ,将资源迁移到中一直是一个手动过程,需要时间 AWS CloudFormation 和专业知识 AWS CDK ,甚至需要开始。使用 CDK Migr AWS CDK CLI ate,可以在很短的时间内为您完成大部分迁移工作。CDK Migrate 可以让你快速开始使用开发和管理新的和现有的应用程序。 AWS CDK AWS

注意事项

一般注意事项

CDK 迁移与 CDK 导入

cdk import命令可以将已部署的资源导入到新的或现有的 CDK 应用程序中。导入时,必须在您的应用程序中将每个资源手动定义为 L1 结构。我们建议使用一次cdk import将一个或多个资源导入到新的或现有的 CDK 应用程序中。要了解更多信息,请参阅将现有的资源导入到堆栈

cdk migrate命令将从已部署的资源、已部署的 AWS CloudFormation 堆栈或本地 AWS CloudFormation 模板迁移到新的 CDK 应用程序中。在迁移过程中, AWS CDK CLI用于将您的资源导入cdk import到新的 CDK 应用程序中。 AWS CDK CLI还会为您生成每种资源的 L1 结构。我们建议在从支持的迁移源导入到新 AWS CDK 应用程序cdk migrate时使用。

CDK Migrate 仅创建 L1 构造

新创建的 CDK 应用程序将仅包含 L1 结构。迁移后,您可以在应用程序中添加更高级别的结构。

CDK Migrate 创建包含单个堆栈的 CDK 应用程序

新创建的 CDK 应用程序将包含一个堆栈。

迁移已部署的资源时,所有迁移的资源都将包含在新 CDK 应用程序的单个堆栈中。

迁移 AWS CloudFormation 堆栈时,您只能在新的 CDK 应用程序中将单个 AWS CloudFormation 堆栈迁移到单个堆栈中。

迁移资产

项目资产(例如 AWS Lambda 代码)不会直接迁移到新的 CDK 应用程序中。迁移后,您可以指定资产值以将其包含在 CDK 应用程序中。

迁移有状态资源

在迁移有状态资源(例如数据库和亚马逊简单存储服务 (Amazon S3) Simple Storage S3S 存储桶)时,您通常希望迁移现有资源,而不是创建新资源。

要迁移和保留有状态资源,请执行以下操作:

  • 确认您的有状态资源支持导入。有关更多信息,请参阅《AWS CloudFormation 用户指南》中的资源类型支持

  • 迁移后,验证新 CDK 应用程序中已迁移资源的逻辑 ID 是否与已部署资源的逻辑 ID 相匹配。

  • 如果从 AWS CloudFormation 堆栈迁移,请验证新 CDK 应用程序中的堆栈名称是否与 AWS CloudFormation 堆栈匹配。

  • 使用相同的 AWS 帐户和 AWS 区域 迁移的资源部署 CDK 应用程序。

从 AWS CloudFormation 模板迁移时的注意事项

CDK Migrate 支持单模板迁移

迁移 AWS CloudFormation 模板时,您可以选择单个模板进行迁移。不支持嵌套模板。

迁移带有内在函数的模板

从使用内部函数的 AWS CloudFormation 模板迁移时, AWS CDK CLI将尝试使用该类将您的逻辑迁移到 CDK 应用程序中。Fn要了解更多信息,请参阅 AWS Cloud Development Kit (AWS CDK) API 参考中的 Fn 类

从已部署的资源迁移时的注意事项

扫描限制

在扫描环境中寻找资源时,IaC 生成器对其可以检索的数据有特定的限制,并且在扫描时有配额限制。要了解更多信息,请参阅AWS CloudFormation 用户指南中的注意事项

先决条件

在使用该cdk migrate命令之前,请执行以下操作:

  1. 使用建立身份验证 AWS。有关说明,请参阅步骤 2:配置编程访问权限

  2. 安装或升级 AWS CDK CLI。有关安装说明,请参阅步骤 3:安装 AWS CDKCLI

开始使用 CDK 迁移

首先,从您选择的目录中运行该 AWS CDK CLIcdk migrate命令。根据您正在执行的迁移类型,提供必填选项和可选选项。

有关可与之配合使用的选项的完整列表和说明cdk migrate,请参阅cdk migrate

以下是您可能需要提供的一些重要选项。

堆栈名称

唯一需要的选项是--stack-name。使用此选项为迁移后将在 AWS CDK 应用程序中创建的堆栈指定名称。部署时,堆栈名称也将用作 AWS CloudFormation 堆栈的名称。

Language

--language用于指定新 CDK 应用程序的编程语言。

AWS 账户和 AWS 区域

从默认来源 AWS CDK CLI检索 AWS 账户和 AWS 区域 信息。有关更多信息,请参阅 步骤 2:配置编程访问权限。您可以使用--account--region选项cdk migrate来提供其他值。

新 CDK 项目的输出目录

默认情况下, AWS CDK CLI将在您的工作目录中创建一个新的 CDK 项目,并使用您提供的值--stack-name来命名该项目文件夹。如果当前存在同名文件夹,则 AWS CDK CLI会覆盖该文件夹。

您可以使用--output-path选项为新 CDK 项目文件夹指定不同的输出路径。

迁移来源

提供一个选项来指定您要迁移的来源。

  • --from-path— 从本地 AWS CloudFormation 模板迁移。

  • --from-scan— 从 AWS 账户中已部署的资源迁移和 AWS 区域。

  • --from-stack— 从 AWS CloudFormation 堆栈迁移。

根据您的迁移源,您可以提供其他选项来自定义cdk migrate命令。

从 AWS CloudFormation 堆栈迁移

要从已部署的 AWS CloudFormation 堆栈迁移,请提供--from-stack选项。使用提供已部署 AWS CloudFormation 堆栈的名称--stack-name。以下是 示例:

$ cdk migrate --from-stack --stack-name "myCloudFormationStack"

AWS CDK CLI将执行以下操作:

  1. 检索已部署堆栈的 AWS CloudFormation 模板。

  2. 运行cdk init以初始化新的 CDK 应用程序。

  3. 在 CDK 应用程序中创建一个包含已迁移 AWS CloudFormation 堆栈的堆栈。

当您从已部署的 AWS CloudFormation 堆栈迁移时,会 AWS CDK CLI尝试将已部署的资源逻辑 ID 和已部署的 AWS CloudFormation 堆栈名称与新 CDK 应用程序中迁移的资源和堆栈进行匹配。

迁移后,您可以正常管理和修改您的 CDK 应用程序。部署时,由于 AWS CloudFormation 堆栈名称匹配, AWS CloudFormation 会将部署标识为 AWS CloudFormation 堆栈更新。将更新具有匹配逻辑 ID 的资源。有关部署的更多信息,请参阅管理和部署您的 CDK 应用程序

从 AWS CloudFormation 模板迁移

CDK Migrate 支持从格式为JSONYAML的 AWS CloudFormation 模板迁移。

要从本地 AWS CloudFormation 模板迁移,请使用--from-path选项并提供本地模板的路径。您还必须提供所需的--stack-name选项。以下是 示例:

$ cdk migrate --from-path "./template.json" --stack-name "myCloudFormationStack"

AWS CDK CLI将执行以下操作:

  1. 检索您的本地 AWS CloudFormation 模板。

  2. 运行cdk init以初始化新的 CDK 应用程序。

  3. 在 CDK 应用程序中创建包含已迁移 AWS CloudFormation 模板的堆栈。

迁移后,您可以正常管理和修改您的 CDK 应用程序。部署时,您可以选择以下选项:

  • 更新 AWS CloudFormation 堆栈-如果之前部署了本地 AWS CloudFormation 模板,则可以更新已部署的 AWS CloudFormation 堆栈。

  • 部署新 AWS CloudFormation 堆栈-如果从未部署过本地 AWS CloudFormation 模板,或者您想使用先前部署的模板创建新堆栈,则可以部署新 AWS CloudFormation 堆栈。

从 AWS SAM 模板迁移

要从 AWS Serverless Application Model (AWS SAM) 模板迁移,必须先将其转换为 AWS CloudFormation 模板或部署以创建 AWS CloudFormation 堆栈。

要将 AWS SAM 模板转换为 AWS CloudFormation,可以使用 AWS SAM CLIsam validate --debug命令。在运行此命令之前lint,您可能需要falsesamconfig.toml文件中将其设置为。

要转换为 AWS CloudFormation 堆栈,请使用部署 AWS SAM 模板 AWS SAM CLI。然后从已部署的堆栈迁移。

从已部署的资源迁移

要从已部署的 AWS 资源迁移,请提供--from-scan选项。您还必须提供所需的--stack-name选项。以下是 示例:

$ cdk migrate --from-scan --stack-name "myCloudFormationStack"

AWS CDK CLI将执行以下操作:

  1. 扫描您的帐户以获取资源和财产详细信息 — AWS CDK CLI 利用IaC生成器来扫描您的帐户并收集详细信息。

  2. 生成 AWS CloudFormation 模板-扫描后, AWS CDK CLI使用 IaC 生成器创建 AWS CloudFormation 模板。

  3. 初始化新的 CDK 应用程序并迁移您的模板 — AWS CDK CLI 运行cdk init初始化新 AWS CDK 应用程序,并将您的 AWS CloudFormation 模板作为单个堆栈迁移到 CDK 应用程序中。

使用过滤器

默认情况下, AWS CDK CLI将扫描整个 AWS 环境并迁移不超过 IaC 生成器的最大配额限制的资源。您可以为过滤器提供过滤器 AWS CDK CLI,以指定将资源从您的账户迁移到新 CDK 应用程序所依据的标准。要了解更多信息,请参阅--filter

使用 iaC 生成器扫描资源

根据您账户中的资源数量,扫描可能需要几分钟。扫描过程中将显示一个进度条。

支持的资源类型

AWS CDK CLI将迁移 IaC 生成器支持的资源。有关完整列表,请参阅《AWS CloudFormation 用户指南》中的资源类型支持

解析只写属性

一些支持的资源包含只写属性。可以写入这些属性来配置属性,但不能被 IaC 生成器读 AWS CloudFormation 取或获取值。例如,出于安全考虑,用于指定数据库密码的属性可能是只写的。

在迁移期间扫描资源时,IaC 生成器将检测可能包含只写属性的资源,并将其归类为以下任何类型:

  • MUTUALLY_EXCLUSIVE_PROPERTIES— 这些是特定资源的只写属性,可以互换,用途相似。配置您的资源需要其中一个互斥的属性。例如,AWS::Lambda::Function资源的S3BucketImageUri、和ZipFile属性是互斥的只写属性。其中任何一个都可用于指定函数资产,但必须使用一个。

  • MUTUALLY_EXCLUSIVE_TYPES— 这些是必需的只写属性,可接受多种配置类型。例如,AWS::ApiGateway::RestApi资源的Body属性接受对象或字符串类型。

  • UNSUPPORTED_PROPERTIES— 这些是只写属性,不属于其他两个类别。它们要么是可选属性,要么是接受对象数组的必需属性。

有关只写属性以及 IaC 生成器在扫描已部署资源和创建 AWS CloudFormation 模板时如何管理这些属性的更多信息,请参阅《用户指南》中的 IaC 生成器和只写属性。AWS CloudFormation

迁移后,您必须在新 CDK 应用程序中指定只写属性值。 AWS CDK CLI将在 CDK 项目的ReadMe文件中追加警告部分,以记录 IaC 生成器识别的所有只写属性。以下是 示例:

# Welcome to your CDK TypeScript project ... ## Warnings ### Write-only properties Write-only properties are resource property values that can be written to but can't be read by AWS CloudFormation or CDK Migrate. For more information, see [IaC generator and write-only properties](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/generate-IaC-write-only-properties.html). Write-only properties discovered during migration are organized here by resource ID and categorized by write-only property type. Resolve write-only properties by providing property values in your CDK app. For guidance, see [Resolve write-only properties](https://docs.aws.amazon.com/cdk/v2/guide/migrate.html#migrate-resources-writeonly). ### MyLambdaFunction - **UNSUPPORTED_PROPERTIES**: - SnapStart/ApplyOn: Applying SnapStart setting on function resource type.Possible values: [PublishedVersions, None] This property can be replaced with other types - Code/S3ObjectVersion: For versioned objects, the version of the deployment package object to use. This property can be replaced with other exclusive properties - **MUTUALLY_EXCLUSIVE_PROPERTIES**: - Code/S3Bucket: An Amazon S3 bucket in the same AWS Region as your function. The bucket can be in a different AWS account. This property can be replaced with other exclusive properties - Code/S3Key: The Amazon S3 key of the deployment package. This property can be replaced with other exclusive properties
  • 警告按标题进行组织,标识与之关联的资源的逻辑 ID。

  • 警告按类型分类。这些类型直接来自 IaC 生成器。

解析只写属性
  1. 从 CDK 项目文件的 “警告” 部分确定要解决的只写属性。ReadMe在这里,您可以记下 CDK 应用程序中可能包含只写属性的资源,并识别发现的只写属性类型。

    1. 对于MUTUALLY_EXCLUSIVE_PROPERTIES,请确定要在您的 AWS CDK 应用程序中配置哪个互斥属性。

    2. 对于MUTUALLY_EXCLUSIVE_TYPES,请确定您将使用哪种可接受的类型来配置该属性。

    3. 对于UNSUPPORTED_PROPERTIES,确定该属性是可选的还是必需的。然后,根据需要进行配置。

  2. 使用 IaC 生成器和只写属性的指导来引用警告类型的含义。

  3. 在您的 CDK 应用程序中,还将在应用程序的Props部分中指定要解析的只写属性值。请在此处提供正确的值。有关属性描述和指导,您可以参考 AWS CDK API 参考

    以下是迁移后的 CDK 应用程序中该Props部分的示例,其中包含两个需要解析的只写属性:

    export interface MyTestAppStackProps extends cdk.StackProps { /** * The Amazon S3 key of the deployment package. */ readonly lambdaFunction00asdfasdfsadf008grk1CodeS3Keym8P82: string; /** * An Amazon S3 bucket in the same AWS Region as your function. The bucket can be in a different AWS account. */ readonly lambdaFunction00asdfasdfsadf008grk1CodeS3Bucketzidw8: string; }

解析完所有只写属性值后,就可以为部署做好准备了。

迁移.json 文件

迁移期间会在您的 AWS CDK 项目中 AWS CDK CLI创建一个migrate.json文件。此文件包含有关已部署资源的参考信息。首次部署 CDK 应用程序时,会 AWS CDK CLI使用此文件引用已部署的资源,将您的资源与新 AWS CloudFormation 堆栈关联起来,然后删除该文件。

管理和部署您的 CDK 应用程序

迁移到时 AWS CDK,新的 CDK 应用程序可能无法立即部署就绪。本主题介绍在管理和部署新 CDK 应用程序时需要考虑的操作项目。

准备部署

在部署之前,您必须准备好您的 CDK 应用程序。

合成您的应用程序

使用cdk synth命令将 CDK 应用程序中的堆栈合成一个模板。 AWS CloudFormation

如果您从已部署的 AWS CloudFormation 堆栈或模板迁移,则可以将合成后的模板与迁移的模板进行比较,以验证资源和属性值。

要了解有关 cdk synth 的更多信息,请参阅合成堆栈

执行差异

如果您从已部署的 AWS CloudFormation 堆栈迁移,则可以使用 cdk diff 命令与新 CDK 应用程序中的堆栈进行比较。

要了解有关 cdk 差异的更多信息,请参阅。比较堆栈

引导您的环境

如果您是第一次从 AWS 环境进行部署,请使用cdk bootstrap来准备您的环境。要了解更多信息,请参阅正在引导

部署你的 CDK 应用程序

当您部署 CDK 应用程序时, AWS CDK CLI会利用该 AWS CloudFormation 服务来配置您的资源。资源在 CDK 应用程序中捆绑到单个堆栈中,并作为单个 AWS CloudFormation 堆栈进行部署。

根据您从何处迁移,您可以进行部署以创建新 AWS CloudFormation 堆栈或更新现有 AWS CloudFormation 堆栈。

部署以创建新 AWS CloudFormation 堆栈

如果您从已部署的资源迁移,则 AWS CDK CLI将在部署时自动创建一个新 AWS CloudFormation 堆栈。您部署的资源将包含在新 AWS CloudFormation 堆栈中。

如果您从从未部署过的本地 AWS CloudFormation 模板迁移,则 AWS CDK CLI将在部署时自动创建一个新 AWS CloudFormation 堆栈。

如果您从先前部署的已部署 AWS CloudFormation 堆栈或本地 AWS CloudFormation 模板迁移,则可以进行部署以创建新的 AWS CloudFormation 堆栈。要创建新堆栈,请执行以下操作:

  • 部署到新 AWS 环境。这包括使用不同的 AWS 账户或部署到不同的账户 AWS 区域。

  • 如果要将新堆栈部署到迁移后的堆栈或模板的相同 AWS 环境中,则必须将 CDK 应用程序中的堆栈名称修改为新值。您还必须修改 CDK 应用程序中资源的所有逻辑 ID。然后,您可以部署到同一环境以创建新堆栈和新资源。

部署以更新现有 AWS CloudFormation 堆栈

如果您从先前部署的已部署 AWS CloudFormation 堆栈或本地 AWS CloudFormation 模板迁移,则可以进行部署以更新现有 AWS CloudFormation 堆栈。

验证 CDK 应用程序中的堆栈名称是否与已 AWS CloudFormation 部署堆栈的堆栈名称相匹配,然后部署到相同的 AWS 环境中。