

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.

# Refactorisation de piles
<a name="stack-refactoring"></a>

Grâce à la refactorisation des piles, vous pouvez réorganiser les ressources de vos CloudFormation piles tout en préservant les propriétés et les données des ressources existantes. Vous pouvez déplacer des ressources entre des piles, diviser les grandes piles en piles plus petites ou combiner plusieurs piles en une seule.

**Topics**
+ [Comment fonctionne la refactorisation de pile](#stack-refactoring-overview)
+ [Considérations sur la refactorisation des piles](#stack-refactoring-considerations)
+ [Conditions préalables](#stack-refactoring-prerequisites)
+ [Refactor Stacks (console)](#stack-refactoring-console)
+ [Piles de refactorisation ()AWS CLI](#stack-refactoring-cli)
+ [Limite de ressources](#stack-refactoring-resource-limitations)

## Comment fonctionne la refactorisation de pile
<a name="stack-refactoring-overview"></a>

La refactorisation des piles implique les phases suivantes :

1. **Évaluez votre infrastructure actuelle : passez** en revue vos CloudFormation stacks et ressources existants afin d'identifier les opportunités de refactoring des stack.

1. **Planifiez votre refactorisation** : définissez comment les ressources doivent être organisées. Tenez compte de vos dépendances, de vos conventions de dénomination et de vos limites opérationnelles. Cela peut affecter la CloudFormation validation ultérieure.

1. **Déterminez les piles de destination** : décidez dans quelles piles vous allez refactoriser les ressources. Vous pouvez déplacer des ressources entre au moins 2 piles (à l'aide de la console) et un maximum de 5 piles (à l' AWS CLI aide de). Les ressources peuvent être déplacées entre des piles imbriquées.

1. **Mettez à jour vos modèles** : modifiez vos CloudFormation modèles pour refléter le changement prévu, par exemple en déplaçant les définitions de ressources entre les modèles. Vous pouvez renommer la logique IDs au cours de ce processus.

1. **Créez le refactorisateur de pile** : fournissez une liste des noms de pile et des modèles que vous souhaitez refactoriser.

1. **Vérifiez l'impact de la refactorisation et résolvez les éventuels conflits** : CloudFormation valide les modèles que vous fournissez et vérifie les dépendances entre les piles, les types de ressources présentant des problèmes de mise à jour des balises et les conflits d'ID logique des ressources.

   Si la validation réussit, CloudFormation un aperçu des actions de refactorisation qui se produiront pendant l'exécution sera généré.

   Si la validation échoue, résolvez les problèmes identifiés et réessayez. En cas de conflit, fournissez un mappage d’ID logique de ressource indiquant la source et la destination des ressources en conflit.

1. **Exécutez la refactorisation** : après avoir vérifié que les modifications correspondent à vos objectifs de refactorisation, terminez la refactorisation de la pile.

1. **Surveiller** — Suivez l’état d’exécution pour vous assurer que l’opération se termine correctement.

## Considérations sur la refactorisation des piles
<a name="stack-refactoring-considerations"></a>

Lorsque vous refactorisez vos piles, gardez à l’esprit les points suivants :
+ La refactorisation de la pile se limite à la réorganisation des ressources existantes. Vous ne pouvez pas créer ou supprimer des ressources, modifier les configurations des ressources, ni modifier ou ajouter de nouveaux paramètres, conditions ou mappages pendant le refactoring. Pour apporter ces modifications, mettez d'abord à jour vos piles, puis effectuez la refactorisation des piles.
+ Vous ne pouvez pas refactoriser la même ressource en plusieurs piles.
+ Vous ne pouvez pas refactoriser les ressources qui font référence à des pseudo-paramètres dont les valeurs diffèrent entre les piles source et de destination, par exemple `AWS::StackName`.
+ CloudFormation ne supporte pas les piles vides. Si la refactorisation laisse une pile sans ressources, vous devez d'abord ajouter au moins une ressource à cette pile avant de l'exécuter. [create-stack-refactor](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack-refactor.html) Il peut s’agir d’une ressource simple comme `AWS::SNS::Topic` ou `AWS::CloudFormation::WaitCondition`. Par exemple :

  ```
  Resources:
    MySimpleSNSTopic:
      Type: AWS::SNS::Topic
      Properties:
        DisplayName: MySimpleTopic
  ```
+ La refactorisation des piles ne prend pas en charge les piles auxquelles sont associées des politiques de pile, indépendamment de ce que ces politiques autorisent ou refusent.

## Conditions préalables
<a name="stack-refactoring-prerequisites"></a>

Pour refactoriser les piles, vous devez déjà avoir créé les modèles révisés.

Utilisez la commande [get-template](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/get-template.html) pour récupérer les CloudFormation modèles des piles que vous souhaitez refactoriser.

```
aws cloudformation get-template --stack-name Stack1
```

Une fois que vous disposez des modèles, utilisez l’environnement de développement intégré (IDE) de votre choix pour les mettre à jour afin d’utiliser la structure et l’organisation des ressources souhaitées.

## Refactor Stacks (console)
<a name="stack-refactoring-console"></a>

Pour refactoriser les piles à l'aide de la console, procédez comme suit.

**Pour refactoriser des piles**

1. Connectez-vous à la CloudFormation console AWS Management Console et ouvrez-la à l'adresse [https://console.aws.amazon.com/cloudformation.](https://console.aws.amazon.com/cloudformation/)

1. Dans la barre de navigation en haut de l'écran, choisissez l' Région AWS emplacement de vos piles.

1. Dans le volet de navigation de gauche, choisissez **Stack refactors**.

1. Sur la page **Stack refactor**, choisissez **Start stack refactor**.

1. Dans **Description**, fournissez une description pour vous aider à identifier votre refactorisateur de pile. Ensuite, choisissez **Suivant**.

1. Pour la pile 1, procédez comme suit :

   1. Choisissez **Mettre à jour le modèle pour une pile existante** ou **Créer une nouvelle pile**.

      Si vous avez choisi **Mettre à jour le modèle pour une pile existante**, sélectionnez une pile existante dans la liste. Ou choisissez **Enter a stack ARN** pour saisir l'ARN d'une pile existante.

      Si vous avez choisi **Créer une nouvelle pile**, **saisissez le nom** de la nouvelle pile dans Nom de la pile.

   1. Sous **Remplacer le modèle existant par un modèle refactorisé**, choisissez **l'URL Amazon S3** ou **Téléversez un fichier modèle** pour télécharger le modèle souhaité pour la pile 1.

   1. Choisissez **Suivant**.

1. Pour la pile 2, procédez comme suit :

   1. Choisissez **Mettre à jour le modèle pour une pile existante** ou **Créer une nouvelle pile**.

      Si vous avez choisi **Mettre à jour le modèle pour une pile existante**, sélectionnez une pile existante dans la liste. Ou choisissez **Enter a stack ARN** pour saisir l'ARN d'une pile existante.

      Si vous avez choisi **Créer une nouvelle pile**, **saisissez le nom** de la nouvelle pile dans Nom de la pile.

   1. Sous **Remplacer le modèle existant par un modèle refactorisé, choisissez** **l'URL Amazon S3** ou **Charger le fichier modèle** pour télécharger le modèle souhaité pour la pile 2.

   1. Choisissez **Suivant**.

1. Sur la page **Spécifier les identifiants de ressources logiques renommés**, assurez-vous de savoir CloudFormation comment refactoriser les piles en mappant toutes les ressources affichées à leur logique correcte. IDs Dans le cadre du refactor de pile, si la logique d'une ressource a IDs été modifiée, vous devez spécifier comment elle a été renommée en fournissant le nom de la pile source, l'ID logique d'origine, le nom de la pile de destination et l'ID logique renommé. Dans certains cas, la CloudFormation console peut détecter automatiquement le mappage des ressources, et vous pouvez simplement vérifier que le mappage des ressources prérempli est correct avant de continuer.

1. Choisissez **Suivant**.

1. Sur la page **Révision et exécution**, passez en revue toutes les sélections effectuées lors des étapes précédentes et vérifiez que tout est correctement configuré.

1. Lorsque vous êtes prêt à refactoriser les piles, choisissez **Execute stack** refactor.

## Piles de refactorisation ()AWS CLI
<a name="stack-refactoring-cli"></a>

Les AWS CLI commandes de refactorisation des piles incluent :
+ [create-stack-refactor](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack-refactor.html)pour valider et générer un aperçu des modifications prévues.
+ [describe-stack-refactor](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-refactor.html)pour récupérer le statut et les détails d'une opération de refactorisation de pile. 
+ [execute-stack-refactor](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/execute-stack-refactor.html)pour terminer l'opération de refactorisation de pile validée. 
+ [list-stack-refactors](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-stack-refactors.html)pour répertorier toutes les opérations de refactoring de stack de votre compte avec leur statut actuel et des informations de base. 
+ [list-stack-refactor-actions](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-stack-refactor-actions.html)pour afficher un aperçu des actions spécifiques qui CloudFormation seront effectuées sur chaque pile et ressource lors de l'exécution du refactoring. 

Utilisez la procédure suivante pour refactoriser une pile à l’aide de AWS CLI. 

**Pour refactoriser des piles**

1. Utilisez la [create-stack-refactor](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack-refactor.html)commande et fournissez les noms des piles et les modèles mis à jour pour les piles à refactoriser. Incluez l'`--enable-stack-creation`option permettant CloudFormation de créer de nouvelles piles si elles n'existent pas déjà. 

   ```
   aws cloudformation create-stack-refactor \
     --stack-definitions \
       StackName=Stack1,TemplateBody@=file://template1-updated.yaml \
       StackName=Stack2,TemplateBody@=file://template2-updated.yaml \
     --enable-stack-creation
   ```

   La commande renvoie un `StackRefactorId` que vous utiliserez ultérieurement.

   ```
   {
       "StackRefactorId": "9c384f70-4e07-4ed7-a65d-fee5eb430841"
   }
   ```

   Si des conflits sont détectés lors de la validation du modèle (ce que vous pourrez confirmer à l'étape suivante), utilisez la [create-stack-refactor](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/create-stack-refactor.html)commande avec l'`--resource-mappings`option.

   ```
   aws cloudformation create-stack-refactor \
     --stack-definitions \
       StackName=Stack1,TemplateBody@=file://template1-updated.yaml \
       StackName=Stack2,TemplateBody@=file://template2-updated.yaml \
     --enable-stack-creation \ 
     --resource-mappings file://resource-mapping.json
   ```

   Voici un exemple de fichier `resource-mapping.json`.

   ```
   [
       {
           "Source": {
               "StackName": "Stack1",
               "LogicalResourceId": "MySNSTopic"
           },
           "Destination": {
               "StackName": "Stack2",
               "LogicalResourceId": "MyLambdaSNSTopic"
           }
       }
   ]
   ```

1. Utilisez la [describe-stack-refactor](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-refactor.html)commande pour vous assurer que `Status` c'est le cas`CREATE_COMPLETE`. Cela permet de vérifier que la validation est terminée.

   ```
   aws cloudformation describe-stack-refactor \
     --stack-refactor-id 9c384f70-4e07-4ed7-a65d-fee5eb430841
   ```

   Exemple de sortie :

   ```
   {
       "StackRefactorId": "9c384f70-4e07-4ed7-a65d-fee5eb430841",
       "StackIds": [
           "arn:aws:cloudformation:us-east-1:123456789012:stack/Stack1/3e6a1ff0-94b1-11f0-aa6f-0a88d2e03acf",
           "arn:aws:cloudformation:us-east-1:123456789012:stack/Stack2/5da91650-94b1-11f0-81cf-0a23500e151b"
       ],
       "ExecutionStatus": "AVAILABLE",
       "Status": "CREATE_COMPLETE"
   }
   ```

1. Utilisez la [list-stack-refactor-actions](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/list-stack-refactor-actions.html)commande pour prévisualiser les actions spécifiques qui seront effectuées.

   ```
   aws cloudformation list-stack-refactor-actions \
     --stack-refactor-id 9c384f70-4e07-4ed7-a65d-fee5eb430841
   ```

   Exemple de sortie :

   ```
   {
       "StackRefactorActions": [
           {
               "Action": "MOVE",
               "Entity": "RESOURCE",
               "PhysicalResourceId": "MyTestLambdaRole",
               "Description": "No configuration changes detected.",
               "Detection": "AUTO",
               "TagResources": [],
               "UntagResources": [],
               "ResourceMapping": {
                   "Source": {
                       "StackName": "arn:aws:cloudformation:us-east-1:123456789012:stack/Stack1/3e6a1ff0-94b1-11f0-aa6f-0a88d2e03acf",
                       "LogicalResourceId": "MyLambdaRole"
                   },
                   "Destination": {
                       "StackName": "arn:aws:cloudformation:us-east-1:123456789012:stack/Stack2/5da91650-94b1-11f0-81cf-0a23500e151b",
                       "LogicalResourceId": "MyLambdaRole"
                   }
               }
           },
           {
               "Action": "MOVE",
               "Entity": "RESOURCE",
               "PhysicalResourceId": "MyTestFunction",
               "Description": "Resource configuration changes will be validated during refactor execution.",
               "Detection": "AUTO",
               "TagResources": [
                   {
                       "Key": "aws:cloudformation:stack-name",
                       "Value": "Stack2"
                   },
                   {
                       "Key": "aws:cloudformation:logical-id",
                       "Value": "MyFunction"
                   },
                   {
                       "Key": "aws:cloudformation:stack-id",
                       "Value": "arn:aws:cloudformation:us-east-1:123456789012:stack/Stack2/5da91650-94b1-11f0-81cf-0a23500e151b"
                   }
               ],
               "UntagResources": [
                   "aws:cloudformation:stack-name",
                   "aws:cloudformation:logical-id",
                   "aws:cloudformation:stack-id"
               ],
               "ResourceMapping": {
                   "Source": {
                       "StackName": "arn:aws:cloudformation:us-east-1:123456789012:stack/Stack1/3e6a1ff0-94b1-11f0-aa6f-0a88d2e03acf",
                       "LogicalResourceId": "MyFunction"
                   },
                   "Destination": {
                       "StackName": "arn:aws:cloudformation:us-east-1:123456789012:stack/Stack2/5da91650-94b1-11f0-81cf-0a23500e151b",
                       "LogicalResourceId": "MyFunction"
                   }
               }
           }
       ]
   }
   ```

1. Après avoir examiné et confirmé vos modifications, utilisez la [execute-stack-refactor](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/execute-stack-refactor.html)commande pour terminer l'opération de refactorisation de la pile.

   ```
   aws cloudformation execute-stack-refactor \
     --stack-refactor-id 9c384f70-4e07-4ed7-a65d-fee5eb430841
   ```

1. Utilisez la [describe-stack-refactor](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-refactor.html)commande pour surveiller l'état d'exécution.

   ```
   aws cloudformation describe-stack-refactor \
     --stack-refactor-id 9c384f70-4e07-4ed7-a65d-fee5eb430841
   ```

   Exemple de sortie :

   ```
   {
       "StackRefactorId": "9c384f70-4e07-4ed7-a65d-fee5eb430841",
       "StackIds": [
           "arn:aws:cloudformation:us-east-1:123456789012:stack/Stack1/3e6a1ff0-94b1-11f0-aa6f-0a88d2e03acf",
           "arn:aws:cloudformation:us-east-1:123456789012:stack/Stack2/5da91650-94b1-11f0-81cf-0a23500e151b"
       ],
       "ExecutionStatus": "SUCCEEDED",
       "Status": "COMPLETE"
   }
   ```

## Limite de ressources
<a name="stack-refactoring-resource-limitations"></a>
+ La refactorisation de pile ne prend en charge que les types de ressources avec un `provisioningType` sur `FULLY_MUTABLE`, que vous pouvez vérifier à l’aide de la commande [describe-type](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-type.html). 
+ CloudFormation validera l'éligibilité des ressources lors de la création du refactoriseur et signalera toutes les ressources non prises en charge dans le résultat de la [describe-stack-refactor](https://docs.aws.amazon.com/cli/latest/reference/cloudformation/describe-stack-refactor.html)commande. 
+ Les ressources suivantes ne sont pas prises en charge pour la refactorisation des piles :
  + `AWS::ACMPCA::Certificate`
  + `AWS::ACMPCA::CertificateAuthority`
  + `AWS::ACMPCA::CertificateAuthorityActivation`
  + `AWS::ApiGateway::BasePathMapping`
  + `AWS::ApiGateway::Method`
  + `AWS::AppConfig::ConfigurationProfile`
  + `AWS::AppConfig::Deployment`
  + `AWS::AppConfig::Environment`
  + `AWS::AppConfig::Extension`
  + `AWS::AppConfig::ExtensionAssociation`
  + `AWS::AppStream::DirectoryConfig`
  + `AWS::AppStream::StackFleetAssociation`
  + `AWS::AppStream::StackUserAssociation`
  + `AWS::AppStream::User`
  + `AWS::BackupGateway::Hypervisor`
  + `AWS::CertificateManager::Certificate`
  + `AWS::CloudFormation::CustomResource`
  + `AWS::CloudFormation::Macro`
  + `AWS::CloudFormation::WaitCondition`
  + `AWS::CloudFormation::WaitConditionHandle`
  + `AWS::CodeDeploy::DeploymentGroup`
  + `AWS::CodePipeline::CustomActionType`
  + `AWS::Cognito::UserPoolRiskConfigurationAttachment`
  + `AWS::Cognito::UserPoolUICustomizationAttachment`
  + `AWS::Cognito::UserPoolUserToGroupAttachment`
  + `AWS::Config::ConfigRule`
  + `AWS::Config::ConfigurationRecorder`
  + `AWS::Config::DeliveryChannel`
  + `AWS::DataBrew::Dataset`
  + `AWS::DataBrew::Job`
  + `AWS::DataBrew::Project`
  + `AWS::DataBrew::Recipe`
  + `AWS::DataBrew::Ruleset`
  + `AWS::DataBrew::Schedule`
  + `AWS::DataZone::DataSource`
  + `AWS::DataZone::Environment`
  + `AWS::DataZone::EnvironmentBlueprintConfiguration`
  + `AWS::DataZone::EnvironmentProfile`
  + `AWS::DataZone::Project`
  + `AWS::DataZone::SubscriptionTarget`
  + `AWS::DirectoryService::MicrosoftAD`
  + `AWS::DynamoDB::GlobalTable`
  + `AWS::EC2::CustomerGateway`
  + `AWS::EC2::EIP`
  + `AWS::EC2::LaunchTemplate`
  + `AWS::EC2::NetworkInterfacePermission`
  + `AWS::EC2::PlacementGroup`
  + `AWS::EC2::SpotFleet`
  + `AWS::EC2::VPCDHCPOptionsAssociation`
  + `AWS::EC2::VolumeAttachment`
  + `AWS::EMR::Cluster`
  + `AWS::EMR::InstanceFleetConfig`
  + `AWS::EMR::InstanceGroupConfig`
  + `AWS::ElastiCache::CacheCluster`
  + `AWS::ElastiCache::ReplicationGroup`
  + `AWS::ElastiCache::SecurityGroup`
  + `AWS::ElastiCache::SecurityGroupIngress`
  + `AWS::ElasticBeanstalk::ConfigurationTemplate`
  + `AWS::ElasticLoadBalancing::LoadBalancer`
  + `AWS::ElasticLoadBalancingV2::ListenerCertificate`
  + `AWS::Elasticsearch::Domain`
  + `AWS::FIS::ExperimentTemplate`
  + `AWS::Glue::Schema`
  + `AWS::GuardDuty::IPSet`
  + `AWS::GuardDuty::PublishingDestination`
  + `AWS::GuardDuty::ThreatIntelSet`
  + `AWS::IAM::AccessKey`
  + `AWS::IAM::UserToGroupAddition`
  + `AWS::ImageBuilder::Component`
  + `AWS::IoT::PolicyPrincipalAttachment`
  + `AWS::IoT::ThingPrincipalAttachment`
  + `AWS::IoTFleetWise::Campaign`
  + `AWS::IoTWireless::WirelessDeviceImportTask`
  + `AWS::Lambda::EventInvokeConfig`
  + `AWS::Lex::BotVersion`
  + `AWS::M2::Application`
  + `AWS::MSK::Configuration`
  + `AWS::MSK::ServerlessCluster`
  + `AWS::Maester::DocumentType`
  + `AWS::MediaTailor::Channel`
  + `AWS::NeptuneGraph::PrivateGraphEndpoint`
  + `AWS::Omics::AnnotationStore`
  + `AWS::Omics::ReferenceStore`
  + `AWS::Omics::SequenceStore`
  + `AWS::OpenSearchServerless::Collection`
  + `AWS::OpsWorks::App`
  + `AWS::OpsWorks::ElasticLoadBalancerAttachment`
  + `AWS::OpsWorks::Instance`
  + `AWS::OpsWorks::Layer`
  + `AWS::OpsWorks::Stack`
  + `AWS::OpsWorks::UserProfile`
  + `AWS::OpsWorks::Volume`
  + `AWS::PCAConnectorAD::Connector`
  + `AWS::PCAConnectorAD::DirectoryRegistration`
  + `AWS::PCAConnectorAD::Template`
  + `AWS::PCAConnectorAD::TemplateGroupAccessControlEntry`
  + `AWS::Panorama::PackageVersion`
  + `AWS::QuickSight::Theme`
  + `AWS::RDS::DBSecurityGroup`
  + `AWS::RDS::DBSecurityGroupIngress`
  + `AWS::Redshift::ClusterSecurityGroup`
  + `AWS::Redshift::ClusterSecurityGroupIngress`
  + `AWS::RefactorSpaces::Environment`
  + `AWS::RefactorSpaces::Route`
  + `AWS::RefactorSpaces::Service`
  + `AWS::RoboMaker::RobotApplication`
  + `AWS::RoboMaker::SimulationApplication`
  + `AWS::Route53::RecordSet`
  + `AWS::Route53::RecordSetGroup`
  + `AWS::SDB::Domain`
  + `AWS::SageMaker::InferenceComponen`
  + `AWS::ServiceCatalog::PortfolioPrincipalAssociation`
  + `AWS::ServiceCatalog::PortfolioProductAssociation`
  + `AWS::ServiceCatalog::PortfolioShare`
  + `AWS::ServiceCatalog::TagOptionAssociation`
  + `AWS::ServiceCatalogAppRegistry::AttributeGroupAssociation`
  + `AWS::ServiceCatalogAppRegistry::ResourceAssociation`
  + `AWS::StepFunctions::StateMachineVersion`
  + `AWS::Synthetics::Canary`
  + `AWS::VoiceID::Domain`
  + `AWS::WAF::ByteMatchSet`
  + `AWS::WAF::IPSet`
  + `AWS::WAF::Rule`
  + `AWS::WAF::SizeConstraintSet`
  + `AWS::WAF::SqlInjectionMatchSet`
  + `AWS::WAF::WebACL`
  + `AWS::WAF::XssMatchSet`
  + `AWS::WAFv2::IPSet`
  + `AWS::WAFv2::RegexPatternSet`
  + `AWS::WAFv2::RuleGroup`
  + `AWS::WAFv2::WebACL`
  + `AWS::WorkSpaces::Workspace`