从现有的资源中创建堆栈 - Amazon CloudFormation
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

从现有的资源中创建堆栈

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

先决条件

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

  • 描述新堆栈中要包含的所有资源的模板。您可将模板保存在本地或 Amazon S3 存储桶中。

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

示例 模板

在本演练中,我们假设您使用以下名为 TemplateToImport.json 的示例模板,该模板指定了在 CloudFormation 之外创建的两个 DynamoDB 表。ServiceTableGamesTable 都是要导入的目标。

注意

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

{ "AWSTemplateFormatVersion": "2010-09-09", "Description": "Import test", "Resources": { "ServiceTable": { "Type": "AWS::DynamoDB::Table", "DeletionPolicy": "Retain", "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 } } } } }

使用 Amazon Web Services Management Console 从现有的资源中创建堆栈

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

  2. Stacks (堆栈) 页面上,选择 Create stack (创建堆栈),然后选择 With existing resources (import resources) (使用现有的资源 (导入资源))

    控制台中的 Create stack from existing resources (从现有的资源中创建堆栈) 选项。
  3. 访问 Import overview (导入概述) 页面,以查看在该操作期间需要提供的内容列表。然后选择下一步

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

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

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

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

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

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

    3. 选择下一步

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

    重要

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

  7. Review stack-name (查看 <堆栈名称>) 页面上,确认正在导入正确的资源,然后选择 Import resources (导入资源)。这会自动执行在上一步中创建的更改集。

    将显示新堆栈的 Stack details(堆栈详细信息)页面的 Events(事件)窗格。

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

  9. (可选)如果导入的资源与预期的模板配置不匹配,请更正模板配置或直接更新资源。在本演练中,我们更正模板配置以与其实际配置匹配。

    1. 为受影响的资源恢复导入操作

    2. 再次将导入目标添加到模板中,从而确保模板配置与实际配置匹配。

    3. 使用修改的模板重复步骤 2 - 8,以再次导入资源。

使用 Amazon CLI 从现有的资源中创建堆栈

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

    $ aws cloudformation get-template-summary \ --template-url https://DOC-EXAMPLE-BUCKET.s3.us-west-2.amazonaws.com/TemplateToImport.json

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

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

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

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

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

    [ { "ResourceType":"AWS::DynamoDB::Table", "LogicalResourceId":"GamesTable", "ResourceIdentifier":{ "TableName":"Games" } }, { "ResourceType":"AWS::DynamoDB::Table", "LogicalResourceId":"ServiceTable", "ResourceIdentifier":{ "TableName":"Service" } } ]
  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://DOC-EXAMPLE-BUCKET.s3.us-west-2.amazonaws.com/TemplateToImport.json \ --resources-to-import '[{"ResourceType":"AWS::DynamoDB::Table","LogicalResourceId":"GamesTable","ResourceIdentifier":{"TableName":"Games"}},{"ResourceType":"AWS::DynamoDB::Table","LogicalResourceId":"ServiceTable","ResourceIdentifier":{"TableName":"Service"}}]'
    注意

    --resources-to-import 不支持内联 YAML。JSON 字符串中对转义引号的要求因终端而异。有关更多信息,请参阅《Amazon 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 堆栈运行偏差检测,以确保导入的资源的模板和实际配置匹配。有关检测偏差的更多信息,请参阅 在单个堆栈资源上检测偏差

    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. (可选)如果导入的资源与预期的模板配置不匹配,请更正模板配置或直接更新资源。在本演练中,我们更正模板配置以与其实际配置匹配。

    1. 为受影响的资源恢复导入操作

    2. 再次将导入目标添加到模板中,从而确保模板配置与实际配置匹配。

    3. 使用修改的模板重复步骤 3 - 6,以再次导入资源。