既存のリソースからのスタックの作成
このトピックでは、テンプレートに既存の AWS リソースを記述することで、それらからスタックを作成する方法を説明します。その代わりに、既存のリソースをスキャンして、既存のリソースを CloudFormation にインポートしたり、新しいアカウントでリソースを複製したりするために使用できるテンプレートを自動的に生成するには、「IaC ジェネレーターを使用して既存のリソースからテンプレートを生成する」を参照してください。
前提条件
始めるには以下のものが必要です。
- 
    新しいスタックに含めるすべてのリソースを記述するテンプレート。テンプレートをローカルに保存、または Amazon S3 バケットに保存します。 
- 
    インポートするリソースごとに、以下を含めてください。 - 
      リソースの現在の設定を定義するプロパティとプロパティ値。 
- 
      リソースの固有識別子 (リソース名など)。詳細については、「リソース識別子」を参照してください。 
 
- 
      
サンプルテンプレート
このチュートリアルでは、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 Management Console を使用した既存のリソースからのスタックの作成
- AWS Management Console にサインインし、AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation - ) を開きます。 
- 
     [スタック] ページで、[スタックを作成] を選択し、[With existing resources (import resources) (既存のリソースを使用(リソースのインポート))] を選択します。 ![コンソールの [既存のリソースからのスタックの作成] オプション。](images/create-stack-with-existing-resources.png)  
- 
     [Import overview (インポートの概要)] ページを参照して、このオペレーション中に指定する必要がある項目の一覧を確認してください。[次へ] を選択します。 
- 
     [Specify template (テンプレートを指定)] ページで、以下のいずれかの方法を使用してテンプレートを指定し、[次へ] を選択します。 - 
       [Amazon S3 URL] を選択し、テキストボックスでテンプレートの URL を指定します。 
- 
       [Upload a template file (テンプレートファイルのアップロード)] を選択し、テンプレートを参照します。 
 
- 
       
- 
     [Identify resources (リソースの識別)] ページで、各ターゲットリソースを識別します。詳細については、「リソース識別子」を参照してください。 - 
       [Identifier property (識別子のプロパティ)] で、リソース識別子のタイプを選択します。たとえば、 AWS::DynamoDB::TableリソースはTableNameプロパティを使用して識別できます。
- 
       [Identifier value (識別子の値)] に、実際のプロパティ値を入力します。たとえば、サンプルテンプレートの GamesTableリソースのTableNameはGames
- 
       [次へ] を選択します。 
 
- 
       
- 
     [Specify stack details (スタック詳細の指定)] ページで、任意のパラメータを変更し、[次へ] を選択します。これにより、変更セットが自動的に作成されます。 重要作成、更新、または削除オペレーションを開始する既存のパラメータを変更すると、インポートオペレーションは失敗します。 
- 
     [Review stack_name(stack_name の確認)] ページで、インポートしようとしているリソースが正しいことを確認し、[Import resources (リソースのインポート)] を選択します。これにより、最後のステップで作成した変更セットが自動的に実行されます。新しいスタックの [Stack details] (スタックの詳細) ページの [Events] (イベント) ペインが表示されます。 ![コンソールの [イベント] タブ。](images/import-events.png)  
- 
     (オプション) スタックでドリフト検出を実行し、インポートされたリソースのテンプレートと実際の構成が一致していることを確認します。ドリフト検出の詳細については、「CloudFormation スタック全体のドリフトを検出する」を参照してください。 
- 
     (オプション)インポートしたリソースが予想されるテンプレート構成と一致しない場合は、テンプレート構成を修正するか、リソースを直接更新します。このチュートリアルでは、テンプレートの構成を実際の構成に合わせて修正します。 - 
       影響を受けるリソースのインポートオペレーションを元に戻します。 
- 
       インポートターゲットをテンプレートに再度追加して、テンプレートの構成が実際の構成と一致していることを確認します。 
- 
       変更したテンプレートを使用してステップ 2~8 を繰り返し、リソースを再度インポートします。 
 
- 
       
AWS CLI を使用した既存のリソースからのスタックの作成
- 
     テンプレート内の各リソースタイプを識別するプロパティを知るには、テンプレートの S3 URL を指定して get-template-summary コマンドを実行します。たとえば、 AWS::DynamoDB::TableリソースはTableNameプロパティを使用して識別できます。サンプルテンプレートのGamesTableリソースの場合、TableNameの値はGamesです。この情報は、次のステップで必要になります。aws cloudformation get-template-summary \ --template-urlhttps://amzn-s3-demo-bucket.s3.us-west-2.amazonaws.com/TemplateToImport.json詳細については、「リソース識別子」を参照してください。 
- 
     テンプレートから実際のリソースとそれらの一意の識別子のリストを次の 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" } } ]
- 
     変更セットを作成するには、次の create-change-set コマンドを使用してプレースホルダーテキストを置き換えます。 --change-set-typeオプションの場合、IMPORTの値を指定します。--resources-to-importオプションでは、サンプルの JSON 文字列を、作成した実際の JSON 文字列に置き換えます。aws cloudformation create-change-set \ --stack-nameTargetStack--change-set-nameImportChangeSet\ --change-set-typeIMPORT\ --template-urlhttps://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」を参照してください。または、次の例に示すように、ファイル URL を --resources-to-importオプションの入力として使用できます。--resources-to-importfile://ResourcesToImport.txt
- 
     変更セットを確認し、正しいリソースがインポートされることを確認します。 aws cloudformation describe-change-set \ --change-set-nameImportChangeSet--stack-nameTargetStack
- 
     変更セットを開始してリソースをインポートするには、次の execute-change-set コマンドを使用してプレースホルダーテキストを置き換えます。オペレーション (IMPORT_COMPLETE)が正常に完了すると、リソースは正常にインポートされています。aws cloudformation execute-change-set \ --change-set-nameImportChangeSet--stack-nameTargetStack
- 
     (オプション) IMPORT_COMPLETEスタックでドリフト検出を実行し、インポートされたリソースのテンプレートと実際の構成が一致していることを確認します。ドリフト検出に関する詳細は、「個々のスタックリソースのドリフトを検出」を参照してください。- 
       指定されたスタックでドリフト検出を実行します。 aws cloudformation detect-stack-drift --stack-nameTargetStack正常に完了した場合、このコマンドは次のサンプル出力を返します。 { "Stack-Drift-Detection-Id" : "624af370-311a-11e8-b6b7-500cexample" }
- 
       指定されたスタックドリフト検出 ID のドリフト検出オペレーションの進行状況を表示します。 aws cloudformation describe-stack-drift-detection-status \ --stack-drift-detection-id624af370-311a-11e8-b6b7-500cexample
- 
       指定されたスタック内でドリフトが確認されたリソースのドリフト情報を表示します。 aws cloudformation describe-stack-resource-drifts --stack-nameTargetStack
 
- 
       
- 
     
     (オプション)インポートしたリソースが予想されるテンプレート構成と一致しない場合は、テンプレート構成を修正するか、リソースを直接更新します。このチュートリアルでは、テンプレートの構成を実際の構成に合わせて修正します。 - 
       影響を受けるリソースのインポートオペレーションを元に戻します。 
- 
       インポートターゲットをテンプレートに再度追加して、テンプレートの構成が実際の構成と一致していることを確認します。 
- 
       変更したテンプレートを使用してステップ 3~6 を繰り返し、リソースを再度インポートします。 
 
-