Verschieben von Ressourcen zwischen Stacks - AWS CloudFormation

Verschieben von Ressourcen zwischen Stacks

Mithilfe der resource import-Funktion können Sie Ressourcen zwischen Stacks verschieben oder Stacks umgestalten. Sie müssen zuerst eine Retain-Löschrichtlinie zu der Ressource hinzufügen, die Sie verschieben möchten, um sicherzustellen, dass die Ressource erhalten bleibt, wenn Sie sie aus dem Quell-Stack entfernen und in den Ziel-Stack importieren.

Wichtig

Nicht alle Ressourcen unterstützen Importvorgänge. Weitere Informationen finden Sie unter Ressourcen, die Importvorgänge unterstützen bevor Sie eine Ressource aus dem Stack entfernen. Wenn Sie eine Ressource entfernen, die keine Importvorgänge aus dem Stack unterstützt, können Sie die Ressource nicht in einen anderen Stack importieren oder sie wieder in den Quell-Stack bringen.

Umgestalten eines Stacks mithilfe der AWS Management Console

  1. Geben Sie in der Quellvorlage eine Retain-DeletionPolicy für die Ressource an, die Sie verschieben möchten.

    In der folgenden Beispiel-Quellvorlage ist Games das Ziel dieser Umgestaltung.

    Beispiel 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. Öffnen Sie die AWS CloudFormation-Konsole zum Durchführen einer Stack-Aktualisierung, um die Löschrichtlinie anzuwenden.

    1. Wählen Sie auf der Seite Stacks (Stapel) bei ausgewähltem Stack Update (Aktualisieren) aus.

    2. Wählen Sie unter Vorlage vorbereiten die Option Aktuelle Vorlage ersetzen aus.

    3. Geben Sie unter Vorlage angeben die aktualisierte Quellvorlage mit dem DeletionPolicy-Attribut für GamesTable ein und wählen Sie dann Weiter aus.

      • Wählen Sie Amazon S3-URL aus und geben Sie dann im Textfeld die URL zur aktualisierten Quellvorlage an.

      • Wählen Sie Vorlagendatei hochladen aus und suchen Sie dann nach der aktualisierten Quellvorlagendatei.

    4. Auf der Seite Stack-Details angeben sind keine Änderungen erforderlich. Wählen Sie Next.

    5. Auf der Seite Stack-Optionen konfigurieren sind keine Änderungen erforderlich. Wählen Sie Next.

    6. Überprüfen Sie auf der Seite stack_name überprüfen Ihre Änderungen. Wenn Ihre Vorlage IAM-Ressourcen enthält, wählen Sie I acknowledge that this template may create IAM resources (Ich nehme zur Kenntnis, dass diese Vorlage IAM-Ressourcen erstellen kann) aus, um anzugeben, dass Sie IAM-Ressourcen in der Vorlage verwenden möchten. Weitere Informationen zum Verwenden von IAM-Ressourcen in Vorlagen finden Sie unter Zugriffssteuerung mit AWS Identity and Access Management. Aktualisieren Sie dann entweder Ihren Quell-Stack, indem Sie einen Änderungssatz erstellen, oder aktualisieren Sie Ihren Quell-Stack direkt.

  3. Entfernen Sie die Ressource, die zugehörigen Parameter und Ausgaben aus der Quellvorlage und fügen Sie sie dann der Zielvorlage hinzu.

    Die Quellvorlage sieht nun wie folgt aus.

    Beispiel 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 } } } } }

    Die folgende Beispiel-Zielvorlage enthält derzeit die PlayersTable-Ressource und enthält nun auch GamesTable.

    Beispiel 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. Wiederholen Sie die Schritte 2–3, um den Quell-Stack erneut zu aktualisieren, um dieses Mal die Zielressource aus dem Stack zu löschen.

  5. Führen Sie einen Importvorgang aus, der GamesTable dem Ziel-Stack hinzufügt.

    1. Wählen Sie auf der Seite Stacks mit ausgewähltem übergeordneten Stack Stack-Aktionen und dann Ressourcen in Stack importieren aus.

      
                        Die Option „Ressourcen in Stack importieren“ in der Konsole.
    2. Auf der Seite Importübersicht finden Sie eine Liste der Dinge, die Sie während dieses Vorgangs angeben müssen. Wählen Sie anschließend Weiter.

    3. Führen Sie auf der Seite Vorlage angeben eine der folgenden Aktionen aus und wählen Sie dann Weiter.

      • Wählen Sie Amazon S3-URL aus und geben Sie dann im Textfeld eine URL an.

      • Wählen Sie Vorlagendatei hochladen aus und suchen Sie dann nach einer Datei, die hochgeladen werden soll.

    4. Identifizieren Sie auf der Seite Ressourcen identifizieren die Ressource, die Sie verschieben möchten (in diesem Beispiel GamesTable).

      1. Wählen Sie unter Bezeichnereigenschaft den Typ des Ressourcenbezeichners aus. Beispielsweise kann eine AWS::DynamoDB::Table-Ressource mit der TableName-Eigenschaft identifiziert werden.

      2. Geben Sie unter Bezeichnerwert den tatsächlichen Eigenschaftswert ein. Beispiel, GamesTables.

        
                        Die Seite „Ressourcen identifizieren“ in der Konsole.
      3. Wählen Sie Next.

    5. Ändern Sie auf der Seite Stack-Details angeben alle Parameter und wählen Sie dann Weiter aus. Dadurch wird automatisch ein Änderungssatz erstellt.

      Wichtig

      Der Importvorgang schlägt fehl, wenn Sie vorhandene Parameter ändern, die einen Erstellungs-, Aktualisierungs- oder Löschvorgang initiieren.

    6. Überprüfen Sie auf der Seite Stack-Name überprüfen, ob die richtige Ressource importiert wird, und wählen Sie dann Ressourcen importieren aus. Dadurch wird der im letzten Schritt erstellte Änderungssatz automatisch ausgeführt. Alle Tags auf Stack-Ebene werden zu diesem Zeitpunkt auf importierte Ressourcen angewendet.

    7. Der Bereich Ereignisse der Seite Stack-Details für Ihren übergeordneten Stack wird angezeigt.

      
                  Die Registerkarte „Ereignisse“ in der Konsole.
      Anmerkung

      Es ist nicht erforderlich, die Abweichungserkennung für den übergeordneten Stack nach diesem Importvorgang auszuführen, da die AWS::CloudFormation::Stack-Ressource bereits von AWS CloudFormation verwaltet wird.

