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

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

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

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

インポートを初めて行う場合は、まず リソースインポートを使用して CloudFormation スタックに AWS リソースをインポートする トピックの概要情報を確認することをお勧めします。

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

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

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

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

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

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

    JSON

    { "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 } } }, "MyNestedStack" : { "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" } } } } }

    YAML

    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 MyNestedStack: 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 (インポートの概要)] ページを参照して、このオペレーション中に指定する必要がある項目の一覧を確認してください。[次へ] を選択します。

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

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

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

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

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

    2. [識別子の値] で、インポートするスタックの ARN を入力します。例えば、arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10 と指定します。

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

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

    重要

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

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

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

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

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

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

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

    JSON

    { "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 } } }, "MyNestedStack" : { "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" } } } } }

    YAML

    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 MyNestedStack: 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. 次の例に示すように、次の変更を加えて JSON 文字列を作成します。

    • MyNestedStack を、テンプレートで指定されているターゲットリソースの論理 ID に置き換えます。

    • arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10 を、インポートするスタックの ARN に置き換えます。

    [{"ResourceType":"AWS::CloudFormation::Stack","LogicalResourceId":"MyNestedStack","ResourceIdentifier":{"StackId":"arn:aws:cloudformation:us-east-2:123456789012:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10"}}]

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

    例えば、MyNestedStack をインポートするには、次の設定を含む ResourcesToImport.txt ファイルを作成することが考えられます。

    JSON

    [ { "ResourceType":"AWS::CloudFormation::Stack", "LogicalResourceId":"MyNestedStack", "ResourceIdentifier": { "StackId":"arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10" } } ]

    YAML

    ResourceType: 'AWS::CloudFormation::Stack' LogicalResourceId: MyNestedStack ResourceIdentifier: StackId: >- arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10
  3. 変更セットを作成するには、次の create-change-set コマンドを使用してプレースホルダーテキストを置き換えます。--change-set-type オプションの場合、IMPORT の値を指定します。--resources-to-import オプションでは、サンプルの JSON 文字列を、作成した実際の JSON 文字列に置き換えます。

    aws cloudformation create-change-set \ --stack-name MyParentStack --change-set-name ImportChangeSet \ --change-set-type IMPORT \ --template-body file://TemplateToImport.json \ --resources-to-import '[{"ResourceType":"AWS::CloudFormation::Stack","LogicalResourceId":"MyNestedStack","ResourceIdentifier":{"StackId":"arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10"}}]'
    注記

    --resources-to-import はインライン YAML をサポートしていません。JSON 文字列で引用符をエスケープするための要件は、ターミナルに応じて異なります。詳細については、「AWS Command Line Interface ユーザーガイド」の「Using quotation marks inside strings」を参照してください。

    または、次の例に示すように、ファイル URL を --resources-to-importオプションの入力として使用できます。

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

    正常に完了した場合、このコマンドは次のサンプル出力を返します。

    { "Id": "arn:aws:cloudformation:us-west-2:12345678910:changeSet/ImportChangeSet/8ad75b3f-665f-46f6-a200-0b4727a9442e", "StackId": "arn:aws:cloudformation:us-west-2:12345678910:stack/MyParentStack/4e345b70-1281-11ef-b027-027366d8e82b" }
  4. 変更セットを確認し、正しいスタックがインポートされることを確認します。

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

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

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