

# 既存のリソースからのスタックの作成
<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 を繰り返し、リソースを再度インポートします。