

# 嵌套堆栈的更改集
<a name="change-sets-for-nested-stacks"></a>

使用*嵌套堆栈的更改集*，您可以预览整个嵌套堆栈层次结构中应用程序和基础架构资源的更改，并在确认所有更改均是预期更改后继续进行更新。

有关嵌套堆栈的更改集的更多详细信息，请参阅以下各节：

**Topics**
+ [更改集和嵌套堆栈概述](#overview-of-change-sets-and-nested-stacks)
+ [使用嵌套堆栈的更改集（控制台）](#change-sets-for-nested-stacks-console)
+ [使用嵌套堆栈的更改集 (Amazon CLI)](#change-sets-for-nested-stacks-cli)

## 更改集和嵌套堆栈概述
<a name="overview-of-change-sets-and-nested-stacks"></a>

嵌套堆栈的更改集将以下功能组合在一起，以扩大对整个堆栈层次结构作出的更改的预览范围：
+ *更改集*是 CloudFormation 的一种功能，可用来预览对堆栈的建议更改将会对现有或新创建资源带来的影响。创建更改集时，CloudFormation 通过将堆栈与您提交的资源更改进行比较，提供建议更改列表。有关更改集的更多信息，请参阅[使用更改集更新 CloudFormation 堆栈](using-cfn-updating-stacks-changesets.md)。
+ *嵌套堆栈*是作为其他堆栈的一部分创建的堆栈。例如，在一个嵌套堆栈中可能具有与联网和安全相关的资源，而在另一个嵌套堆栈中具有应用程序资源。以这种方式对应用程序模型进行分区有助于提高代码的可维护性和重复使用。有关嵌套堆栈的更多信息，请参阅[使用嵌套堆栈将模板拆分为可重复使用的部分](using-cfn-nested-stacks.md)。

## 使用嵌套堆栈的更改集（控制台）
<a name="change-sets-for-nested-stacks-console"></a>
+ **创建更改集** – 通过从堆栈层次结构任何级别提交更改来创建更改集。您可以提交修改后的堆栈模板或修改后的输入参数值，CloudFormation 会比较嵌套堆栈与您为生成更改集而提交的更改。默认情况下，CloudFormation 控制台中的嵌套堆栈的更改集为已启用状态。有关更多信息，请参阅 [创建 CloudFormation 堆栈的更改集](using-cfn-updating-stacks-changesets-create.md)。  
![默认情况下，为嵌套堆栈创建更改集处于已启用状态。](http://docs.amazonaws.cn/AWSCloudFormation/latest/UserGuide/images/change-sets-for-nested-sets-enabled-default.png)
**注意**  
根更改集是指与从中创建更改集的整个层次结构的堆栈关联的更改集。必须从根更改集中执行或删除嵌套堆栈的更改集。有关更多信息，请参阅 [在嵌套堆栈上执行堆栈操作](using-cfn-nested-stacks.md#perform-stack-operations-on-nested-stacks)。
+ **查看更改集** – 在执行嵌套堆栈内资源的更改之前，可视化查看这些更改。您可以导航到当前堆栈及其嵌套更改集，在更改集的**更改**部分查看建议更改。有关更多信息，请参阅 [查看 CloudFormation 堆栈的更改集](using-cfn-updating-stacks-changesets-view.md)。
+ **执行更改集** – 执行与当前堆栈及其子代相关的更改集中所述的更改。执行操作必须从根更改集进行。有关更多信息，请参阅 [执行 CloudFormation 堆栈的更改集堆栈策略和执行更改集](using-cfn-updating-stacks-changesets-execute.md)。
+ **删除更改集** – 从当前堆栈中删除更改集。删除更改集有助于防止您或其他用户意外启动不应该应用的更改集。删除操作必须从根更改集中执行。有关更多信息，请参阅 [删除 CloudFormation 堆栈的更改集](using-cfn-updating-stacks-changesets-delete.md)。

## 使用嵌套堆栈的更改集 (Amazon CLI)
<a name="change-sets-for-nested-stacks-cli"></a>

### create-change-set
<a name="working-with-change-sets-for-nested-stacks-cli"></a>
+ [https://docs.amazonaws.cn/cli/latest/reference/cloudformation/create-change-set.html](https://docs.amazonaws.cn/cli/latest/reference/cloudformation/create-change-set.html) - 默认情况下，未对 Amazon CLI 启用嵌套堆栈的更改集。要为整个堆栈层次结构创建更改集，请指定 `--include-nested-stacks` 选项。有关更多信息，请参阅 [创建 CloudFormation 堆栈的更改集](using-cfn-updating-stacks-changesets-create.md)。

以下 Amazon CLI 示例为指定的根堆栈创建了一个更改集。

```
aws cloudformation create-change-set \
    --stack-name {{my-root-stack}} \
    --change-set-name {{my-root-stack-change-set}} \
    --template-body {{file://template.yaml}} \
    --capabilities CAPABILITY_IAM \
    --include-nested-stacks
```

下面是示例输出。

```
{
    "Id":"arn:aws:cloudformation:us-west-2:123456789012:changeSet/{{my-root-stack-change-set}}/4eca1a01-e285-xmpl-8026-9a1967bfb4b0",
    "StackId": "arn:aws:cloudformation:us-west-2:123456789012:Stack/{{my-root-stack}}/d0a825a0-e4cd-xmpl-b9fb-061c69e99204"
}
```

### describe-change-set
<a name="working-with-change-set-describe-cli"></a>
+ [https://docs.amazonaws.cn/cli/latest/reference/cloudformation/describe-change-set.html](https://docs.amazonaws.cn/cli/latest/reference/cloudformation/describe-change-set.html) –返回执行更改集时 CloudFormation 将作出的更改的列表。如果指定的更改集包含属于嵌套堆栈的子更改集，则 `ChangeSetId` 将返回有关该更改集的信息。有关更多信息，请参阅 [查看 CloudFormation 堆栈的更改集](using-cfn-updating-stacks-changesets-view.md)。

以下 Amazon CLI 示例描述了指定根堆栈的更改集。

```
aws cloudformation describe-change-set \
    --change-set-name {{my-root-stack-change-set}} \
    --stack-name {{my-root-stack}}
```

下面是示例输出。

```
{
    "Changes": [
        {
            "Type": "Resource",
            "ResourceChange": {
                "Action": "Modify",
                "LogicalResourceId": "ChildStack",
                "PhysicalResourceId": "arn:aws:cloudformation:us-west-2:123456789012:stack/{{my-nested-stack}}/d0a825a0-e4cd-xmpl-b9fb-061c69e99205",
                "ResourceType": "AWS::CloudFormation::Stack",
                "Replacement": "False",
                "ChangeSetId": "arn:aws:cloudformation:us-west-2:123456789012:changeSet/{{my-nested-stack-change-set}}/4eca1a01-e285-xmpl-8026-9a1967bfb4b0",
                "Scope": [
                    "Properties"
                ],
                "Details": [
                    {
                        "Target": {
                            "Attribute": "Properties",
                            "RequiresRecreation": "Never"
                        },
                        "Evaluation": "Dynamic",
                        "ChangeSource": "Automatic"
                    }
                ]
            }
        }
    ],
    "ChangeSetName": "{{my-root-stack-change-set}}",
    "ChangeSetId": "arn:aws:cloudformation:us-west-2:123456789012:changeSet/{{my-root-stack-change-set}}/4eca1a01-e285-xmpl-8026-9a1967bfb4b0",
    "StackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/{{my-root-stack}}/d0a825a0-e4cd-xmpl-b9fb-061c69e99204",
    "StackName": "{{my-root-stack}}",
    "IncludeNestedStacks": true,
    "ParentChangeSetId": null,
    "RootChangeSetId": null,
    "Description": null,
    "Parameters": null,
    "CreationTime": "2020-11-18T05:20:56.651Z",
    "ExecutionStatus": "AVAILABLE",
    "Status": "CREATE_COMPLETE",
    "StatusReason": null,
    "NotificationARNs": [
        
    ],
    "RollbackConfiguration": {
        
    },
    "Capabilities": [
        "CAPABILITY_IAM"
    ],
    "Tags": null
}
```

以下 Amazon CLI 示例描述了指定嵌套堆栈的更改集。

```
aws cloudformation describe-change-set \
    --change-set-name {{my-nested-stack-change-set}} \
    --stack-name {{my-nested-stack}}
```

下面是示例输出。

```
{
    "Changes": [
        {
            "Type": "Resource",
            "ResourceChange": {
                "Action": "Modify",
                "LogicalResourceId": "function",
                "PhysicalResourceId": "my-function",
                "ResourceType": "AWS::Lambda::Function",
                "Replacement": "False",
                "ChangeSetId": null,
                "Scope": [
                    "Properties"
                ],
                "Details": [
                    {
                        "Target": {
                            "Attribute": "Properties",
                            "Name": "Timeout",
                            "RequiresRecreation": "Never"
                        },
                        "Evaluation": "Static",
                        "ChangeSource": "DirectModification"
                    }
                ]
            }
        }
    ],
    "ChangeSetName": "{{my-nested-stack-change-set}}",
    "ChangeSetId": "arn:aws:cloudformation:us-west-2:123456789012:changeSet/{{my-nested-stack-change-set}}/4eca1a01-e285-xmpl-8026-9a1967bfb4b0",
    "StackId": "arn:aws:cloudformation:us-west-2:123456789012:stack/{{my-nested-stack}}/d0a825a0-e4cd-xmpl-b9fb-061c69e99205",
    "ParentChangeSetId": "arn:aws:cloudformation:us-west-2:123456789012:changeSet/{{my-root-stack-change-set}}/4eca1a01-e285-xmpl-8026-9a1967bfb4b0",
    "RootChangeSetId": "arn:aws:cloudformation:us-west-2:123456789012:changeSet/{{my-root-stack-change-set}}/4eca1a01-e285-xmpl-8026-9a1967bfb4b0",
    "IncludeNestedStacks": true,
    "StackName": "{{my-nested-stack}}",
    "Description": null,
    "Parameters": null,
    "CreationTime": "2020-11-18T05:20:56.651Z",
    "ExecutionStatus": "UNAVAILABLE",
    "Status": "CREATE_COMPLETE",
    "StatusReason": "Executable from root change set",
    "NotificationARNs": [
        
    ],
    "RollbackConfiguration": {
        
    },
    "Capabilities": [
        "CAPABILITY_IAM"
    ],
    "Tags": null
}
```

### execute-change-set
<a name="working-with-change-set-execute-cli"></a>
+ [https://docs.amazonaws.cn/cli/latest/reference/cloudformation/execute-change-set.html](https://docs.amazonaws.cn/cli/latest/reference/cloudformation/execute-change-set.html) – 使用在创建指定的更改集时提供的输入信息创建或更新堆栈。要为整个堆栈层次结构创建更改集，必须在 **create-change-set** 操作期间指定 `–-include-nested-stacks` 选项。有关更多信息，请参阅 [执行 CloudFormation 堆栈的更改集堆栈策略和执行更改集](using-cfn-updating-stacks-changesets-execute.md)。
**注意**  
**execute-change-set** 必须从根更改集中执行，并将该更改集应用于整个堆栈层次结构。

以下 Amazon CLI 示例执行了指定根堆栈的更改集。

```
aws cloudformation execute-change-set \
    --stack-name {{my-root-stack}} \
    --change-set-name {{my-root-stack-change-set}}
```

### delete-change-set
<a name="working-with-change-set-delete-cli"></a>
+ [https://docs.amazonaws.cn/cli/latest/reference/cloudformation/delete-change-set.html](https://docs.amazonaws.cn/cli/latest/reference/cloudformation/delete-change-set.html) – 删除指定的更改集。删除更改集可确保不会使用错误的更改集。删除更改集与使用 `–-include-nested-stacks` 选项创建的更改集是不同步的。有关更多信息，请参阅 [删除 CloudFormation 堆栈的更改集](using-cfn-updating-stacks-changesets-delete.md)。
**注意**  
**delete-change-set** 必须从根更改集中执行，并会删除更改集的整个层次结构。如果处于 `REVIEW_IN_PROGRESS` 状态的嵌套堆栈是在 **create-change-set** 操作过程期间创建的，则它们也会被删除。

以下 Amazon CLI 示例删除了指定根堆栈的更改集。

```
aws cloudformation delete-change-set \
    --stack-name {{my-root-stack}} \ 
    --change-set-name {{my-root-stack-change-set}}
```