Refactorisation des piles - 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.

Refactorisation des piles

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 pile.

Comment fonctionne le stack refactoring

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.

  2. 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.

  3. 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 et un maximum de 5 piles. Les ressources peuvent être déplacées entre des piles imbriquées.

  4. 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.

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

  6. 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.

  7. Exécuter le refactoring : après avoir confirmé que les modifications correspondent à vos objectifs de refactorisation, terminez le refactoring de la pile.

  8. Surveiller — Suivez l'état d'exécution pour vous assurer que l'opération se termine correctement.

Considérations relatives à la refactorisation des piles

Lorsque vous refactorisez vos piles, gardez les points suivants à l'esprit :

  • Les opérations de refactorisation n'autorisent pas la création de nouvelles ressources, la suppression de ressources ou la modification de la configuration des ressources.

  • Vous ne pouvez pas modifier ou ajouter de nouveaux paramètres, conditions ou mappages lors d'un refactoring de pile. Une solution possible consiste à mettre à jour votre pile avant d'effectuer le refactoring.

  • 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 Il peut s'agir d'une ressource simple comme AWS::SNS::Topic ouAWS::CloudFormation::WaitCondition. Par exemple :

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

AWS CLI commandes pour la refactorisation des piles

Les AWS CLI commandes de refactorisation des piles incluent :

  • create-stack-refactorpour valider et générer un aperçu des modifications prévues.

  • describe-stack-refactorpour récupérer le statut et les détails d'une opération de refactorisation de pile.

  • execute-stack-refactorpour terminer l'opération de refactorisation de pile validée.

  • get-template pour récupérer le modèle d'une pile existante.

  • list-stack-refactorspour 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-actionspour 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.

Refactorisez une pile à l'aide du AWS CLI

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

  1. Utilisez la commande get-template pour récupérer les CloudFormation modèles des piles que vous souhaitez refactoriser.

    aws cloudformation get-template --stack-name Stack1

    Lorsque 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.

  2. Utilisez la create-stack-refactorcommande et fournissez les noms des piles et les modèles mis à jour pour les piles à refactoriser. Incluez l'--enable-stack-creationoption 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-refactorcommande avec l'--resource-mappingsoption.

    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" } } ]
  3. Utilisez la describe-stack-refactorcommande pour vous assurer que Status c'est le casCREATE_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" }
  4. Utilisez la list-stack-refactor-actionscommande 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" } } } ] }
  5. Après avoir examiné et confirmé vos modifications, utilisez la execute-stack-refactorcommande pour terminer l'opération de refactorisation de la pile.

    aws cloudformation execute-stack-refactor \ --stack-refactor-id 9c384f70-4e07-4ed7-a65d-fee5eb430841
  6. Utilisez la describe-stack-refactorcommande 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" }

Limitations des ressources

  • La refactorisation des piles ne prend en charge que les types de ressources avec un provisioningType deFULLY_MUTABLE, que vous pouvez vérifier à l'aide de la commande describe-type.

  • 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-refactorcommande.

  • 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::LaunchTemplate

    • AWS::EC2::NetworkInterfacePermission

    • 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::InferenceComponent

    • 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