

# 既存のスタックのネスト化
<a name="resource-import-nested-stacks"></a>

`resource import` 機能を使用して、既存のスタックを別の既存のスタック内にネスト化します。ネスト化されたスタックは、他のテンプレート内から宣言および参照する一般的なコンポーネントです。これにより、同じ構成をテンプレートにコピーして貼り付けるのを避け、スタックの更新を簡素化できます。共通コンポーネントのテンプレートがある場合は、`AWS::CloudFormation::Stack` リソースを使用して、別のテンプレート内からこのテンプレートを参照できます。ネストされたスタックの詳細については、「[ネストされたスタックを使用してテンプレートを再利用可能な部分に分割する](using-cfn-nested-stacks.md)」を参照してください。

CloudFormation は、`resource import` を使用して 1 つのレベルのネスト化のみをサポートします。つまり、子スタックにスタックをインポートしたり、子を持つスタックをインポートしたりすることはできません。

インポートを初めて行う場合は、まず [AWS リソースを CloudFormation スタックに手動でインポートする](import-resources-manually.md) トピックの概要情報を確認することをお勧めします。

## ネストされたスタックのインポートの検証
<a name="resource-import-nested-stacks-validation"></a>

ネストされたスタックのインポートオペレーション中に、CloudFormation は以下の検証を実行します。
+ 親スタックテンプレートのネスト化された `AWS::CloudFormation::Stack` 定義は、実際のネスト化されたスタックのテンプレートと一致します。
+ 親スタックテンプレートのネスト化された `AWS::CloudFormation::Stack` 定義のタグは、実際のネスト化されたスタックリソースのタグと一致します。

## AWS マネジメントコンソール を使用した既存のスタックのネスト化
<a name="resource-import-nested-stacks-console"></a>

1. `Retain` [DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html) を使用して、`AWS::CloudFormation::Stack` リソースを親スタックテンプレートに追加します。次の親スタックテンプレート例では、`MyNestedStack` がインポートのターゲットです。

   **JSON**

   ```
   {
     "AWSTemplateFormatVersion" : "2010-09-09",
     "Resources" : {
       "ServiceTable":{
              "Type":"AWS::DynamoDB::Table",
              "Properties":{
                 "TableName":"Service",
                 "AttributeDefinitions":[
                    {
                       "AttributeName":"key",
                       "AttributeType":"S"
                    }
                 ],
                 "KeySchema":[
                    {
                       "AttributeName":"key",
                       "KeyType":"HASH"
                    }
                 ],
                 "ProvisionedThroughput":{
                    "ReadCapacityUnits":5,
                    "WriteCapacityUnits":1
                 }
              }
           },
       "MyNestedStack" : {
         "Type" : "AWS::CloudFormation::Stack",
         "DeletionPolicy": "Retain",
         "Properties" : {
         "TemplateURL" : "https://s3.amazonaws.com/cloudformation-templates-us-east-2/EC2ChooseAMI.template",
           "Parameters" : {
             "InstanceType" : "t1.micro",
             "KeyName" : "mykey"
           }
         }
       }
     }
   }
   ```

   **YAML**

   ```
   AWSTemplateFormatVersion: 2010-09-09
   Resources:
     ServiceTable:
       Type: AWS::DynamoDB::Table
       Properties:
         TableName: Service
         AttributeDefinitions:
           - AttributeName: key
             AttributeType: S
         KeySchema:
           - AttributeName: key
             KeyType: HASH
         ProvisionedThroughput:
           ReadCapacityUnits: 5
           WriteCapacityUnits: 1
     MyNestedStack:
       Type: AWS::CloudFormation::Stack
       DeletionPolicy: Retain
       Properties:
         TemplateURL: >-
           https://s3.amazonaws.com/cloudformation-templates-us-east-2/EC2ChooseAMI.template
         Parameters:
           InstanceType: t1.micro
           KeyName: mykey
   ```

1. CloudFormation コンソールを開きます。

1. [**スタック**] ページで、親スタックを選択した状態で [**Stack actions (スタックアクション)**] を選択し、[**Import resources into stack (リソースをスタックにインポートする)**] を選択します。  
![\[コンソールの [Import resources into stack (リソースをスタックにインポートする)] オプション。\]](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/images/stack-actions-import.png)

