

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 運用巢狀堆疊，將範本分割成可重複使用的部分
<a name="using-cfn-nested-stacks"></a>

隨著基礎設施擴充，您可能會在多個範本中重複建立相同的資源組態。為避免這種重複性，您可以將這些通用組態拆分至專用範本中。然後，在其他範本中使用 [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html) 資源參考這些專用範本，建立巢狀堆疊。

例如，假設您有一個用於您大多數堆疊的負載平衡器組態。相較於複製相同的組態並在您的範本中貼上，您可以為負載平衡器建立專用的範本。之後，任何需要相同負載平衡器組態的其他範本，都可以參考此範本。

巢狀堆疊本身也能包含其他巢狀堆疊，形成堆疊的階層，如下圖所示。*根堆疊*為最上層的堆疊，即為所有巢狀堆疊最終所屬的堆疊。每一個巢狀堆疊都有一個立即的「父系堆疊」。針對第一層巢狀堆疊，根堆疊也是其父系堆疊。
+ 堆疊 A 是所有其他、巢狀、階層中堆疊的根堆疊。
+ 針對堆疊 B，堆疊 A 同時是其父系堆疊及根堆疊。
+ 針對堆疊 D，堆疊 C 是父系堆疊；針對堆疊 C，堆疊 B 為其父系堆疊。

