Refactorización de pilas
Con la refactorización de pilas, puede reorganizar los recursos de las pilas de CloudFormation y, al mismo tiempo, conservar las propiedades y los datos de los recursos existentes. Puede mover recursos entre pilas, dividir pilas grandes en pilas más pequeñas o combinar varias pilas en una sola.
Temas
Cómo funciona la refactorización de pilas
La refactorización de las pilas implica estas fases:
-
Evaluación de su infraestructura actual: revise sus pilas y recursos de CloudFormation existentes para identificar las oportunidades de refactorización de pilas.
-
Planificación de su refactorización: defina cómo deben organizarse los recursos. Tenga en cuenta las dependencias, las convenciones de nomenclatura y los límites operativos. Esto puede afectar a la validación de CloudFormation más adelante.
-
Determinación de las pilas de destino: decida en qué pilas refactorizará los recursos. Puede mover el recurso entre al menos 2 pilas y un máximo de 5 pilas. Los recursos se pueden mover entre pilas anidadas.
-
Actualice las plantillas: modifique las plantillas de CloudFormation para que reflejen el cambio planificado, como mover las definiciones de recursos entre plantillas. Puede cambiar el nombre de los ID lógicos durante este proceso.
-
Cree la refactorización de la pila: proporcione una lista de los nombres y plantillas de la pila que desee refactorizar.
-
Revise el impacto de la refactorización y resuelva cualquier conflicto: CloudFormation valida las plantillas que proporciona y comprueba las dependencias entre pilas, los tipos de recursos con problemas de actualización de etiquetas y los conflictos de ID lógicos de los recursos.
Si la validación se realiza correctamente, CloudFormation generará una vista previa de las acciones de refactorización que se llevarán a cabo durante la ejecución.
Si la validación falla, resuelva los problemas identificados y vuelva a intentarlo. Si hay conflictos, proporcione una asignación de ID lógica del recurso que muestre el origen y el destino del recurso en conflicto.
-
Ejecute la refactorización: después de confirmar que los cambios se alinean con los objetivos de refactorización, complete la refactorización de la pila.
-
Supervise: realice un seguimiento del estado de ejecución para garantizar que la operación se complete correctamente.
Consideraciones de la refactorización de pilas
Al refactorizar las pilas, tenga en cuenta lo siguiente:
-
Las operaciones de refactorización no permiten nuevas creaciones de recursos, eliminaciones de recursos ni cambios en las configuraciones de recursos.
-
No puede cambiar ni agregar nuevos parámetros, condiciones o asignaciones durante la refactorización de una pila. Una posible solución alternativa es actualizar la pila antes de realizar la refactorización.
-
No puede refactorizar el mismo recurso en varias pilas.
-
No puede refactorizar los recursos que hacen referencia a pseudoparámetros cuyos valores difieren entre las pilas de origen y destino, por ejemplo,
AWS::StackName. -
CloudFormation no admite pilas vacías. Si la refactorización deja una pila sin recursos, primero debe añadir al menos un recurso a esa pila antes de ejecutar create-stack-refactor. Puede ser un recurso simple como
AWS::SNS::TopicoAWS::CloudFormation::WaitCondition. Por ejemplo:Resources: MySimpleSNSTopic: Type: AWS::SNS::Topic Properties: DisplayName: MySimpleTopic -
La refactorización de pilas no admite pilas que tengan políticas de apilamiento adjuntas, independientemente de lo que las políticas permitan o denieguen.
Comandos de la AWS CLI para la refactorización de pilas
Los comandos de la AWS CLI para la refactorización de pilas incluyen:
-
create-stack-refactor para validar y generar una vista previa de los cambios planificados.
-
describe-stack-refactor para recuperar el estado y los detalles de una operación de refactorización de pilas.
-
execute-stack-refactor para completar la operación de refactorización de pilas validada.
-
get-template para recuperar la plantilla de una pila existente.
-
list-stack-refactors para enumerar todas las operaciones de refactorización de pilas de su cuenta con su estado actual e información básica.
-
list-stack-refactor-actions para mostrar una vista previa de las acciones específicas que CloudFormation realizará en cada pila y recurso durante la ejecución de la refactorización.
Refactorización de una pila mediante la AWS CLI
Utilice el siguiente procedimiento para crear una pila mediante la AWS CLI.
-
Utilice el comando get-template para recuperar las plantillas de CloudFormation de las pilas que desee refactorizar.
aws cloudformation get-template --stack-nameStack1Una vez que tenga la plantilla, utilice el entorno de desarrollo integrado (IDE) que prefiera para actualizarla y utilizar la estructura y la organización de recursos deseadas.
-
Utilice el comando create-stack-refactor y proporcione los nombres de las pilas y las plantillas actualizadas para la refactorización de pilas. Incluya la opción
--enable-stack-creationpara permitir que CloudFormation cree pilas nuevas si aún no existen.aws cloudformation create-stack-refactor \ --stack-definitions \ StackName=Stack1,TemplateBody@=file://template1-updated.yaml\ StackName=Stack2,TemplateBody@=file://template2-updated.yaml\ --enable-stack-creationEl comando devuelve un
StackRefactorIdque utilizará en pasos posteriores.{ "StackRefactorId": "9c384f70-4e07-4ed7-a65d-fee5eb430841" }Si se detectan conflictos durante la validación de la plantilla (lo cual puede confirmar en el siguiente paso), utilice el comando create-stack-refactor con la opción
--resource-mappings.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-mappingsfile://resource-mapping.jsonA continuación se muestra un ejemplo de un archivo
resource-mapping.json.[ { "Source": { "StackName": "Stack1", "LogicalResourceId": "MySNSTopic" }, "Destination": { "StackName": "Stack2", "LogicalResourceId": "MyLambdaSNSTopic" } } ] -
Utilice el comando describe-stack-refactor para asegurarse de que
StatusseaCREATE_COMPLETE. Esto verifica que la validación esté completa.aws cloudformation describe-stack-refactor \ --stack-refactor-id9c384f70-4e07-4ed7-a65d-fee5eb430841Ejemplo de salida:
{ "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" } -
Utilice el comando list-stack-refactor-actions para obtener una vista previa de las acciones específicas que se van a realizar.
aws cloudformation list-stack-refactor-actions \ --stack-refactor-id9c384f70-4e07-4ed7-a65d-fee5eb430841Ejemplo de salida:
{ "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" } } } ] } -
Tras revisar y confirmar los cambios, utilice el comando execute-stack-refactor para completar la operación de refactorización de pilas.
aws cloudformation execute-stack-refactor \ --stack-refactor-id9c384f70-4e07-4ed7-a65d-fee5eb430841 -
Utilice el comando describe-stack-refactor para supervisar el estado de la ejecución.
aws cloudformation describe-stack-refactor \ --stack-refactor-id9c384f70-4e07-4ed7-a65d-fee5eb430841Ejemplo de salida:
{ "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" }
Limitaciones de recursos
-
La refactorización de pilas solo admite los tipos de recursos con un
provisioningTypedeFULLY_MUTABLE, lo que puede comprobar con el comando describe-type. -
CloudFormation validará la elegibilidad de los recursos durante la creación de la refactorización e informará de cualquier recurso no compatible en la salida del comando describe-stack-refactor.
-
Los siguientes recursos no son compatibles con la refactorización de pilas:
AWS::ACMPCA::CertificateAWS::ACMPCA::CertificateAuthorityAWS::ACMPCA::CertificateAuthorityActivationAWS::ApiGateway::BasePathMappingAWS::ApiGateway::MethodAWS::AppConfig::ConfigurationProfileAWS::AppConfig::DeploymentAWS::AppConfig::EnvironmentAWS::AppConfig::ExtensionAWS::AppConfig::ExtensionAssociationAWS::AppStream::DirectoryConfigAWS::AppStream::StackFleetAssociationAWS::AppStream::StackUserAssociationAWS::AppStream::UserAWS::BackupGateway::HypervisorAWS::CertificateManager::CertificateAWS::CloudFormation::CustomResourceAWS::CloudFormation::MacroAWS::CloudFormation::WaitConditionAWS::CloudFormation::WaitConditionHandleAWS::CodeDeploy::DeploymentGroupAWS::CodePipeline::CustomActionTypeAWS::Cognito::UserPoolRiskConfigurationAttachmentAWS::Cognito::UserPoolUICustomizationAttachmentAWS::Cognito::UserPoolUserToGroupAttachmentAWS::Config::ConfigRuleAWS::Config::ConfigurationRecorderAWS::Config::DeliveryChannelAWS::DataBrew::DatasetAWS::DataBrew::JobAWS::DataBrew::ProjectAWS::DataBrew::RecipeAWS::DataBrew::RulesetAWS::DataBrew::ScheduleAWS::DataZone::DataSourceAWS::DataZone::EnvironmentAWS::DataZone::EnvironmentBlueprintConfigurationAWS::DataZone::EnvironmentProfileAWS::DataZone::ProjectAWS::DataZone::SubscriptionTargetAWS::DirectoryService::MicrosoftADAWS::DynamoDB::GlobalTableAWS::EC2::LaunchTemplateAWS::EC2::NetworkInterfacePermissionAWS::EC2::SpotFleetAWS::EC2::VPCDHCPOptionsAssociationAWS::EC2::VolumeAttachmentAWS::EMR::ClusterAWS::EMR::InstanceFleetConfigAWS::EMR::InstanceGroupConfigAWS::ElastiCache::CacheClusterAWS::ElastiCache::ReplicationGroupAWS::ElastiCache::SecurityGroupAWS::ElastiCache::SecurityGroupIngressAWS::ElasticBeanstalk::ConfigurationTemplateAWS::ElasticLoadBalancing::LoadBalancerAWS::ElasticLoadBalancingV2::ListenerCertificateAWS::Elasticsearch::DomainAWS::FIS::ExperimentTemplateAWS::Glue::SchemaAWS::GuardDuty::IPSetAWS::GuardDuty::PublishingDestinationAWS::GuardDuty::ThreatIntelSetAWS::IAM::AccessKeyAWS::IAM::UserToGroupAdditionAWS::ImageBuilder::ComponentAWS::IoT::PolicyPrincipalAttachmentAWS::IoT::ThingPrincipalAttachmentAWS::IoTFleetWise::CampaignAWS::IoTWireless::WirelessDeviceImportTaskAWS::Lambda::EventInvokeConfigAWS::Lex::BotVersionAWS::M2::ApplicationAWS::MSK::ConfigurationAWS::MSK::ServerlessClusterAWS::Maester::DocumentTypeAWS::MediaTailor::ChannelAWS::NeptuneGraph::PrivateGraphEndpointAWS::Omics::AnnotationStoreAWS::Omics::ReferenceStoreAWS::Omics::SequenceStoreAWS::OpenSearchServerless::CollectionAWS::OpsWorks::AppAWS::OpsWorks::ElasticLoadBalancerAttachmentAWS::OpsWorks::InstanceAWS::OpsWorks::LayerAWS::OpsWorks::StackAWS::OpsWorks::UserProfileAWS::OpsWorks::VolumeAWS::PCAConnectorAD::ConnectorAWS::PCAConnectorAD::DirectoryRegistrationAWS::PCAConnectorAD::TemplateAWS::PCAConnectorAD::TemplateGroupAccessControlEntryAWS::Panorama::PackageVersionAWS::QuickSight::ThemeAWS::RDS::DBSecurityGroupAWS::RDS::DBSecurityGroupIngressAWS::Redshift::ClusterSecurityGroupAWS::Redshift::ClusterSecurityGroupIngressAWS::RefactorSpaces::EnvironmentAWS::RefactorSpaces::RouteAWS::RefactorSpaces::ServiceAWS::RoboMaker::RobotApplicationAWS::RoboMaker::SimulationApplicationAWS::Route53::RecordSetAWS::Route53::RecordSetGroupAWS::SDB::DomainAWS::SageMaker::InferenceComponenAWS::ServiceCatalog::PortfolioPrincipalAssociationAWS::ServiceCatalog::PortfolioProductAssociationAWS::ServiceCatalog::PortfolioShareAWS::ServiceCatalog::TagOptionAssociationAWS::ServiceCatalogAppRegistry::AttributeGroupAssociationAWS::ServiceCatalogAppRegistry::ResourceAssociationAWS::StepFunctions::StateMachineVersionAWS::Synthetics::CanaryAWS::VoiceID::DomainAWS::WAF::ByteMatchSetAWS::WAF::IPSetAWS::WAF::RuleAWS::WAF::SizeConstraintSetAWS::WAF::SqlInjectionMatchSetAWS::WAF::WebACLAWS::WAF::XssMatchSetAWS::WAFv2::IPSetAWS::WAFv2::RegexPatternSetAWS::WAFv2::RuleGroupAWS::WAFv2::WebACLAWS::WorkSpaces::Workspace