1. [**Import overview (インポートの概要)**] ページを参照して、このオペレーション中に指定する必要がある項目の一覧を確認してください。その後、**[Next]** を選択します。

1. [**Specify template (テンプレートを指定)**] ページで、以下のいずれかの方法を使用して更新した親テンプレートを指定し、[**次へ**] を選択します。
   + [**Amazon S3 URL**] を選択し、テキストボックスでテンプレートの URL を指定します。
   + [**Upload a template file (テンプレートファイルのアップロード)**] を選択し、テンプレートを参照します。

1. [**Identify resources (リソースの識別)**] ページで、`AWS::CloudFormation::Stack` リソースを識別します。

   1. [**Identifier property (識別子のプロパティ)**] で、リソース識別子のタイプを選択します。例えば、`AWS::CloudFormation::Stack` リソースは `StackId` プロパティを使用して識別できます。

   1. **[識別子の値]** で、インポートするスタックの ARN を入力します。例えば、`arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10`。  
![\[コンソールの [Identify resources (リソースの識別)] ページ。\]](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/images/resource-import-stackid.png)

   1. [**次へ**] を選択します。

1. [**Specify stack details (スタック詳細の指定)**] ページで、任意のパラメータを変更し、[**次へ**] を選択します。これにより、変更セットが自動的に作成されます。
**重要**  
作成、更新、または削除オペレーションを開始する既存のパラメータを変更すると、インポートオペレーションは失敗します。

1. **[*MyParentStack* を確認]** ページで、インポートしようとしているリソースが正しいことを確認し、**[リソースをインポート]** を選択します。これにより、最後のステップで作成した変更セットが自動的に実行されます。この時点で、インポートされたリソースにはスタックレベルのタグが適用されます。

1. 親スタックの **[Stack details]** (スタックの詳細) ページの **[Events]** (イベント) ペインが表示されます。  
![\[コンソールの [イベント] タブ。\]](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/images/import-events.png)
**注記**  
`AWS::CloudFormation::Stack` リソースはすでに CloudFormation によって管理されていたため、このインポートオペレーションの後、親スタックでドリフト検出を実行する必要はありません。

## AWS CLI を使用した既存のスタックのネスト化
<a name="resource-import-nested-stacks-cli"></a>

1. `Retain` [DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html) を使用して、`AWS::CloudFormation::Stack` リソースを親スタックテンプレートに追加します。次の親テンプレート例では、`MyNestedStack` がインポートのターゲットです。

   **JSON**

   ```
   {
     "AWSTemplateFormatVersion" : "2010-09-09",
     "Resources" : {
       "ServiceTable":{
              "Type":"AWS::DynamoDB::Table",
              "Properties":{
                 "TableName":"Service",
                 "AttributeDefinitions":[
                    {
                       "AttributeName":"key",
                       "AttributeType":"S"
                    }
                 ],
                 "KeySchema":[
                    {
                       "AttributeName":"key",
                       "KeyType":"HASH"
                    }
                 ],
                 "ProvisionedThroughput":{
                    "ReadCapacityUnits":5,
                    "WriteCapacityUnits":1
                 }
              }
           },
       "MyNestedStack" : {
         "Type" : "AWS::CloudFormation::Stack",
         "DeletionPolicy": "Retain",
         "Properties" : {
         "TemplateURL" : "https://s3.amazonaws.com/cloudformation-templates-us-east-2/EC2ChooseAMI.template",
           "Parameters" : {
             "InstanceType" : "t1.micro",
             "KeyName" : "mykey"
           }
         }
       }
     }
   }
   ```

   **YAML**

   ```
   AWSTemplateFormatVersion: 2010-09-09
   Resources:
     ServiceTable:
       Type: AWS::DynamoDB::Table
       Properties:
         TableName: Service
         AttributeDefinitions:
           - AttributeName: key
             AttributeType: S
         KeySchema:
           - AttributeName: key
             KeyType: HASH
         ProvisionedThroughput:
           ReadCapacityUnits: 5
           WriteCapacityUnits: 1
     MyNestedStack:
       Type: AWS::CloudFormation::Stack
       DeletionPolicy: Retain
       Properties:
         TemplateURL: >-
           https://s3.amazonaws.com/cloudformation-templates-us-east-2/EC2ChooseAMI.template
         Parameters:
           InstanceType: t1.micro
           KeyName: mykey
   ```

