Déplacement de ressources d'une pile à une autre - AWS CloudFormation

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Déplacement de ressources d'une pile à une autre

À l'aide de la fonction resource import, vous pouvez déplacer des ressources d'une pile à une autre ou les remanier, . Vous devez d'abord ajouter une politique de suppression Retain à la ressource que vous souhaitez déplacer pour vous assurer que la ressource est préservée lorsque vous la supprimez de la pile source et que vous l'importez dans la pile cible.

Si vous débutez dans le domaine de l'importation, nous vous recommandons de consulter d'abord les informations d'introduction de cette Intégrer les ressources existantes à CloudFormation la gestion rubrique.

Important

Toutes les ressources ne prennent pas en charge les opérations d'importation. Veuillez consulter Ressources prenant en charge les opérations d'importation avant de supprimer une ressource de votre pile. Si vous supprimez de votre pile une ressource qui ne prend pas en charge les opérations d'importation, vous ne pouvez pas importer la ressource dans une autre pile ou la ramener dans la pile source.

Refactorisez une pile à l'aide du AWS Management Console

  1. Dans le modèle de source, spécifiez un Retain DeletionPolicypour la ressource que vous souhaitez déplacer.

    Dans l'exemple de modèle source suivant, Games est la cible de ce remaniement.

    Exemple 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. Ouvrez la AWS CloudFormation console pour effectuer une mise à jour de la pile afin d'appliquer la politique de suppression.

    1. Dans la page Piles, avec la pile sélectionnée, choisissez Mettre à jour.

    2. Sous Prepare template (Préparer le modèle), choisissez Replace current template (Remplacer le modèle actuel).

    3. Dans Specify template (Spécifier le modèle), indiquez le modèle source mis à jour avec l'attribut DeletionPolicy défini sur GamesTable, puis choisissez Suivant.

      • Choisissez Amazon S3 URL (URL Amazon S3), puis spécifiez l'URL du modèle source mis à jour dans la zone de texte.

      • Choisissez Upload a template file (Télécharger un fichier de modèle), puis recherchez le fichier de modèle source mis à jour.

    4. Dans la page Specify stack details (Spécifier les détails de la pile) aucune modification n'est requise. Choisissez Suivant.

    5. Dans la page Configure stack options (Configurer les options de pile) aucune modification n'est requise. Choisissez Suivant.

    6. Sur la SourceStackNamepage Révision, passez en revue vos modifications. Si votre modèle contient des ressources IAM, sélectionnez I acknowledge that this template may create IAM resources (Je sais que ce modèle peut créer des ressources IAM) pour confirmer que vous souhaitez utiliser des ressources IAM dans le modèle. Pour plus d'informations sur l'utilisation de ressources IAM dans les modèles, consultez Contrôler l'accès avec AWS Identity and Access Management. Mettez ensuite à jour votre pile source en créant un jeu de modifications ou mettez à jour votre pile source directement.

  3. Supprimez la ressource, les paramètres associés et les sorties du modèle source, puis ajoutez-les au modèle cible.

    Le modèle source ressemble maintenant à ce qui suit.

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

    L'exemple de modèle cible suivant a actuellement la ressource PlayersTable et contient maintenant également GamesTable.

    Exemple 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. Répétez les étapes 2 et 3 pour mettre à jour à nouveau la pile source, afin, cette fois, de supprimer la ressource cible de la pile.

  5. Effectuez une opération d'importation pour ajouter GamesTable à la pile cible.

    1. Sur la page Piles, sélectionnez la pile parent, choisissez Stack actions (Actions pour la pile), puis Import resources into stack (Importer les ressources dans la pile).

      Option Import resources into stack (Importer les ressources dans la pile) dans la console.
    2. Lisez la page Vue d'ensemble de l'importation pour obtenir la liste des éléments que vous devez fournir dans le cadre de cette opération. Ensuite, choisissez Suivant.

    3. Dans la page Specify template (Spécifier un modèle) effectuez l'une des opérations suivantes, puis choisissez Next (Suivant).

      • Choisissez Amazon S3 URL (URL Amazon S3), puis spécifiez une URL dans la zone de texte.

      • Choisissez Upload a template file (Charger un fichier de modèle), puis recherchez un fichier à télécharger.

    4. Dans la page Identify resources (Identifier les ressources) identifiez la ressource que vous déplacez (dans cet exemple, GamesTable). Pour plus d’informations, consultez Identifiants de ressources.

      1. Sous Identifier property (Propriété de l'identifiant), choisissez le type d'identifiant de ressource. Par exemple, une ressource AWS::DynamoDB::Table peut être identifiée à l'aide de la propriété TableName.

      2. Sous Identifier value (Valeur de l'identifiant), tapez la valeur réelle de la propriété. Par exemple, GamesTables.

      3. Choisissez Suivant.

    5. Dans la page Specify stack details (Spécifier les détails de la pile), modifiez les paramètres souhaités, puis choisissez Suivant. Un jeu de modifications est crée automatiquement.

      Important

      L'opération d'importation échoue si vous modifiez des paramètres existants qui lacent une opération de création, de mise à jour ou de suppression.

    6. Sur la TargetStackNamepage Révision, vérifiez que la bonne ressource est importée, puis choisissez Importer des ressources. Le jeu de modifications lance la dernière étape est alors automatiquement exécuté. Toutes les balises au niveau de la pile sont appliquées aux ressources importées à ce moment-là.

    7. Le panneau Événements de la page Stack details (Détails de la pile) pour votre pile parent s'affiche.

      Onglet Événements de la console.
      Note

      Il n'est pas nécessaire d'exécuter la détection de l'écart sur la pile parent après cette opération d'importation, car la ressource AWS::CloudFormation::Stack est déjà gérée par AWS CloudFormation.

Refactorisez une pile à l'aide du AWS CLI

  1. Dans le modèle de source, spécifiez un Retain DeletionPolicypour la ressource que vous souhaitez déplacer.

    Dans l'exemple de modèle source suivant, GamesTable est la cible de ce remaniement.

    Exemple 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. Mettez à jour la pile source afin d'appliquer la politique de suppression à la ressource.

    $ aws cloudformation update-stack --stack-name SourceStackName
  3. Supprimez la ressource, les paramètres associés, et les sorties du modèle source, puis ajoutez-les au modèle cible.

    Le modèle source ressemble maintenant à ce qui suit.

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

    L'exemple de modèle cible suivant a actuellement la ressource PlayersTable et contient maintenant également GamesTable.

    Exemple 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. Mettez à jour la pile source afin de supprimer la ressource GamesTable et ses paramètres et sorties associés de la pile.

    $ aws cloudformation update-stack --stack-name SourceStackName
  5. Composez une liste des ressources réelles à importer et de leurs identifiants uniques au format de chaîne JSON suivant. Pour plus d’informations, consultez Identifiants de ressources.

    [{"ResourceType":"AWS::DynamoDB::Table","LogicalResourceId":"GamesTable","ResourceIdentifier":{"TableName":"Games"}}]

    Sinon, vous pouvez spécifier les paramètres au format JSON dans un fichier de configuration.

    Par exemple, pour importerGamesTable, vous pouvez créer un fichier ResourcesToImport.txt contenant la configuration suivante.

    [ { "ResourceType":"AWS::DynamoDB::Table", "LogicalResourceId":"GamesTable", "ResourceIdentifier": { "TableName":"Games" } } ]
  6. Pour créer un ensemble de modifications, utilisez la create-change-set commande suivante et remplacez le texte de l'espace réservé. Pour l’option --change-set-type, indiquez une valeur de IMPORT. Pour l'--resources-to-importoption, remplacez l'exemple de chaîne JSON par la chaîne JSON que vous venez de créer.

    $ aws cloudformation create-change-set \ --stack-name TargetStackName --change-set-name ImportChangeSet \ --change-set-type IMPORT \ --template-body file://TemplateToImport.json \ --resources-to-import "'[{"ResourceType":"AWS::DynamoDB::Table","LogicalResourceId":"GamesTable","ResourceIdentifier":{"TableName":"Games"}}]'"
    Note

    --resources-to-importne prend pas en charge le YAML en ligne. Les conditions requises pour éviter les guillemets dans la chaîne JSON varient en fonction de votre terminal. Pour plus d'informations, consultez la section Utilisation de guillemets dans les chaînes du Guide de AWS Command Line Interface l'utilisateur.

    Vous pouvez également utiliser l'URL d'un fichier comme entrée pour l'--resources-to-importoption, comme indiqué dans l'exemple suivant.

    --resources-to-import file://ResourcesToImport.txt
  7. Vérifiez le jeu de modifications pour vous assurer que la ressource correcte est importée dans la pile cible.

    $ aws cloudformation describe-change-set \ --change-set-name ImportChangeSet
  8. Pour lancer l'ensemble de modifications et importer la ressource, utilisez la execute-change-set commande suivante et remplacez le texte de remplacement. Toutes les balises au niveau de la pile sont appliquées aux ressources importées à ce moment-là. Une fois l'opération (IMPORT_COMPLETE) terminée, la ressource est importée avec succès.

    $ aws cloudformation execute-change-set \ --change-set-name ImportChangeSet --stack-name TargetStackName
    Note

    Il n'est pas nécessaire d'exécuter la détection de l'écart sur la pile cible après cette opération d'importation car la ressource est déjà gérée par AWS CloudFormation.