

# スタックへの既存リソースのインポート
<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)」を参照してください。