スタック間でのリソースの移動 - AWS CloudFormation

スタック間でのリソースの移動

resource import 機能を使用すると、スタック間でリソースを移動、またはリファクタリングできます。まず、移動するリソースに Retain 削除ポリシーを追加して、ソーススタックからリソースを削除してターゲットスタックにインポートするときにリソースが保持されるようにする必要があります。

重要

すべてのリソースがインポートオペレーションをサポートしているわけではありません。スタックからリソースを削除する前に、「インポートオペレーションをサポートするリソース」を参照してください。インポートオペレーションをサポートしていないリソースをスタックから削除する場合、そのリソースを別のスタックにインポートしたり、ソーススタックに戻したりすることはできません。

AWS Management Console を使用したスタックのリファクタリング

  1. 移動元テンプレートで、移動するリソースに Retain DeletionPolicy を指定します。

    次のサンプルソーステンプレートでは、Games がこのリファクタリングの対象です。

    例 JSON

    { "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 } } } } }
  2. AWS CloudFormation コンソールを開き、スタック更新を実行して削除ポリシーを適用します。

    1. [スタック] ページで、スタックを選択した状態で [更新] を選択します。

    2. [Prepare template (テンプレートの準備)] で、[Replace current template (現在のテンプレートを置換)] を選択します。

    3. [Specify template (テンプレートを指定)] の下にある GamesTable で、DeletionPolicy 属性により更新されたソーステンプレートを指定し、[次へ] を選択します。

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

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

    4. [Specify stack details (スタック詳細の指定)] ページでは、変更の必要はありません。[次へ] を選択します。

    5. [スタックオプションの設定] ページでは、変更の必要はありません。[次へ] を選択します。

    6. [Review stack_name (stack_name の確認)] ページで、変更を確認します。テンプレートに IAM リソースが含まれる場合は、[I acknowledge that this template may create IAM resources (このテンプレートが IAM リソースを作成する可能性を認識しています)] を選択して、テンプレート内の IAM リソースを使用することを指定します。テンプレート内の IAM リソースの使用の詳細については、「AWS Identity and Access Management によるアクセスの制御」を参照してください。次に、変更セットを作成してソーススタックを更新するか、ソーススタックを直接更新します。

  3. ソーステンプレートからリソース、関連パラメータ、および出力を削除し、それらをターゲットテンプレートに追加します。

    ソーステンプレートは次のようになります。

    例 JSON

    { "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 } } } } }

    次のターゲットテンプレートの例には、現在 PlayersTable リソースがあり、さらに GamesTable も含まれています。

    例 JSON

    { "AWSTemplateFormatVersion": "2010-09-09", "Description": "Import test", "Resources": { "PlayersTable": { "Type": "AWS::DynamoDB::Table", "Properties": { "TableName": "Players", "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 } } } } }
  4. ステップ 2–3 を繰り返してソーススタックを再度更新します。今回は、スタックからターゲットリソースを削除します。

  5. インポートオペレーションを実行して、GamesTable をターゲットスタックに追加します。

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

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

    3. [Specify template (テンプレートを指定)] ページで、以下のいずれかの操作を行い、[次へ] を選択します。

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

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

    4. [Identify resources (リソースの識別)] ページで、移動するリソース(この例では GamesTable)を特定します。

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

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

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

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

      重要

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

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

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

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

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

AWS CLI を使用したスタックのリファクタリング

  1. 移動元テンプレートで、移動するリソースに Retain DeletionPolicy を指定します。

    次のサンプルソーステンプレートでは、GamesTable がこのリファクタリングの対象です。

    例 JSON

    { "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 } } } } }
  2. ソーススタックを更新して、削除ポリシーをリソースに適用します。

    update-stack --stack-name "source-stack-name"
  3. ソーステンプレートからリソース、関連パラメータ、および出力を削除し、それらをターゲットテンプレートに追加します。

    ソーステンプレートは次のようになります。

    例 JSON

    { "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 } } } } }

    次のターゲットテンプレートの例には、現在 PlayersTable リソースがあり、さらに GamesTable も含まれています。

    例 JSON

    { "AWSTemplateFormatVersion": "2010-09-09", "Description": "Import test", "Resources": { "PlayersTable": { "Type": "AWS::DynamoDB::Table", "Properties": { "TableName": "Players", "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 } } } } }
  4. ソーススタックを更新して、GamesTable リソースとそれに関連するパラメータと出力をスタックから削除します。

    aws cloudformation update-stack --stack-name "source-stack-name"
  5. 以下のパラメータを使用して、タイプ 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\"}}]" --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" } } ]
  6. 変更セットを確認し、正しいリソースがターゲットスタックにインポートされることを確認します。

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

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

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