

# AWS リソースを CloudFormation スタックにインポートする
<a name="import-resources"></a>

既存のリソースを CloudFormation スタックにインポートすることができます。この機能は、CloudFormation を使って CloudFormation 以外の場所で作成されたリソースを管理するときに有用です。この場合、リソースを削除したり再度作成したりする必要はありません。

CloudFormation には、既存のリソースをスタックにインポートする方法が 2 つ用意されています。
+ [IaC ジェネレーター](generate-IaC.md)は、既存のリソースを自動的にスキャンし、リソースの現在の状態に基づいて CloudFormation テンプレートを生成するツールです。作成されたテンプレートは、スタックにこれらのリソースをインポートするために使用できます。
+ [リソースインポート](import-resources-manually.md)は、CloudFormation テンプレートに既存のリソースを記述してから、それらをスタックにインポートする手動プロセスです。このアプローチでは、テンプレートにリソースのプロパティと設定を手動で指定する必要があります。
+ [自動インポート](import-resources-automatically.md)は、CloudFormation テンプレート内の既存のリソースを記述する自動プロセスで、CloudFormation は、一致するカスタム名を持つリソースをスタックにインポートします。
+ [スタックリファクタリング](stack-refactoring.md) は、既存のリソースプロパティおよびデータを保持しながら、CloudFormation スタックのリソースの再編成を簡素化する機能です。スタックリファクタリングを使用すると、スタック間でリソースを移動したり、モノリシックスタックを小さなコンポーネントに分割したり、複数のスタックを 1 つに統合したりできます。

リソースインポート機能は、既存のリソースを CloudFormation 管理の対象にすることに加えて、以下のシナリオでも役に立ちます。
+ **スタック間でのリソースの移動** – 1 つのスタックから別のスタックにリソースをインポートできるため、必要に応じてインフラストラクチャを再編成することが可能になります。
+ **既存のスタックのネスト化** – 別のスタック内にネストされたスタックとして既存のスタックをインポートすることで、モジュール形式の再利用可能なインフラストラクチャ設計を実現します。

CloudFormation は幅広いリソースのインポートをサポートしています。詳細については、「[リソースタイプのサポート](resource-import-supported-resources.md)」を参照してください。

**Topics**
+ [AWS リソースを手動でインポートする](import-resources-manually.md)
+ [AWS リソースを自動でインポートする](import-resources-automatically.md)
+ [インポートオペレーションを元に戻す](resource-import-revert.md)

# AWS リソースを CloudFormation スタックに手動でインポートする
<a name="import-resources-manually"></a>

リソースインポート機能を使用すると、既存の AWS リソースを新規または既存の CloudFormation スタックにインポートすることができます。インポートオペレーション中に、既存のリソースをスタックにインポートするか、既存のリソースから新しいスタックを作成する変更セットを作成します。インポート時に以下を指定します。
+ 元のスタックリソースとインポートするリソースの両方を含む、スタック全体を記述するテンプレート。インポートする各リソースには、[DeletionPolicy 属性](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html)が必要です。
+ CloudFormation がテンプレート内の論理 ID を既存のリソースにマッピングするために使用できる、インポートするリソースの識別子。

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

