将现有的资源导入到堆栈 - AWS CloudFormation

将现有的资源导入到堆栈

本主题演示了如何通过在模板中描述现有的 AWS 资源,从而将其导入现有的堆栈。要改为扫描现有的资源并自动生成模板,以用于将现有资源导入 CloudFormation 或在新账户中复制资源,请参阅 使用 IaC 生成器为现有资源生成模板

先决条件

在开始之前,您必须具有以下内容:

  • 描述整个堆栈的模板,包括堆栈已包含的资源和要导入的资源。您可将模板保存在本地或 Amazon S3 存储桶中。

    获取正在运行的堆栈的模板副本

    1. 通过以下网址打开 CloudFormation 控制台:https://console.aws.amazon.com/cloudformation/

    2. 从堆栈列表中,选择要从中检索模板的堆栈。

    3. 在堆栈详细信息窗格中,选择模板选项卡,然后选择复制到剪贴板

    4. 将代码粘贴到文本编辑器中,从而开始向模板添加其他资源。

  • 对于要导入的每个资源,请包括以下内容:

示例 模板

在本演练中,我们假设您使用以下名为 TemplateToImport.json 的示例模板,该模板指定了两个 DynamoDB 表。ServiceTable 当前是该堆栈的一部分,而 GamesTable 是您要导入的表。

注意

此模板仅作为示例。要将其用于自己的测试目的,请使用您账户中的资源替换示例资源。

{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "Import test", "Resources": { "ServiceTable": { "Type": "AWS::DynamoDB::Table", "Properties": { "TableName": "Service", "AttributeDefinitions": [ { "AttributeName": "key", "AttributeType": "S" } ], "KeySchema": [ { "AttributeName": "key", "KeyType": "HASH" } ], "ProvisionedThroughput": { "ReadCapacityUnits": 5, "WriteCapacityUnits": 1 } } }, "GamesTable": { "Type": "AWS::DynamoDB::Table", "DeletionPolicy": "Retain", "Properties": { "TableName": "Games", "AttributeDefinitions": [ { "AttributeName": "key", "AttributeType": "S" } ], "KeySchema": [ { "AttributeName": "key", "KeyType": "HASH" } ], "ProvisionedThroughput": { "ReadCapacityUnits": 5, "WriteCapacityUnits": 1 } } } } }

使用 AWS Management Console 将现有资源导入到堆栈

注意

在导入资源时,AWS CloudFormation 控制台不支持使用内置函数 Fn:: Transform。您可以使用 AWS Command Line Interface 导入使用内置函数 Fn:: Transform 的资源。

  1. 登录到 AWS Management Console 并打开 AWS CloudFormation 控制台 https://console.aws.amazon.com/cloudformation

  2. Stacks (堆栈) 页面上,选择要将资源导入到的堆栈。

  3. 选择 Stack actions (堆栈操作),然后选择 Import resources into stack (将资源导入到堆栈)

    控制台中的 Import resources into stack (将资源导入到堆栈) 选项。
  4. 查看 Import overview (导入概述) 页面,然后选择 Next (下一步)

  5. Specify template (指定模板) 页面上,使用以下方法之一提供更新的模板,然后选择 Next (下一步)

    • 选择 Amazon S3 URL,然后在文本框中指定您的模板的 URL。

    • 选择 Upload a template file (上传模板文件),然后浏览您的模板。

  6. Identify resources(标识资源)页面上,标识每个目标资源。有关更多信息,请参阅 资源标识符

    1. Identifier property (标识符属性) 下面,选择资源标识符的类型。例如,可以使用 TableName 属性标识 AWS::DynamoDB::Table 资源。

    2. Identifier value (标识符值) 下面,键入实际属性值。例如,示例模板中的 GamesTable 资源的 TableNameGames

    3. 选择下一步

  7. Specify stack details (指定堆栈详细信息) 页面上,更新任何参数,然后选择 Next (下一步)。这会自动创建一个更改集。

    注意

    如果您修改的现有参数启动创建、更新或删除操作,导入操作将失败。

  8. Review stack-name (查看 <堆栈名称>) 页面上,查看要导入的资源,然后选择 Import resources (导入资源)。这会自动执行在上一步中创建的更改集。此时,任何堆栈级标签将应用于导入的资源。有关更多信息,请参阅 配置堆栈选项

    将显示堆栈的 Events (事件) 页面。

    控制台中的 Events (事件) 选项卡。
  9. (可选)对堆栈运行偏差检测,以确保导入的资源的模板和实际配置匹配。有关检测偏差的更多信息,请参阅 在整个 CloudFormation 堆栈上检测偏差

  10. (可选)如果导入的资源与预期的模板配置不匹配,请更正模板配置或直接更新资源。有关导入偏差的资源的更多信息,请参阅 通过导入操作消除偏差