![\[巢狀堆疊，即做為另一個堆疊的部分建立的堆疊，具有立即的父系堆疊，以及最上層的根堆疊。\]](http://docs.aws.amazon.com/zh_tw/AWSCloudFormation/latest/UserGuide/images/cfn-console-nested-stacks.png)


**Topics**
+ [範本拆分的前後範例](#create-nested-stack-template)
+ [巢狀堆疊架構範例](#nested-stack-examples)
+ [對巢狀堆疊執行堆疊操作](#perform-stack-operations-on-nested-stacks)
+ [相關資訊](#nested-stacks-related-information)

## 範本拆分的前後範例
<a name="create-nested-stack-template"></a>

本範例展示如何將單一大型 CloudFormation 範本，透過巢狀範本，重組為更具結構化且可重複使用的設計。一開始，「巢狀堆疊前」的範本將所有資源定義在同一個檔案中。隨著資源數量增加，這種方式會變得雜亂且難以管理。「巢狀堆疊後」的範本將資源拆分至多個較小的獨立範本中。每個巢狀堆疊負責處理一組特定的相關資源，使整體結構更具條理且易於維護。


| 巢狀堆疊前 | 巢狀堆疊後 | 
| --- | --- | 
| <pre>AWSTemplateFormatVersion: 2010-09-09<br />Parameters:<br />  InstanceType:<br />    Type: String<br />    Default: t2.micro<br />    Description: The EC2 instance type<br />  <br />  Environment:<br />    Type: String<br />    Default: Production<br />    Description: The deployment environment<br /><br />Resources:<br />  MyEC2Instance:<br />    Type: AWS::EC2::Instance<br />    Properties:<br />      ImageId: ami-1234567890abcdef0<br />      InstanceType: !Ref InstanceType<br /><br />  MyS3Bucket:<br />    Type: AWS::S3::Bucket</pre> | <pre>AWSTemplateFormatVersion: 2010-09-09<br />Resources:<br />  MyFirstNestedStack:<br />    Type: AWS::CloudFormation::Stack<br />    Properties:<br />      TemplateURL: https://s3.amazonaws.com/amzn-s3-demo-bucket/first-nested-stack.yaml<br />      Parameters:<br />        # Pass parameters to the nested stack if needed<br />        InstanceType: t3.micro<br /><br />  MySecondNestedStack:<br />    Type: AWS::CloudFormation::Stack<br />    Properties:<br />      TemplateURL: https://s3.amazonaws.com/amzn-s3-demo-bucket/second-nested-stack.yaml<br />      Parameters:<br />        # Pass parameters to the nested stack if needed<br />        Environment: Testing<br />    DependsOn: MyFirstNestedStack</pre> | 

## 巢狀堆疊架構範例
<a name="nested-stack-examples"></a>

本節展示一個巢狀堆疊架構，包含一個參考巢狀堆疊的最上層堆疊。該巢狀堆疊會部署 Node.js Lambda 函式，從最上層堆疊接收參數數值，並傳回透過最上層堆疊公開的輸出。

**Topics**
+ [步驟 1：在本機系統建立巢狀堆疊的範本](#create-a-nested-stack-template)
+ [步驟 2：在本機系統建立最上層堆疊的範本](#create-a-nested-stack-parent-template)
+ [步驟 3：封裝並部署範本](#create-a-nested-stack-parent-template)

### 步驟 1：在本機系統建立巢狀堆疊的範本
<a name="create-a-nested-stack-template"></a>

下列範例示範巢狀堆疊範本的格式。

#### YAML
<a name="nested-stack-child-example.yaml"></a>

```
 1. AWSTemplateFormatVersion: 2010-09-09
 2. Description: Nested stack template for Lambda function deployment
 3. Parameters:
 4.   MemorySize:
 5.     Type: Number
 6.     Default: 128
 7.     MinValue: 128
 8.     MaxValue: 10240
 9.     Description: Lambda function memory allocation (128-10240 MB)
10. Resources:
11.   LambdaFunction:
12.     Type: AWS::Lambda::Function
13.     Properties:
14.       FunctionName: !Sub "${AWS::StackName}-Function"
15.       Runtime: nodejs18.x
16.       Handler: index.handler
17.       Role: !GetAtt LambdaExecutionRole.Arn
18.       Code:
19.         ZipFile: |
20.           exports.handler = async (event) => {
21.             return {
22.               statusCode: 200,
23.               body: JSON.stringify('Hello from Lambda!')
24.             };
25.           };
26.       MemorySize: !Ref MemorySize
27.   LambdaExecutionRole:
28.     Type: AWS::IAM::Role
29.     Properties:
30.       AssumeRolePolicyDocument:
31.         Version: '2012-10-17'
32.         Statement:
33.           - Effect: Allow
34.             Principal:
35.               Service: lambda.amazonaws.com
36.             Action: sts:AssumeRole
37.       ManagedPolicyArns:
38.         - 'arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole'
39. Outputs:
40.   LambdaArn:
41.     Description: ARN of the created Lambda function
42.     Value: !GetAtt LambdaFunction.Arn
```

### 步驟 2：在本機系統建立最上層堆疊的範本
<a name="create-a-nested-stack-parent-template"></a>

下列範例展示最上層堆疊範本的格式，以及參考您在上一步建立之堆疊的 [https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-resource-cloudformation-stack.html) 資源。

#### YAML
<a name="nested-stack-parent-example.yaml"></a>

```
 1. AWSTemplateFormatVersion: 2010-09-09
 2. Description: Top-level stack template that deploys a nested stack
 3. Resources:
 4.   NestedStack:
 5.     Type: AWS::CloudFormation::Stack
 6.     Properties:
 7.       TemplateURL: /path_to_template/nested-template.yaml
 8.       Parameters:
 9.         MemorySize: 256
10. Outputs:
11.   NestedStackLambdaArn:
12.     Description: ARN of the Lambda function from nested stack
13.     Value: !GetAtt NestedStack.Outputs.LambdaArn
```

### 步驟 3：封裝並部署範本
<a name="create-a-nested-stack-parent-template"></a>

**注意**  
在本機使用範本時， AWS CLI **package**命令可協助您準備部署的範本。它會自動處理本機成品上傳至 Amazon S3 (包括 `TemplateURL`)，並產生新的範本檔案，其中包含這些 S3 位置的更新參考。如需詳細資訊，請參閱[使用 將本機成品上傳至 S3 儲存貯體 AWS CLI](using-cfn-cli-package.md)。

接著，您可以使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/package.html) 命令將巢狀範本上傳至 Amazon S3 儲存貯體。

```
aws cloudformation package \
  --s3-bucket amzn-s3-demo-bucket \
  --template /path_to_template/top-level-template.yaml \
  --output-template-file packaged-template.yaml \
  --output json
```

命令會在 `--output-template-file` 指定的路徑上產生新的範本。如下所示，它會將 `TemplateURL` 參考取代為 Amazon S3 位置。

**產生範本**

```
AWSTemplateFormatVersion: 2010-09-09
Description: Top-level stack template that deploys a nested stack
Resources:
  NestedStack:
    Type: AWS::CloudFormation::Stack
    Properties:
      TemplateURL: https://s3.us-west-2.amazonaws.com/amzn-s3-demo-bucket/8b3bb7aa7abfc6e37e2d06b869484bed.template
      Parameters:
        MemorySize: 256
Outputs:
  NestedStackLambdaArn:
    Description: ARN of the Lambda function from nested stack
    Value:
      Fn::GetAtt:
      - NestedStack
      - Outputs.LambdaArn
```

執行 **package** 命令後，您可以使用 [https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/deploy/) 命令部署已處理的範本。對於包含 IAM 資源巢狀堆疊的 IAM 功能，您必須透過包含 `--capabilities` 選項確認 IAM 功能。

```
aws cloudformation deploy \
  --template-file packaged-template.yaml \
  --stack-name stack-name \
  --capabilities CAPABILITY_NAMED_IAM
```

## 對巢狀堆疊執行堆疊操作
<a name="perform-stack-operations-on-nested-stacks"></a>

處理巢狀堆疊時，執行操作時需謹慎對待。某些堆疊操作 (例如堆疊更新) 應從根堆疊啟動，而非直接在巢狀堆疊上執行。更新根堆疊時，僅有範本發生變更的巢狀堆疊會被更新。

此外，巢狀堆疊的存在可能會影響對根堆疊的操作。例如，若某個巢狀堆疊卡在 `UPDATE_ROLLBACK_IN_PROGRESS` 狀態，根堆疊會等待該巢狀堆疊完成復原後再繼續。執行更新操作前，請確保您具備取消堆疊更新的 IAM 許可，以防其復原。如需詳細資訊，請參閱[使用 控制 CloudFormation 存取 AWS Identity and Access Management](control-access-with-iam.md)。

透過下列步驟尋找根堆疊和巢狀堆疊。

**檢視巢狀堆疊的根堆疊**

1. 登入 AWS 管理主控台 並在 https：//[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) 開啟 CloudFormation 主控台。

1. 在**堆疊**頁面上，選擇要檢視根堆疊的巢狀堆疊名稱。

   巢狀堆疊會在其堆疊名稱上方顯示**巢狀**。

1. 在**堆疊資訊**索引標籤的**概觀**區段中，選擇列為**根堆疊**的堆疊名稱。

**檢視屬於根堆疊的巢狀堆疊**

1. 從您要檢視其巢狀堆疊的根堆疊，選擇**資源**索引標籤。

1. 在**類型**欄中，尋找 **AWS::CloudFormation::Stack** 類型的資源。

## 相關資訊
<a name="nested-stacks-related-information"></a>
+ [巢狀現有堆疊](resource-import-nested-stacks.md)
+ [了解更新堆疊資源的行為](using-cfn-updating-stacks-update-behaviors.md)
+ [從失敗的巢狀堆疊更新中繼續復原](using-cfn-updating-stacks-continueupdaterollback.md#nested-stacks)
+ [巢狀堆疊復原失敗](troubleshooting.md#troubleshooting-errors-nested-stacks-are-stuck)