既存のリソースからのスタックの作成 - AWS CloudFormation

既存のリソースからのスタックの作成

このインポートオペレーションでは、以下の情報を指定する必要があります。

  • 新しいスタックに含まれるリソースとそのリソース設定を記述するテンプレート。テンプレート内の各リソースには、DeletionPolicy 属性が必要です。

  • 各ターゲットリソースの一意の識別子。適切なサービスコンソールにアクセスして、一意の識別子を取得します。

このチュートリアルでは、templateToImport.json というテンプレートの例を示します。ServiceTableGamesTable がインポートの対象です。

{ "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 CloudFormation コンソールを使用した既存のリソースからのスタックの作成

  1. AWS CloudFormation コンソールを開きます。

  2. [スタック] ページで、[スタックを作成] を選択し、[With existing resources (import resources) (既存のリソースを使用(リソースのインポート))] を選択します。

    
               コンソールの [既存のリソースからのスタックの作成] オプション。
  3. [Import overview (インポートの概要)] ページを参照して、このオペレーション中に指定する必要がある項目の一覧を確認してください。続いて、[Next] を選択します。

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

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

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

  5. [Identify resources (リソースの識別)] ページで、各ターゲットリソースを識別します。

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

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

      
                        コンソールの [Identify resources (リソースの識別)] ページ。
    3. [Next] を選択します。

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

    重要

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

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

    新しいスタックの [Stack details (スタックの詳細)] ページの [イベント] ペインが表示されます。

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

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

    1. 影響を受けるリソースのインポートオペレーションを元に戻します

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

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

AWS CLI を使用した既存のリソースからのスタックの作成

  1. AWS CLI を開きます。

  2. オプションで GetTemplateSummary を実行して、テンプレート内の各リソースタイプを識別するプロパティを確認できます。たとえば、AWS::DynamoDB::Table リソースは TableName プロパティを使用して識別できます。サンプルテンプレートの GamesTable リソースの場合、TableName の値は Games です。

    > aws cloudformation get-template-summary --template-body file://templateToImport.json
  3. テンプレートからターゲットリソースとそれらの一意の識別子のリストを次の形式で作成します。

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

  4. 以下のパラメータを使用して、タイプ IMPORT の変更セットを作成します。--resources-to-import はインライン YAML をサポートしていません。

    > aws cloudformation create-change-set --stack-name TargetStack --change-set-name ImportChangeSet --change-set-type IMPORT --resources-to-import "[{\"ResourceType\":\"AWS::DynamoDB::Table\",\"LogicalResourceId\":\"GamesTable\",\"ResourceIdentifier\":{\"TableName\":\"Games\"}},{\"ResourceType\":\"AWS::DynamoDB::Table\",\"LogicalResourceId\":\"ServiceTable\",\"ResourceIdentifier\":{\"TableName\":\"Service\"}}]" --template-body file://templateToImport.json

    AWS CLI は、次の例に示すように、--resources-to-import パラメータへの入力としてテキストファイルもサポートします。

    --resources-to-import: file://resourcesToImport.txt

    このチュートリアルでは、file://resourcesToImport.txt に次の内容が含まれています。

    [ { "ResourceType":"AWS::DynamoDB::Table", "LogicalResourceId":"GamesTable", "ResourceIdentifier": { "TableName":"Games" } }, { "ResourceType":"AWS::DynamoDB::Table", "LogicalResourceId":"ServiceTable", "ResourceIdentifier": { "TableName":"Service" } } ]
  5. 変更セットを確認し、正しいリソースがインポートされることを確認します。

    > aws cloudformation describe-change-set --change-set-name ImportChangeSet --stack-name TargetStack
  6. 変更セットを実行して、リソースをインポートします。オペレーション (IMPORT_COMPLETE) が正常に完了すると、リソースは正常にインポートされています。

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

    > aws cloudformation detect-stack-drift --stack-name TargetStack { "Stack-Drift-Detection-Id" : "624af370-311a-11e8-b6b7-500cexample" } > aws cloudformation describe-stack-drift-detection-status --stack-drift-detection-id 624af370-311a-11e8-b6b7-500cexample > aws cloudformation describe-stack-resource-drifts --stackname TargetStack
  8. (オプション)インポートしたリソースが予想されるテンプレート設定と一致しない場合は、テンプレート設定を修正するか、リソースを直接更新します。このチュートリアルでは、テンプレートの設定を実際の設定に合わせて修正します。

    1. 影響を受けるリソースのインポートオペレーションを元に戻します

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

    3. 変更したテンプレートを使用して手順 4~7 を繰り返し、リソースを再度インポートします。