将现有资源和 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

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

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

迁移是如何运作的

使用 AWS CDK CLI cdk 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 ,甚至需要开始。使用 M CDK igrate, AWS CDK CLI 在很短的时间内为您完成大部分迁移工作。CDKMigrate 可以让你快速开始使用 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迁移仅创建 L1 结构

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

CDKMigrat CDK e 会创建包含单个堆栈的应用程序

新创建的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迁移支持单模板迁移

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

迁移带有内在函数的模板

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

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

扫描限制

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

先决条件

在使用该cdk migrate命令之前,请完成中的所有设置步骤开始使用 AWS CDK

开始使用 M CDK igrate

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

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

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

堆栈名称

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

Language

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

AWS 账户和 AWS 区域

的 AWS CDK CLI 从默认来源检索 AWS 账户和 AWS 区域 信息。有关更多信息,请参阅 的环境 AWS CDK。您可以使用--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 尝试将已部署的资源逻辑IDs和已部署的 AWS CloudFormation 堆栈名称与新CDK应用程序中迁移的资源和堆栈进行匹配。

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

从 AWS CloudFormation 模板迁移

CDKMigrate 支持从格式为JSON或的 AWS CloudFormation 模板迁移YAML

要从本地 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. 在包含已迁移 AWS CloudFormation 模板的CDK应用程序中创建堆栈。

迁移后,您可以正常管理和修改您的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 CLI sam 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 CLI 迁移期间在您的 AWS CDK 项目中创建一个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来准备您的环境。要了解更多信息,请参阅 AWS CDK 自力更生

部署您的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应用程序中的所有资源逻辑IDs。然后,您可以部署到同一环境以创建新堆栈和新资源。

部署以更新现有 AWS CloudFormation 堆栈

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

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