**Topics**
+ [リソース識別子](#resource-import-identifiers-unique-ids)
+ [検証](#resource-import-validation)
+ [ステータスコード](#resource-import-status-codes)
+ [考慮事項](#resource-import-considerations)
+ [その他のリソース](#resource-import-additional-resources)
+ [既存のリソースからのスタックの作成](resource-import-new-stack.md)
+ [スタックへの既存リソースのインポート](resource-import-existing-stack.md)
+ [スタック間でのリソースの移動](refactor-stacks.md)
+ [既存のスタックのネスト化](resource-import-nested-stacks.md)

## リソース識別子
<a name="resource-import-identifiers-unique-ids"></a>

インポートする各リソースを識別するために 2 つの値を指定します。
+ 識別子のプロパティ。これは、各リソースタイプを識別するために使用できるリソースプロパティです。たとえば、`AWS::S3::Bucket` リソースは、その `BucketName` を使用して識別できます。

  インポートするリソースを識別するために使用するリソースプロパティは、リソースタイプによって異なります。リソースプロパティは CloudFormation コンソールで確認できます。インポートするリソースを含むテンプレートを作成したら、インポートプロセスを開始できます。このプロセスでは、インポートするリソースの識別子プロパティを見つけることができます。一部のリソースタイプでは、識別方法が複数ある場合があり、ドロップダウンリストで使用するプロパティを選択できます。

  あるいは、[get-template-summary](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/get-template-summary.html) CLI コマンドを呼び出して、`--template-url` オプションの値としてスタックテンプレートの S3 URL を指定することにより、インポートするリソースの識別子プロパティを取得することもできます。
+ 識別子の値。これは、リソースの実際のプロパティ値です。たとえば、`BucketName` プロパティの実際の値は `MyS3Bucket` です。

  リソースのサービスコンソールから識別子プロパティの値を取得できます。

## リソースのインポートの検証
<a name="resource-import-validation"></a>

インポートオペレーション中に、CloudFormation は次の検証を実行します。
+ インポートするリソースが存在します。
+ インポートする各リソースのプロパティと構成値は、リソースタイプスキーマに準拠します。リソースタイプスキーマでは、受け入れられるプロパティ、必須プロパティ、およびサポートされるプロパティ値が定義されます。
+ 必要なプロパティはテンプレートで指定されています。各リソースタイプに必要なプロパティについては、「[AWS リソースおよびプロパティタイプのリファレンス](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-template-resource-type-ref.html)」を参照してください。
+ インポートするリソースは、同じリージョン内の別のスタックに属していません。

CloudFormation は、テンプレート構成がリソースプロパティの実際の構成と一致しているかどうかをチェックしません。

**重要**  
予期しない変更を避けるために、テンプレートで定義されているリソースとそのプロパティが、意図したリソースインポートの構成と一致していることを確認します。

## リソースのインポートのステータスコード
<a name="resource-import-status-codes"></a>

この表は、リソースインポート機能で使用されるさまざまなステータスタイプを説明しています。


| インポートオペレーションステータス | 説明 | 
| --- | --- | 
|  `IMPORT_IN_PROGRESS`  |  インポートオペレーションは進行中です。  | 
|  `IMPORT_COMPLETE`  |  スタック内のすべてのリソースについて、インポートオペレーションが完了しました。  | 
|  `IMPORT_ROLLBACK_IN_PROGRESS`  |  ロールバックインポートオペレーションは、以前のテンプレート構成をロールバックしています。  | 
|  `IMPORT_ROLLBACK_FAILED`  |  インポートのロールバックオペレーションが失敗しました。  | 
|  `IMPORT_ROLLBACK_COMPLETE`  |  インポートは、以前のテンプレート構成にロールバックされました。  | 

## インポートオペレーション中の考慮事項
<a name="resource-import-considerations"></a>
+ インポートが完了した後、後続のスタックオペレーションを実行する前に、インポートされたリソースでドリフト検出を実行することをお勧めします。ドリフト検出により、テンプレート構成が実際の構成と一致することが保証されます。詳細については、「[CloudFormation スタック全体のドリフトを検出する](detect-drift-stack.md)」を参照してください。
+ インポートオペレーションでは、新しいリソース作成、リソースの削除、プロパティ構成の変更は許可されません。
+ インポートオペレーションを成功させるには、インポートする各リソースに `DeletionPolicy` 属性が必要です。`DeletionPolicy` は任意の使用できる値に設定できます。インポートするリソースのみに `DeletionPolicy` が必要です。スタックにすでに含まれているリソースは、`DeletionPolicy` を必要としません。
+ 同じリソースを複数のスタックにインポートすることはできません。
+ `cloudformation:ImportResourceTypes` IAM ポリシー条件を使用して、インポートオペレーション中にユーザーが操作できるリソースタイプを制御できます。詳細については、「[CloudFormation のポリシー条件キー](control-access-with-iam.md#using-iam-conditions)」を参照してください。
+ CloudFormation スタックの制限は、リソースのインポート時に適用されます。制限の詳細については、「[CloudFormation クォータを理解する](cloudformation-limits.md)」を参照してください。

## その他のリソース
<a name="resource-import-additional-resources"></a>

リソースインポートでのスタックドリフトを解決するには、「[インポートオペレーションでドリフトを解決する](resource-import-resolve-drift.md)」を参照してください。

# 既存のリソースからのスタックの作成
<a name="resource-import-new-stack"></a>

このトピックでは、テンプレートに既存の AWS リソースを記述することで、それらからスタックを作成する方法を説明します。その代わりに、既存のリソースをスキャンして、既存のリソースを CloudFormation にインポートしたり、新しいアカウントでリソースを複製したりするために使用できるテンプレートを自動的に生成するには、「[IaC ジェネレーターを使用して既存のリソースからテンプレートを生成する](generate-IaC.md)」を参照してください。

**前提条件**

始めるには以下のものが必要です。
+ 新しいスタックに含めるすべてのリソースを記述するテンプレート。テンプレートをローカルに保存、または Amazon S3 バケットに保存します。
+ インポートするリソースごとに、以下を含めてください。
  + リソースの現在の設定を定義するプロパティとプロパティ値。
  + リソースの固有識別子 (リソース名など)。詳細については、「[リソース識別子](import-resources-manually.md#resource-import-identifiers-unique-ids)」を参照してください。
  + [DeletionPolicy 属性](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html)。

**Topics**
+ [サンプルテンプレート](#resource-import-new-stack-example-template)
+ [AWS マネジメントコンソール を使用した既存のリソースからのスタックの作成](#resource-import-new-stack-console)
+ [AWS CLI を使用した既存のリソースからのスタックの作成](#resource-import-new-stack-cli)

## サンプルテンプレート
<a name="resource-import-new-stack-example-template"></a>

このチュートリアルでは、CloudFormation 外で作成された 2 つの DynamoDB テーブルを指定する、`TemplateToImport.json` という名前の以下のサンプルテンプレートを使用していることを前提としています。`ServiceTable` と `GamesTable` がインポートの対象です。

**注記**  
これは、テンプレートの一例にすぎません。独自のテスト目的のために使用するには、サンプルリソースをお使いのアカウントのリソースに置き換えてください。

```
{
    "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
                }
            }
        }
    }
}
```

## AWS マネジメントコンソール を使用した既存のリソースからのスタックの作成
<a name="resource-import-new-stack-console"></a>

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

1. [**スタック**] ページで、[**スタックを作成**] を選択し、[**With existing resources (import resources) (既存のリソースを使用（リソースのインポート）)**] を選択します。  
![\[コンソールの [既存のリソースからのスタックの作成] オプション。\]](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/images/create-stack-with-existing-resources.png)

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

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

1. [**Identify resources (リソースの識別)**] ページで、各ターゲットリソースを識別します。詳細については、「[リソース識別子](import-resources-manually.md#resource-import-identifiers-unique-ids)」を参照してください。

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

   1. [**Identifier value (識別子の値)**] に、実際のプロパティ値を入力します。たとえば、サンプルテンプレートの `GamesTable` リソースの `TableName` は `Games` です。

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

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

1. [**Review *stack\$1name* (stack\$1name の確認)**] ページで、インポートしようとしているリソースが正しいことを確認し、[**Import resources (リソースのインポート)**] を選択します。これにより、最後のステップで作成した変更セットが自動的に実行されます。

   新しいスタックの **[Stack details]** (スタックの詳細) ページの **[Events]** (イベント) ペインが表示されます。  
![\[コンソールの [イベント] タブ。\]](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/images/import-events.png)

1. （オプション） スタックでドリフト検出を実行し、インポートされたリソースのテンプレートと実際の構成が一致していることを確認します。ドリフト検出の詳細については、「[CloudFormation スタック全体のドリフトを検出する](detect-drift-stack.md)」を参照してください。

1. （オプション）インポートしたリソースが予想されるテンプレート構成と一致しない場合は、テンプレート構成を修正するか、リソースを直接更新します。このチュートリアルでは、テンプレートの構成を実際の構成に合わせて修正します。

   1. 影響を受けるリソースの[インポートオペレーションを元に戻します](resource-import-revert.md#resource-import-revert-console)。

   1. インポートターゲットをテンプレートに再度追加して、テンプレートの構成が実際の構成と一致していることを確認します。

   1. 変更したテンプレートを使用してステップ 2～8 を繰り返し、リソースを再度インポートします。

## AWS CLI を使用した既存のリソースからのスタックの作成
<a name="resource-import-new-stack-cli"></a>

1. テンプレート内の各リソースタイプを識別するプロパティを知るには、テンプレートの S3 URL を指定して **get-template-summary** コマンドを実行します。たとえば、`AWS::DynamoDB::Table` リソースは `TableName` プロパティを使用して識別できます。サンプルテンプレートの `GamesTable` リソースの場合、`TableName` の値は `Games` です。この情報は、次のステップで必要になります。

   ```
   aws cloudformation get-template-summary \
       --template-url https://amzn-s3-demo-bucket.s3.us-west-2.amazonaws.com/TemplateToImport.json
   ```

   詳細については、「[リソース識別子](import-resources-manually.md#resource-import-identifiers-unique-ids)」を参照してください。

1. テンプレートから実際のリソースとそれらの一意の識別子のリストを次の JSON 文字列形式で作成します。

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

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

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

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

1. 変更セットを作成するには、次の **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://amzn-s3-demo-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 文字列で引用符をエスケープするための要件は、ターミナルに応じて異なります。詳細については、「*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
   ```

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

   ```
   aws cloudformation describe-change-set \
       --change-set-name ImportChangeSet --stack-name TargetStack
   ```

1. 変更セットを開始してリソースをインポートするには、次の **execute-change-set** コマンドを使用してプレースホルダーテキストを置き換えます。オペレーション `(IMPORT_COMPLETE)` が正常に完了すると、リソースは正常にインポートされています。

   ```
   aws cloudformation execute-change-set \
       --change-set-name ImportChangeSet --stack-name TargetStack
   ```

1. （オプション）`IMPORT_COMPLETE` スタックでドリフト検出を実行し、インポートされたリソースのテンプレートと実際の構成が一致していることを確認します。ドリフト検出に関する詳細は、「[個々のスタックリソースのドリフトを検出](detect-drift-resource.md)」を参照してください。

   1. 指定されたスタックでドリフト検出を実行します。

      ```
      aws cloudformation detect-stack-drift --stack-name TargetStack
      ```

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

      ```
      { "Stack-Drift-Detection-Id" : "624af370-311a-11e8-b6b7-500cexample" }
      ```

   1. 指定されたスタックドリフト検出 ID のドリフト検出オペレーションの進行状況を表示します。

      ```
      aws cloudformation describe-stack-drift-detection-status \
          --stack-drift-detection-id 624af370-311a-11e8-b6b7-500cexample
      ```

   1. 指定されたスタック内でドリフトが確認されたリソースのドリフト情報を表示します。

      ```
      aws cloudformation describe-stack-resource-drifts --stack-name TargetStack
      ```

1. （オプション）インポートしたリソースが予想されるテンプレート構成と一致しない場合は、テンプレート構成を修正するか、リソースを直接更新します。このチュートリアルでは、テンプレートの構成を実際の構成に合わせて修正します。

   1. 影響を受けるリソースの[インポートオペレーションを元に戻します](resource-import-revert.md#resource-import-revert-cli)。

   1. インポートターゲットをテンプレートに再度追加して、テンプレートの構成が実際の構成と一致していることを確認します。

   1. 変更したテンプレートを使用してステップ 3～6 を繰り返し、リソースを再度インポートします。

# スタックへの既存リソースのインポート
<a name="resource-import-existing-stack"></a>

このトピックでは、テンプレートに既存の AWS リソースを記述することで、それらを既存のスタックにインポートする方法を説明します。その代わりに、既存のリソースをスキャンして、既存のリソースを CloudFormation にインポートしたり、新しいアカウントでリソースを複製したりするために使用できるテンプレートを自動的に生成するには、「[IaC ジェネレーターを使用して既存のリソースからテンプレートを生成する](generate-IaC.md)」を参照してください。

**前提条件**

始めるには以下のものが必要です。
+ スタックにすでに含まれているリソースとインポートするリソースの両方を含む、スタック全体を記述するテンプレート。テンプレートをローカルに保存、または Amazon S3 バケットに保存します。

  **実行中スタックのテンプレートのコピーを取得する**

  1. クラウドフォーメーション コンソール の[https://console.aws.amazon.com/cloudformation/](https://console.aws.amazon.com/cloudformation/) 開きます：

  1. スタックのリストから、テンプレートの取得元となるスタックを選択します。

  1. [スタックの詳細] ペインで **[テンプレート]** タブを選択してから、**[クリップボードにコピー]** を選択します。

  1. コードをテキストエディタに貼り付けて、テンプレートへのその他リソースの追加を開始します。
+ インポートするリソースごとに、以下を含めてください。
  + リソースの現在の設定を定義するプロパティとプロパティ値。
  + リソースの固有識別子 (リソース名など)。詳細については、「[リソース識別子](import-resources-manually.md#resource-import-identifiers-unique-ids)」を参照してください。
  + [DeletionPolicy 属性](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html)。

**Topics**
+ [サンプルテンプレート](#resource-import-existing-stack-example-template)
+ [AWS マネジメントコンソール を使用した既存のリソースのスタックへのインポート](#resource-import-existing-stack-console)
+ [AWS CLI を使用した既存のリソースのスタックへのインポート](#resource-import-existing-stack-cli)

## サンプルテンプレート
<a name="resource-import-existing-stack-example-template"></a>

このチュートリアルでは、2 つの DynamoDB テーブルを指定する、`TemplateToImport.json` という名前の以下のサンプルテンプレートを使用していることを前提としています。`ServiceTable` は現在スタックに含まれているテーブルで、`GamesTable` はインポートするテーブルです。

**注記**  
これは、テンプレートの一例にすぎません。独自のテスト目的のために使用するには、サンプルリソースをお使いのアカウントのリソースに置き換えてください。

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

## AWS マネジメントコンソール を使用した既存のリソースのスタックへのインポート
<a name="resource-import-existing-stack-console"></a>

**注記**  
CloudFormation コンソールは、リソースをインポートする場合に、組み込み関数である `Fn::Transform` の使用をサポートしません。AWS CLI を使用して関数 `Fn::Transform` を使用するリソースをインポートできます。

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

1. [**スタック**] ページで、リソースのインポート先のスタックを選択します。

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. [**インポートの概要**] ページを確認し、[**次へ**] を選択します。

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

1. [**Identify resources (リソースの識別)**] ページで、各ターゲットリソースを識別します。詳細については、「[リソース識別子](import-resources-manually.md#resource-import-identifiers-unique-ids)」を参照してください。

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

   1. [**Identifier value (識別子の値)**] に、実際のプロパティ値を入力します。たとえば、サンプルテンプレートの `GamesTable` リソースの `TableName` は `Games` です。

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

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

1. [**Review *stack-name* (スタック名の確認)**] ページで、インポートするリソースを確認し、[**Import resources (リソースのインポート)**] を選択します。これにより、最後のステップで作成した変更セットが自動的に実行されます。この時点で、インポートされたリソースにはスタックレベルのタグが適用されます。詳細については、「[スタックオプションを設定する](cfn-console-create-stack.md#configure-stack-options)」を参照してください。

   スタックの [**イベント**] ページが表示されます。  
![\[コンソールの [イベント] タブ。\]](http://docs.aws.amazon.com/ja_jp/AWSCloudFormation/latest/UserGuide/images/import-events.png)

1. （オプション） スタックでドリフト検出を実行し、インポートされたリソースのテンプレートと実際の構成が一致していることを確認します。ドリフト検出の詳細については、「[CloudFormation スタック全体のドリフトを検出する](detect-drift-stack.md)」を参照してください。

1. （オプション）インポートしたリソースが予想されるテンプレート構成と一致しない場合は、テンプレート構成を修正するか、リソースを直接更新します。ドリフトしたリソースのインポートに関する詳細は、「[インポートオペレーションでドリフトを解決する](resource-import-resolve-drift.md)」を参照してください。

## AWS CLI を使用した既存のリソースのスタックへのインポート
<a name="resource-import-existing-stack-cli"></a>

1. テンプレート内の各リソースタイプを識別するプロパティを知るには、テンプレートの S3 URL を指定して **get-template-summary** コマンドを実行します。たとえば、`AWS::DynamoDB::Table` リソースは `TableName` プロパティを使用して識別できます。サンプルテンプレートの `GamesTable` リソースの場合、`TableName` の値は `Games` です。この情報は、次のステップで必要になります。

   ```
   aws cloudformation get-template-summary \
       --template-url https://amzn-s3-demo-bucket.s3.us-west-2.amazonaws.com/TemplateToImport.json
   ```

   詳細については、「[リソース識別子](import-resources-manually.md#resource-import-identifiers-unique-ids)」を参照してください。

1. インポートする実際のリソースとその一意の識別子のリストを次の JSON 文字列形式で作成します。

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

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

   例えば、`GamesTable` をインポートするには、次の設定を含む *ResourcesToImport.txt* ファイルを作成します。

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

1. 変更セットを作成するには、次の **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://amzn-s3-demo-bucket.s3.us-west-2.amazonaws.com/TemplateToImport.json \
       --resources-to-import '[{"ResourceType":"AWS::DynamoDB::Table","LogicalResourceId":"GamesTable","ResourceIdentifier":{"TableName":"Games"}}]'
   ```
**注記**  
`--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
   ```

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

   ```
   aws cloudformation describe-change-set \
       --change-set-name ImportChangeSet --stack-name TargetStack
   ```

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

   ```
   aws cloudformation execute-change-set \
       --change-set-name ImportChangeSet --stack-name TargetStack
   ```

1. （オプション）`IMPORT_COMPLETE` スタックでドリフト検出を実行し、インポートされたリソースのテンプレートと実際の構成が一致していることを確認します。ドリフト検出の詳細については、「[CloudFormation スタック全体のドリフトを検出する](detect-drift-stack.md)」を参照してください。

   1. 指定されたスタックでドリフト検出を実行します。

      ```
      aws cloudformation detect-stack-drift --stack-name TargetStack
      ```

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

      ```
      { "Stack-Drift-Detection-Id" : "624af370-311a-11e8-b6b7-500cexample" }
      ```

   1. 指定されたスタックドリフト検出 ID のドリフト検出オペレーションの進行状況を表示します。

      ```
      aws cloudformation describe-stack-drift-detection-status \
          --stack-drift-detection-id 624af370-311a-11e8-b6b7-500cexample
      ```

   1. 指定されたスタック内でドリフトが確認されたリソースのドリフト情報を表示します。

      ```
      aws cloudformation describe-stack-resource-drifts --stack-name TargetStack
      ```

1. （オプション）インポートしたリソースが予想されるテンプレート構成と一致しない場合は、テンプレート構成を修正するか、リソースを直接更新します。ドリフトしたリソースのインポートに関する詳細は、「[インポートオペレーションでドリフトを解決する](resource-import-resolve-drift.md)」を参照してください。

# スタック間でのリソースの移動
<a name="refactor-stacks"></a>

`resource import` 機能を使用すると、スタック間でリソースを移動、または*リファクタリング*できます。まず、移動するリソースに `Retain` 削除ポリシーを追加して、ソーススタックからリソースを削除してターゲットスタックにインポートするときにリソースが保持されるようにする必要があります。

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

**重要**  
すべてのリソースがインポートオペレーションをサポートしているわけではありません。スタックからリソースを削除する前に、「[インポートオペレーションをサポートするリソース](resource-import-supported-resources.md)」を参照してください。インポートオペレーションをサポートしていないリソースをスタックから削除する場合、そのリソースを別のスタックにインポートしたり、ソーススタックに戻したりすることはできません。

## AWS マネジメントコンソール を使用したスタックのリファクタリング
<a name="refactor-stacks-console"></a>

1. 移動元テンプレートで、移動するリソースに `Retain` [DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html) を指定します。

   次のサンプルソーステンプレートでは、`Games` がこのリファクタリングの対象です。  
**Example JSON**  

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

1. CloudFormation コンソールを開き、スタック更新を実行して削除ポリシーを適用します。

   1. [**スタック**] ページで、スタックを選択した状態で [**更新**] を選択します。

   1. [**テンプレートを準備**] で、[**現在のテンプレートを置換**] を選択します。

   1. [**Specify template (テンプレートを指定)**] の下にある `GamesTable` で、`DeletionPolicy` 属性により更新されたソーステンプレートを指定し、[**次へ**] を選択します。
      + [**Amazon S3 URL**] を選択し、テキストボックスで更新されたソーステンプレートの URL を指定します。
      + [**Upload a template file (テンプレートファイルのアップロード)**] を選択し、更新されたソーステンプレートファイルを参照します。

   1. [**Specify stack details (スタック詳細の指定)**] ページでは、変更の必要はありません。[**次へ**] を選択します。

   1. [**スタックオプションの設定**] ページでは、変更の必要はありません。[**次へ**] を選択します。

   1. **[*SourceStackName* を確認]** ページで、変更内容を確認します。テンプレートに IAM リソースが含まれる場合は、[**I acknowledge that this template may create IAM resources (このテンプレートが IAM リソースを作成する可能性を認識しています)**] を選択して、テンプレート内の IAM リソースを使用することを指定します。テンプレート内の IAM リソースの使用の詳細については、「[AWS Identity and Access Management で CloudFormation アクセスを制御する](control-access-with-iam.md)」を参照してください。次に、変更セットを作成してソーススタックを更新するか、ソーススタックを直接更新します。

1. ソーステンプレートからリソース、関連パラメータ、および出力を削除し、それらをターゲットテンプレートに追加します。

   ソーステンプレートは次のようになります。  
**Example JSON**  

   ```
   {
       "AWSTemplateFormatVersion": "2010-09-09",
       "Description": "Import test",
       "Resources": {
           "ServiceTable":{
              "Type":"AWS::DynamoDB::Table",
              "Properties":{
                 "TableName":"Service",
                 "AttributeDefinitions":[
                    {
                       "AttributeName":"key",
                       "AttributeType":"S"
                    }
                 ],
                 "KeySchema":[
                    {
                       "AttributeName":"key",
                       "KeyType":"HASH"
                    }
                 ],
                 "ProvisionedThroughput":{
                    "ReadCapacityUnits":5,
                    "WriteCapacityUnits":1
                 }
              }
           }
       }
   }
   ```

   次のターゲットテンプレートの例には、現在 `PlayersTable` リソースがあり、さらに `GamesTable` も含まれています。  
**Example JSON**  

   ```
   {
       "AWSTemplateFormatVersion": "2010-09-09",
       "Description": "Import test",
       "Resources": {
           "PlayersTable": {
               "Type": "AWS::DynamoDB::Table",
               "Properties": {
                   "TableName": "Players",
                   "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
                   }
               }
           }
       }
   }
   ```

1. ステップ 2～3 を繰り返してソーススタックを再度更新します。今回は、スタックからターゲットリソースを削除します。

1. インポートオペレーションを実行して、`GamesTable` をターゲットスタックに追加します。

   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 (インポートの概要)**] ページを参照して、このオペレーション中に指定する必要がある項目の一覧を確認してください。**[次へ]** を選択します。

   1. **[Specify template]** (テンプレートを指定) ページで、以下のいずれかの操作を実行し、**[Next]** (次へ) を選択します。
      + [**Amazon S3 URL**] を選択し、テキストボックスで URL を指定します。
      + [**Upload a template file (テンプレートファイルのアップロード)**] を選択し、アップロードするファイルを参照します。

   1. [**Identify resources (リソースの識別)**] ページで、移動するリソース（この例では `GamesTable`）を特定します。詳細については、「[リソース識別子](import-resources-manually.md#resource-import-identifiers-unique-ids)」を参照してください。

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

      1. [**Identifier value (識別子の値)**] に、実際のプロパティ値を入力します。例えば、`GamesTables`。

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

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

   1. **[*TargetStackName* を確認]** ページで、インポートしようとしているリソースが正しいことを確認し、**[リソースをインポート]** を選択します。これにより、最後のステップで作成した変更セットが自動的に開始されます。この時点で、インポートされたリソースには[スタックレベルのタグ](cfn-console-create-stack.md#configure-stack-options)が適用されます。

   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="refactor-stacks-cli"></a>

1. 移動元テンプレートで、移動するリソースに `Retain` [DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html) を指定します。

   次のサンプルソーステンプレートでは、`GamesTable` がこのリファクタリングの対象です。  
**Example JSON**  

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

1. ソーススタックを更新して、削除ポリシーをリソースに適用します。

   ```
   aws cloudformation update-stack --stack-name SourceStackName
   ```

1. ソーステンプレートからリソース、関連パラメータ、および出力を削除し、それらをターゲットテンプレートに追加します。

   ソーステンプレートは次のようになります。  
**Example JSON**  

   ```
   {
       "AWSTemplateFormatVersion": "2010-09-09",
       "Description": "Import test",
       "Resources": {
           "ServiceTable":{
              "Type":"AWS::DynamoDB::Table",
              "Properties":{
                 "TableName":"Service",
                 "AttributeDefinitions":[
                    {
                       "AttributeName":"key",
                       "AttributeType":"S"
                    }
                 ],
                 "KeySchema":[
                    {
                       "AttributeName":"key",
                       "KeyType":"HASH"
                    }
                 ],
                 "ProvisionedThroughput":{
                    "ReadCapacityUnits":5,
                    "WriteCapacityUnits":1
                 }
              }
           }
       }
   }
   ```

   次のターゲットテンプレートの例には、現在 `PlayersTable` リソースがあり、さらに `GamesTable` も含まれています。  
**Example JSON**  

   ```
   {
       "AWSTemplateFormatVersion": "2010-09-09",
       "Description": "Import test",
       "Resources": {
           "PlayersTable": {
               "Type": "AWS::DynamoDB::Table",
               "Properties": {
                   "TableName": "Players",
                   "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
                   }
               }
           }
       }
   }
   ```

1. ソーススタックを更新して、`GamesTable` リソースとそれに関連するパラメータと出力をスタックから削除します。

   ```
   aws cloudformation update-stack --stack-name SourceStackName
   ```

1. インポートする実際のリソースとその一意の識別子のリストを次の JSON 文字列形式で作成します。詳細については、「[リソース識別子](import-resources-manually.md#resource-import-identifiers-unique-ids)」を参照してください。

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

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

   例えば、`GamesTable` をインポートするには、次の設定を含む *ResourcesToImport.txt* ファイルを作成します。

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

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

   ```
   aws cloudformation create-change-set \
       --stack-name TargetStackName --change-set-name ImportChangeSet \
       --change-set-type IMPORT \
       --template-body file://TemplateToImport.json \
       --resources-to-import "'[{"ResourceType":"AWS::DynamoDB::Table","LogicalResourceId":"GamesTable","ResourceIdentifier":{"TableName":"Games"}}]'"
   ```
**注記**  
`--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)」を参照してください。

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

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

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

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

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

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

# 既存のスタックのネスト化
<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 によって管理されているため、このインポートオペレーションの後、親スタックでドリフト検出を実行する必要はありません。

# AWS リソースを CloudFormation スタックに自動でインポートする
<a name="import-resources-automatically"></a>

CloudFormation スタックを作成または更新するときに、*名前付きリソース*を自動的にインポートできるようになりました。*名前付きリソース*とはカスタム名を持つリソースのことです。詳細については、「*CloudFormation テンプレートリファレンス*」の「[Name タイプ](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-properties-name.html)」を参照してください。

自動インポートを開始すると、CloudFormation がテンプレートに一致する既存のリソースをチェックし、それらをデプロイ中にインポートします。ネストされたスタックの場合は、ルートスタックから変更セットを作成します。

インポートが完了した後、後続のスタックオペレーションを実行する前に、インポートされたリソースでドリフト検出を実行することをお勧めします。ドリフト検出により、テンプレート構成が実際の構成と一致することが保証されます。詳細については、「[CloudFormation スタック全体のドリフトを検出する](detect-drift-stack.md)」を参照してください。

リソースをインポートするときは、次の要件を満たす必要があります。
+ リソースに、テンプレートで定義した静的カスタム名が付いていること。動的な名前 (\$1Ref または他の 関数を使用) は現在サポートされていません。
+ リソースに `Retain` または `RetainExceptOnCreate` の `DeletionPolicy` があること。
+ リソースが 別の CloudFormation スタックに属していないこと。
+ リソースタイプが CloudFormation のインポートオペレーションをサポートしていること。詳細については、「[リソースタイプのサポート](resource-import-supported-resources.md)」を参照してください。
+ リソースタイプのプライマリ ID は テンプレートにある必要があります。読み取り専用プロパティを持つプライマリ ID はサポートされていません。タイプに対するプライマリ ID を確認するには、リソーススキーマで `primaryIdentifier` プロパティを探します。プロパティの詳細については、「[primaryIdentifier](https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/resource-type-schema.html#schema-properties-primaryidentifier)」を参照してください。

**Example 自動インポートの例**  
次の例では、変更セット `CreateChangeSet` を使用して、テンプレートファイル `template.yaml` に基づいて `my-stack` という名前のスタックを作成し、一致するリソースを自動的にインポートします。  

```
aws cloudformation create-change-set \
  --stack-name my-stack \
  --change-set-name CreateChangeSet \
  --change-set-type CREATE \
  --template-body file://template.yaml \
  --import-existing-resources
```

## トラブルシューティング
<a name="auto-import-troubleshooting"></a>

自動インポートが失敗した場合は、以下を実行してトラブルシューティングを行います。
+ テンプレートのリソース名がリソースの名前と正確に一致していることを確認する。
+ リソースがまだ別のスタックで管理されていないことを確認する。
+ リソースタイプがインポートオペレーションをサポートしていることを確認する。
+ リソースタイプに必要なすべてのプロパティがテンプレートに含まれていることを確認する。

# インポートオペレーションを元に戻す
<a name="resource-import-revert"></a>

インポートオペレーションを元に戻すには、テンプレートから削除するリソースの `Retain` 削除ポリシーを指定して、スタックから削除するときにそのリソースが保持されるようにします。

## AWS マネジメントコンソール を使用してインポートオペレーションを元に戻す
<a name="resource-import-revert-console"></a>

1. スタックから削除するリソースの `Retain` [DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html) を指定します。次のテンプレート例では、`GamesTable` はこの元に戻すオペレーションのターゲットです。  
**Example JSON**  

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

1. CloudFormation コンソールを開き、スタック更新を実行して削除ポリシーを適用します。

   1. [**スタック**] ページで、スタックを選択した状態で [**更新**] を選択し、[**Update stack (standard) (スタックを更新（標準）)**] を選択します。

   1. [**テンプレートを準備**] で、[**現在のテンプレートを置換**] を選択します。

   1. [**Specify template (テンプレートを指定)**] の下にある `GamesTable` で、`DeletionPolicy` 属性により更新されたソーステンプレートを指定し、[**次へ**] を選択します。
      + [**Amazon S3 URL**] を選択し、テキストボックスで更新されたソーステンプレートの URL を指定します。
      + [**Upload a template file (テンプレートファイルのアップロード)**] を選択し、更新されたソーステンプレートファイルを参照します。

   1. [**Specify stack details (スタック詳細の指定)**] ページでは、変更の必要はありません。[**次へ**] を選択します。

   1. [**スタックオプションの設定**] ページでは、変更の必要はありません。[**次へ**] を選択します。

   1. [*MyStack* を確認] ページで、変更内容を確認します。テンプレートに IAM リソースが含まれる場合は、[**I acknowledge that this template may create IAM resources (このテンプレートが IAM リソースを作成する可能性を認識しています)**] を選択して、テンプレート内の IAM リソースを使用することを指定します。詳細については、「[CloudFormation テンプレートでの IAM リソースの承認](control-access-with-iam.md#using-iam-capabilities)」を参照してください。次に、変更セットを作成してソーススタックを更新するか、ソーススタックを直接更新します。

1. スタックテンプレートからリソース、関連するパラメータ、および出力を削除します。この例では、テンプレートは次のようになります。  
**Example JSON**  

   ```
   {
       "AWSTemplateFormatVersion": "2010-09-09",
       "Description": "Import test",
       "Resources": {
           "ServiceTable":{
              "Type":"AWS::DynamoDB::Table",
              "Properties":{
                 "TableName":"Service",
                 "AttributeDefinitions":[
                    {
                       "AttributeName":"key",
                       "AttributeType":"S"
                    }
                 ],
                 "KeySchema":[
                    {
                       "AttributeName":"key",
                       "KeyType":"HASH"
                    }
                 ],
                 "ProvisionedThroughput":{
                    "ReadCapacityUnits":5,
                    "WriteCapacityUnits":1
                 }
              }
           }
       }
   }
   ```

1. ステップ 2 を繰り返して、リソース (`GamesTable`) とそれに関連するパラメータと出力をスタックから削除します。

## AWS CLI を使用してインポートオペレーションを元に戻す
<a name="resource-import-revert-cli"></a>

1. スタックから削除するリソースの `Retain` [DeletionPolicy](https://docs.aws.amazon.com/AWSCloudFormation/latest/TemplateReference/aws-attribute-deletionpolicy.html) を指定します。次のテンプレート例では、`GamesTable` はこの元に戻すオペレーションのターゲットです。  
**Example JSON**  

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

1. スタックを更新して、削除ポリシーをリソースに適用します。

   ```
   aws cloudformation update-stack --stack-name MyStack
   ```

1. スタックテンプレートからリソース、関連するパラメータ、および出力を削除します。この例では、テンプレートは次のようになります。  
**Example JSON**  

   ```
   {
       "AWSTemplateFormatVersion": "2010-09-09",
       "Description": "Import test",
       "Resources": {
           "ServiceTable":{
              "Type":"AWS::DynamoDB::Table",
              "Properties":{
                 "TableName":"Service",
                 "AttributeDefinitions":[
                    {
                       "AttributeName":"key",
                       "AttributeType":"S"
                    }
                 ],
                 "KeySchema":[
                    {
                       "AttributeName":"key",
                       "KeyType":"HASH"
                    }
                 ],
                 "ProvisionedThroughput":{
                    "ReadCapacityUnits":5,
                    "WriteCapacityUnits":1
                 }
              }
           }
       }
   }
   ```

1. スタックを更新して、リソース (`GamesTable`) とそれに関連するパラメータと出力をスタックから削除します。

   ```
   aws cloudformation update-stack --stack-name MyStack
   ```