既存のスタックのネスト化
resource import
機能を使用して、既存のスタックを別の既存のスタック内にネスト化します。ネスト化されたスタックは、他のテンプレート内から宣言および参照する一般的なコンポーネントです。これにより、同じ構成をテンプレートにコピーして貼り付けるのを避け、スタックの更新を簡素化できます。共通コンポーネントのテンプレートがある場合は、AWS::CloudFormation::Stack
リソースを使用して、別のテンプレート内からこのテンプレートを参照できます。ネストされたスタックの詳細については、「ネストされたスタックを使用して他のスタック内にスタックを埋め込む」を参照してください。
AWS CloudFormation は、resource import
を使用して 1 つのレベルのネスト化のみをサポートします。つまり、子スタックにスタックをインポートしたり、子を持つスタックをインポートしたりすることはできません。
インポートを初めて行う場合は、まず リソースインポートを使用して CloudFormation スタックに AWS リソースをインポートする トピックの概要情報を確認することをお勧めします。
ネストされたスタックのインポートの検証
ネストされたスタックのインポートオペレーション中に、AWS CloudFormation は以下の検証を実行します。
-
親スタックテンプレートのネスト化された
AWS::CloudFormation::Stack
定義は、実際のネスト化されたスタックのテンプレートと一致します。 -
親スタックテンプレートのネスト化された
AWS::CloudFormation::Stack
定義のタグは、実際のネスト化されたスタックリソースのタグと一致します。
AWS Management Console を使用した既存のスタックのネスト化
-
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
-
AWS CloudFormation コンソールを開きます。
-
[スタック] ページで、親スタックを選択した状態で [Stack actions (スタックアクション)] を選択し、[Import resources into stack (リソースをスタックにインポートする)] を選択します。
-
[Import overview (インポートの概要)] ページを参照して、このオペレーション中に指定する必要がある項目の一覧を確認してください。[次へ] を選択します。
-
[Specify template (テンプレートを指定)] ページで、以下のいずれかの方法を使用して更新した親テンプレートを指定し、[次へ] を選択します。
-
[Amazon S3 URL] を選択し、テキストボックスでテンプレートの URL を指定します。
-
[Upload a template file (テンプレートファイルのアップロード)] を選択し、テンプレートを参照します。
-
-
[Identify resources (リソースの識別)] ページで、
AWS::CloudFormation::Stack
リソースを識別します。-
[Identifier property (識別子のプロパティ)] で、リソース識別子のタイプを選択します。例えば、
AWS::CloudFormation::Stack
リソースはStackId
プロパティを使用して識別できます。 -
[識別子の値] で、インポートするスタックの ARN を入力します。例えば、
と指定します。arn:aws:cloudformation:us-west-2:12345678910:stack/mystack/5b918d10-cd98-11ea-90d5-0a9cd3354c10
-
[Next] を選択します。
-
-
[Specify stack details (スタック詳細の指定)] ページで、任意のパラメータを変更し、[次へ] を選択します。これにより、変更セットが自動的に作成されます。
重要
作成、更新、または削除オペレーションを開始する既存のパラメータを変更すると、インポートオペレーションは失敗します。
-
[
MyParentStack
を確認] ページで、インポートしようとしているリソースが正しいことを確認し、[リソースをインポート] を選択します。これにより、最後のステップで作成した変更セットが自動的に実行されます。この時点で、インポートされたリソースにはスタックレベルのタグが適用されます。 -
親スタックの [Stack details] (スタックの詳細) ページの [Events] (イベント) ペインが表示されます。
注記
AWS::CloudFormation::Stack
リソースはすでに AWS CloudFormation によって管理されていたため、このインポートオペレーションの後、親スタックでドリフト検出を実行する必要はありません。
AWS CLI を使用した既存のスタックのネスト化
-
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
-
次の例に示すように、次の変更を加えて 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
-
-
変更セットを作成するには、次の create-change-set コマンドを使用してプレースホルダーテキストを置き換えます。
--change-set-type
オプションの場合、IMPORT
の値を指定します。--resources-to-import
オプションでは、サンプルの JSON 文字列を、作成した実際の JSON 文字列に置き換えます。aws cloudformation create-change-set \ --stack-name
MyParentStack
--change-set-nameImportChangeSet
\ --change-set-typeIMPORT
\ --template-bodyfile://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" }
-
変更セットを確認し、正しいスタックがインポートされることを確認します。
aws cloudformation describe-change-set --change-set-name
ImportChangeSet
-
変更セットを開始し、スタックをソースの親スタックにインポートするには、次の execute-change-set コマンドを使用してプレースホルダーテキストを置き換えます。この時点で、インポートされたリソースにはスタックレベルのタグが適用されます。インポートオペレーション
(IMPORT_COMPLETE)
が正常に完了すると、スタックは正常にネストされています。aws cloudformation execute-change-set --change-set-name
ImportChangeSet
注記
AWS::CloudFormation::Stack
リソースはすでに AWS CloudFormation によって管理されているため、このインポートオペレーションの後、親スタックでドリフト検出を実行する必要はありません。