スタックへの既存リソースのインポート - AWS CloudFormation

スタックへの既存リソースのインポート

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

前提条件

始めるには以下のものが必要です。

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

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

    1. CloudFormation コンソール (https://console.aws.amazon.com/cloudformation/) を開きます。

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

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

    4. コードをテキストエディタに貼り付けて、テンプレートへのその他リソースの追加を開始します。

  • インポートするリソースごとに、以下を含めてください。

    • リソースの現在の設定を定義するリソース属性とプロパティ値。

    • リソースの固有識別子 (リソース名など)。詳細については、「 リソース識別子」を参照してください。

    • DeletionPolicy 属性

サンプルテンプレート

このチュートリアルでは、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 Management Console を使用した既存のリソースのスタックへのインポート

注記

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

  1. AWS Management Console にサインインし、AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation) を開きます。

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

  3. [Stack actions (スタックアクション)] を選択し、[Import resources into stack (リソースをスタックにインポートする)] を選択します。

    コンソールの [Import resources into stack (リソースをスタックにインポートする)] オプション。
  4. [インポートの概要] ページを確認し、[次へ] を選択します。

  5. [Specify template (テンプレートを指定)] ページで、以下のいずれかの方法を使用して更新したテンプレートを指定し、[次へ] を選択します。

    • [Amazon S3 URL] を選択し、テキストボックスでテンプレートの URL を指定します。

    • [Upload a template file (テンプレートファイルのアップロード)] を選択し、テンプレートを参照します。

  6. [Identify resources (リソースの識別)] ページで、各ターゲットリソースを識別します。詳細については、「 リソース識別子」を参照してください。

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

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

    3. [Next] を選択します。

  7. [Specify stack details (スタック詳細の指定)] ページで、任意のパラメータを更新し、[次へ] を選択します。これにより、変更セットが自動的に作成されます。

    注記

    作成、更新、または削除オペレーションを開始する既存のパラメータを変更すると、インポートオペレーションは失敗します。

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

    スタックの [イベント] ページが表示されます。

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

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

AWS CLI を使用した既存のリソースのスタックへのインポート

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

    $ aws cloudformation get-template-summary \ --template-url https://DOC-EXAMPLE-BUCKET.s3.us-west-2.amazonaws.com/TemplateToImport.json

    詳細については、「 リソース識別子」を参照してください。

  2. インポートするリソースとその一意の識別子のリストを次の形式で作成します。

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

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

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

    [ { "ResourceType":"AWS::DynamoDB::Table", "LogicalResourceId":"GamesTable", "ResourceIdentifier": { "TableName":"Games" } } ]
  3. 変更セットを作成するには、次の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://DOC-EXAMPLE-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 ユーザーガイドの「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
  4. 変更セットを確認し、正しいリソースがインポートされることを確認します。

    $ aws cloudformation describe-change-set \ --change-set-name ImportChangeSet --stack-name TargetStack
  5. 変更セットを開始し、リソースをインポートするには、次のexecute-change-setコマンドを使用してプレースホルダーテキストを置き換えます。この時点で、インポートされたリソースにはスタックレベルのタグが適用されます。詳細については、「AWS CloudFormation スタックオプションの設定」を参照してください。オペレーション (IMPORT_COMPLETE) が正常に完了すると、リソースは正常にインポートされています。

    $ aws cloudformation execute-change-set \ --change-set-name ImportChangeSet --stack-name TargetStack
  6. (オプション)IMPORT_COMPLETE スタックでドリフト検出を実行し、インポートされたリソースのテンプレートと実際の構成が一致していることを確認します。ドリフト検出の詳細については、「CloudFormation スタック全体のドリフトを検出する」を参照してください。

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

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

      正常に完了した場合、このコマンドは以下のような出力を返します。

      { "Stack-Drift-Detection-Id" : "624af370-311a-11e8-b6b7-500cexample" }
    2. 指定されたスタックドリフト検出 ID のドリフト検出オペレーションの進行状況を表示します。

      $ aws cloudformation describe-stack-drift-detection-status \ --stack-drift-detection-id 624af370-311a-11e8-b6b7-500cexample
    3. 指定されたスタック内でドリフトが確認されたリソースのドリフト情報を返します。

      $ aws cloudformation describe-stack-resource-drifts --stack-name TargetStack
  7. (オプション)インポートしたリソースが予想されるテンプレート構成と一致しない場合は、テンプレート構成を修正するか、リソースを直接更新します。ドリフトしたリソースのインポートに関する詳細は、「インポートオペレーションでドリフトを解決する」を参照してください。