

# ネストされたスタックを使用してテンプレートを再利用可能な部分に分割する
<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) リソースを使用してこれらの専用テンプレートを参照し、ネストされたスタックを作成できます。

たとえば、ほとんどのスタックに使用しているロードバランサー構成があると仮定します。テンプレートに同じ構成をコピーアンドペーストする代わりに、ロードバランサーを対象にした専用テンプレートを作成できます。次に、同じロードバランサー構成を必要とする他のテンプレート内からこのテンプレートを参照できます。

ネストされたスタックには他のネストされたスタックを含めることができるため、次の図に示すようにスタックの階層になっています。ルートスタックは、ネストされたすべてのスタックが最終的に属する最上位スタックです。ネストされたスタックにはそれぞれ、直接の親スタックが存在します。第 1 レベルのネストされたスタックの場合は、ルートスタックにも親スタックが存在します。
+ スタック A は、階層内のネストされたその他すべてのスタックのルートスタックを表します。
+ スタック B から見ると、スタック A は親スタックであると同時にルートスタックでもあります。
+ スタック D から見るとスタック C が親スタック、スタック C から見るとスタック B が親スタックです。

![\[別のスタックの一部として作成されているネストされたスタックには、直接の親スタックと最上位のルートスタックが存在します。\]](http://docs.aws.amazon.com/ja_jp/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 テンプレートを、ネストされたテンプレートを使用するより構造的で再利用可能な設計に再編成する方法を説明します。元の「ネスト前のスタック」テンプレートでは、1 つのファイルにすべてのリソースが定義されているのがわかります。このテンプレートは、リソースの数が増えるにつれて煩雑になり、管理しにくくなる可能性があります。「ネスト後のスタック」テンプレートは、リソースをより小規模な個別のテンプレートに分割しています。ネストされたスタックは、それぞれが関連するリソースの特定のセットを処理するため、構造全体がよりよく整理され、維持しやすくなります。


| スタックをネストする前 | スタックをネストした後 | 
| --- | --- | 
| <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** コマンドを使用すると、デプロイの準備を行うのに役立ちます。このコマンドは、ローカルのアーティファクト (`TemplateURL` を含む) を自動的に Amazon S3 にアップロードし、これらの S3 の場所への更新された参照を含む新しいテンプレートファイルを生成します。詳細については、「[AWS CLI を使用してローカルアーティファクトを S3 バケットにアップロードする](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 リソースが含まれるネストされたスタックについては、`--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>

ネストされたスタックを扱う場合は、操作時に注意が必要です。特定のスタックオペレーション (例: スタックの更新) では、ネストされたスタックから直接実行するのではなく、ルートスタックから起動する必要があります。ルートスタックを更新すると、テンプレートが変更されたネストされたスタックのみが更新されます。

さらに、ネストされたスタックがあると、ルートスタックでのオペレーションに影響する場合があります。たとえば、ネストされたスタックの 1 つが `UPDATE_ROLLBACK_IN_PROGRESS` 状態でスタックした場合、ルートスタックはそのネストされたスタックがロールバックを完了するまで待機してから続行します。更新オペレーションに進む前に、スタックの更新がロールバックされた場合にキャンセルする IAM アクセス権限があることを確認してください。詳細については、「[AWS Identity and Access Management で CloudFormation アクセスを制御する](control-access-with-iam.md)」を参照してください。

ルートスタックとネストされたスタックを検索するには、次の手順を実行します。

**ネストされたスタックのルートスタックを表示するには**

1. AWS マネジメントコンソール にサインインし、CloudFormation コンソール ([https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)) を開きます。

1. **[スタック]** ページで、ルートスタックを表示するネストされたスタックの名前を選択します。

   ネストされたスタックについては、スタック名の上に **[NESTED]** と表示されます。

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)