使用 AWS CLI 将现有资源导入到堆栈

  1. 要了解哪些属性标识模板中的每种资源类型,请运行 get-template-summary 命令并指定模板的 S3 URL。例如,可以使用 TableName 属性标识 AWS::DynamoDB::Table 资源。对于示例模板中的 GamesTable 资源,TableName 的值为 Games。您在下一步中需要此信息。

    aws cloudformation get-template-summary \ --template-url https://amzn-s3-demo-bucket.s3.us-west-2.amazonaws.com/TemplateToImport.json

    有关更多信息,请参阅 资源标识符

  2. 按照以下 JSON 字符串格式,编写要导入的实际资源及其唯一标识符的列表。

    [{"ResourceType":"AWS::DynamoDB::Table","LogicalResourceId":"GamesTable","ResourceIdentifier":{"TableName":"Games"}}]

    或者,您可以在配置文件中指定 JSON 格式参数。

    例如,要导入 GamesTable,可以创建一个包含以下配置的 ResourcesToImport.txt 文件。

    [ { "ResourceType":"AWS::DynamoDB::Table", "LogicalResourceId":"GamesTable", "ResourceIdentifier": { "TableName":"Games" } } ]
  3. 要创建更改集,请使用以下 create-change-set 命令并替换占位符文本。对于 --change-set-type 选项,请指定 IMPORT 的值。对于 --resources-to-import 选项,将示例 JSON 字符串替换为您刚刚创建的实际 JSON 字符串。

    aws cloudformation create-change-set \ --stack-name TargetStack --change-set-name ImportChangeSet \ --change-set-type IMPORT \ --template-url https://amzn-s3-demo-bucket.s3.us-west-2.amazonaws.com/TemplateToImport.json \ --resources-to-import '[{"ResourceType":"AWS::DynamoDB::Table","LogicalResourceId":"GamesTable","ResourceIdentifier":{"TableName":"Games"}}]'
    注意

    --resources-to-import 不支持内联 YAML。JSON 字符串中对转义引号的要求因终端而异。有关更多信息,请参阅《AWS Command Line Interface User Guide》中的 Using quotation marks inside strings

    或者,您可以使用文件 URL 作为 --resources-to-import 选项的输入内容,如以下示例所示。

    --resources-to-import file://ResourcesToImport.txt
  4. 查看更改集,以确保将导入正确的资源。

    aws cloudformation describe-change-set \ --change-set-name ImportChangeSet --stack-name TargetStack
  5. 要启动更改集并导入资源,请使用以下 execute-change-set 命令并替换占位符文本。此时,任何堆栈级标签将应用于导入的资源。有关更多信息,请参阅 配置堆栈选项。在成功完成该操作后 (IMPORT_COMPLETE),将成功导入资源。

    aws cloudformation execute-change-set \ --change-set-name ImportChangeSet --stack-name TargetStack
  6. (可选)对 IMPORT_COMPLETE 堆栈运行偏差检测,以确保导入的资源的模板和实际配置匹配。有关检测偏差的更多信息,请参阅 在整个 CloudFormation 堆栈上检测偏差

    1. 对指定堆栈运行偏差检测。

      aws cloudformation detect-stack-drift --stack-name TargetStack

      如果成功,此命令将返回以下示例输出:

      { "Stack-Drift-Detection-Id" : "624af370-311a-11e8-b6b7-500cexample" }
    2. 查看指定堆栈偏差检测 ID 的偏差检测操作进度。

      aws cloudformation describe-stack-drift-detection-status \ --stack-drift-detection-id 624af370-311a-11e8-b6b7-500cexample
    3. 查看已在指定堆栈中检查偏差的资源的偏差信息。

      aws cloudformation describe-stack-resource-drifts --stack-name TargetStack
  7. (可选)如果导入的资源与预期的模板配置不匹配,请更正模板配置或直接更新资源。有关导入偏差的资源的更多信息,请参阅 通过导入操作消除偏差