既存のスタックのネスト化 - AWS CloudFormation

既存のスタックのネスト化

resource import 機能を使用して、既存のスタックを別の既存のスタック内にネスト化します。ネスト化されたスタックは、他のテンプレート内から宣言および参照する一般的なコンポーネントです。これにより、同じ設定をテンプレートにコピーして貼り付けるのを避け、スタックの更新を簡素化できます。共通コンポーネントのテンプレートがある場合は、AWS::CloudFormation::Stack リソースを使用して、別のテンプレート内からこのテンプレートを参照できます。ネストされたスタックの詳細については、「ネストされたスタックの操作」を参照してください。

AWS CloudFormation は、resource import を使用して 1 つのレベルのネスト化のみをサポートします。つまり、子スタックにスタックをインポートしたり、子を持つスタックをインポートしたりすることはできません。

ネストされたスタックのインポートの検証

ネストされたスタックのインポートオペレーション中に、AWS CloudFormation は以下の検証を実行します。

  • 親スタックテンプレートのネスト化された AWS::CloudFormation::Stack 定義は、実際のネスト化されたスタックのテンプレートと一致します。

  • 親スタックテンプレートのネスト化された AWS::CloudFormation::Stack 定義のタグは、実際のネスト化されたスタックリソースのタグと一致します。

AWS マネジメントコンソール を使用した既存のスタックのネスト化

  1. Retain DeletionPolicy を使用して、AWS::CloudFormation::Stack リソースを親スタックテンプレートに追加します。次の親テンプレート例では、NestedStack がインポートのターゲットです。

    { "AWSTemplateFormatVersion" : "2010-09-09", "Resources" : { "ServiceTable":{ "Type":"AWS::DynamoDB::Table", "Properties":{ "TableName":"Service", "AttributeDefinitions":[ { "AttributeName":"key", "AttributeType":"S" } ], "KeySchema":[ { "AttributeName":"key", "KeyType":"HASH" } ], "ProvisionedThroughput":{ "ReadCapacityUnits":5, "WriteCapacityUnits":1 } } }, "NestedStack" : { "Type" : "AWS::CloudFormation::Stack", "DeletionPolicy": "Retain", "Properties" : { "TemplateURL" : "https://s3.amazonaws.com/cloudformation-templates-us-east-2/EC2ChooseAMI.template", "Parameters" : { "InstanceType" : "t1.micro", "KeyName" : "mykey" } } } } }
  2. AWS CloudFormation コンソールを開きます。

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

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

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

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

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

  6. [Identify resources (リソースの識別)] ページで、AWS::CloudFormation::Stack リソースを識別します。

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

    2. [Identifier value (識別子の値)] に、実際のプロパティ値を入力します。たとえば、my_stack と指定します。

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

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

    重要

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

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

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

    
                  コンソールの [イベント] タブ。
    注記

    AWS::CloudFormation::Stack リソースはすでに AWS CloudFormation によって管理されていたため、このインポートオペレーションの後、親スタックでドリフト検出を実行する必要はありません。

AWS CLI を使用した既存のスタックのネスト化

  1. Retain DeletionPolicy を使用して、AWS::CloudFormation::Stack リソースを親スタックテンプレートに追加します。次の親テンプレート例では、NestedStack がインポートのターゲットです。

    { "AWSTemplateFormatVersion" : "2010-09-09", "Resources" : { "ServiceTable":{ "Type":"AWS::DynamoDB::Table", "Properties":{ "TableName":"Service", "AttributeDefinitions":[ { "AttributeName":"key", "AttributeType":"S" } ], "KeySchema":[ { "AttributeName":"key", "KeyType":"HASH" } ], "ProvisionedThroughput":{ "ReadCapacityUnits":5, "WriteCapacityUnits":1 } } }, "NestedStack" : { "Type" : "AWS::CloudFormation::Stack", "DeletionPolicy": "Retain", "Properties" : { "TemplateURL" : "https://s3.amazonaws.com/cloudformation-templates-us-east-2/EC2ChooseAMI.template", "Parameters" : { "InstanceType" : "t1.micro", "KeyName" : "mykey" } } } } }
  2. 以下のパラメータを使用して、タイプ IMPORT の変更セットを作成します。--resources-to-import はインライン YAML をサポートしていません。

    > aws cloudformation create-change-set --stack-name TargetParentStack --change-set-name ImportChangeSet --change-set-type IMPORT --resources-to-import "[{\"ResourceType\":\AWS::CloudFormation::Stack\",\"LogicalResourceId\":\"MyStack\",\"ResourceIdentifier\":{\"StackId\":\"arn:aws:cloudformation:us-east-2:123456789012:stack/mystack-mynestedstack-sggfrhxhum7w/f449b250-b969-11e0-a185-5081d0136786\"}}] --template-body file://templateToImport.json

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

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

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

    [ { "ResourceType":"AWS::CloudFormation::Stack", "LogicalResourceId":"MyStack", "ResourceIdentifier": { "StackId":"arn:aws:cloudformation:us-east-2:123456789012:stack/mystack-mynestedstack-sggfrhxhum7w/f449b250-b969-11e0-a185-5081d0136786" } } ]
  3. 変更セットを確認し、正しいスタックがインポートされることを確認します。

    > aws cloudformation describe-change-set --change-set-name ImportChangeSet
  4. 変更セットを実行して、ソース親スタックにスタックをインポートします。この時点で、インポートされたリソースにはスタックレベルのタグが適用されます。インポートオペレーション (IMPORT_COMPLETE) が正常に完了すると、スタックは正常にネストされています。

    > aws cloudformation execute-change-set --change-set-name ImportChangeSet
    注記

    AWS::CloudFormation::Stack リソースはすでに AWS CloudFormation によって管理されていたため、このインポートオペレーションの後、親スタックでドリフト検出を実行する必要はありません。