Umgestalten eines Stacks mithilfe der AWS CLI

  1. Geben Sie in der Quellvorlage eine Retain-DeletionPolicy für die Ressource an, die Sie verschieben möchten.

    In der folgenden Beispiel-Quellvorlage ist GamesTable das Ziel dieser Umgestaltung.

    Beispiel 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. Aktualisieren Sie den Quell-Stack, um die Löschrichtlinie auf die Ressource anzuwenden.

    update-stack --stack-name "source-stack-name"
  3. Entfernen Sie die Ressource, die zugehörigen Parameter und Ausgaben aus der Quellvorlage und fügen Sie sie dann der Zielvorlage hinzu.

    Die Quellvorlage sieht nun wie folgt aus.

    Beispiel 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 } } } } }

    Die folgende Beispiel-Zielvorlage enthält derzeit die PlayersTable-Ressource und enthält nun auch GamesTable.

    Beispiel 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. Aktualisieren Sie den Quell-Stack, um die GamesTable-Ressource und die zugehörigen Parameter und Ausgaben aus dem Stack zu löschen.

    aws cloudformation update-stack --stack-name "source-stack-name"
  5. Erstellen Sie einen Änderungssatz vom Typ IMPORT mit den folgenden Parametern. --resources-to-import unterstützt keine Inline-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

    Die AWS CLI unterstützt auch Textdateien als Eingabe für den resources-to-import-Parameter, wie im folgenden Beispiel gezeigt.

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

    In dieser Anleitung enthält file://resourcesToImport.txt Folgendes.

    [ { "ResourceType":"AWS::DynamoDB::Table", "LogicalResourceId":"GamesTable", "ResourceIdentifier": { "TableName":"Games" } } ]
  6. Überprüfen Sie den Änderungssatz, um sicherzustellen, dass die richtige Ressource in den Ziel-Stack importiert wird.

    > aws cloudformation describe-change-set --change-set-name ImportChangeSet
  7. Führen Sie den Änderungssatz aus, um die Ressource in den Ziel-Stack zu importieren. Alle Tags auf Stack-Ebene werden zu diesem Zeitpunkt auf importierte Ressourcen angewendet. Nach erfolgreichem Abschluss des Vorgangs (IMPORT_COMPLETE) wird die Ressource erfolgreich importiert.

    > aws cloudformation execute-change-set --change-set-name ImportChangeSet
    Anmerkung

    Es ist nicht erforderlich, die Abweichungserkennung für den Ziel-Stack nach diesem Importvorgang auszuführen, da die Ressource bereits von AWS CloudFormation verwaltet wird.