1. 次の例に示すように、次の変更を加えて JSON 文字列を作成します。
   + *MyNestedStack* を、テンプレートで指定されているターゲットリソースの論理 ID に置き換えます。
   + *arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10* を、インポートするスタックの ARN に置き換えます。

   ```
   [{"ResourceType":"AWS::CloudFormation::Stack","LogicalResourceId":"MyNestedStack","ResourceIdentifier":{"StackId":"arn:aws:cloudformation:us-east-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10"}}]
   ```

   または、設定ファイルでパラメータを指定することもできます。

   例えば、`MyNestedStack` をインポートするには、次の設定を含む *ResourcesToImport.txt* ファイルを作成することが考えられます。

   **JSON**

   ```
   [
     {
         "ResourceType":"AWS::CloudFormation::Stack",
         "LogicalResourceId":"MyNestedStack",
         "ResourceIdentifier": {
           "StackId":"arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10"
         }
     }
   ]
   ```

   **YAML**

   ```
   ResourceType: AWS::CloudFormation::Stack
     LogicalResourceId: MyNestedStack
     ResourceIdentifier:
       StackId: >-
         arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10
   ```

1. 変更セットを作成するには、次の **create-change-set** コマンドを使用してプレースホルダーテキストを置き換えます。`--change-set-type` オプションの場合、**IMPORT** の値を指定します。`--resources-to-import` オプションでは、サンプルの JSON 文字列を、作成した実際の JSON 文字列に置き換えます。

   ```
   aws cloudformation create-change-set \
       --stack-name MyParentStack --change-set-name ImportChangeSet \
       --change-set-type IMPORT \
       --template-body file://TemplateToImport.json \
       --resources-to-import '[{"ResourceType":"AWS::CloudFormation::Stack","LogicalResourceId":"MyNestedStack","ResourceIdentifier":{"StackId":"arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10"}}]'
   ```
**注記**  
`--resources-to-import` はインライン YAML をサポートしていません。JSON 文字列で引用符をエスケープするための要件は、ターミナルに応じて異なります。詳細については、「*AWS Command Line Interface ユーザーガイド*」の「[Using quotation marks inside strings](https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-parameters-quoting-strings.html#cli-usage-parameters-quoting-strings-containing)」を参照してください。

   または、次の例に示すように、ファイル URL を `--resources-to-import`オプションの入力として使用できます。

   ```
   --resources-to-import file://ResourcesToImport.txt
   ```

   正常に完了した場合、このコマンドは次のサンプル出力を返します。

   ```
   {
       "Id": "arn:aws:cloudformation:us-west-2:12345678910:changeSet/ImportChangeSet/8ad75b3f-665f-46f6-a200-0b4727a9442e",
       "StackId": "arn:aws:cloudformation:us-west-2:12345678910:stack/MyParentStack/4e345b70-1281-11ef-b027-027366d8e82b"
   }
   ```

1. 変更セットを確認し、正しいスタックがインポートされることを確認します。

   ```
   aws cloudformation describe-change-set --change-set-name ImportChangeSet
   ```

1. 変更セットを開始し、スタックをソースの親スタックにインポートするには、次の **execute-change-set** コマンドを使用してプレースホルダーテキストを置き換えます。この時点で、インポートされたリソースには[スタックレベルのタグ](cfn-console-create-stack.md#configure-stack-options)が適用されます。インポートオペレーション `(IMPORT_COMPLETE)` が正常に完了すると、スタックは正常にネストされています。

   ```
   aws cloudformation execute-change-set --change-set-name ImportChangeSet
   ```
**注記**  
`AWS::CloudFormation::Stack` リソースはすでに CloudFormation によって管理されているため、このインポートオペレーションの後、親スタックでドリフト検出を実行する必要はありません。