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 los recursos entre al menos 2 pilas (mediante la consola) y un máximo de 5 pilas (mediante la AWS CLI). 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:
-
La refactorización de pilas se limita a reorganizar los recursos existentes. No puede crear ni eliminar recursos, modificar las configuraciones de los recursos ni cambiar o agregar nuevos parámetros, condiciones o asignaciones durante la refactorización. Para realizar estos cambios, actualice primero las pilas y, a continuación, realice la refactorización de las pilas.
-
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.
Requisitos previos
Para refactorizar las pilas, debe haber creado ya las plantillas revisadas.
Utilice el comando get-template para recuperar las plantillas de CloudFormation de las pilas que desee refactorizar.
aws cloudformation get-template --stack-nameStack1
Una 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.
Refactorización de las pilas (consola)
Utilice el siguiente procedimiento para refactorizar una pila mediante la consola.
Refactorización de las pilas
Inicie sesión en la Consola de administración de AWS y abra la consola de CloudFormation en https://console.aws.amazon.com/cloudformation
. -
En la barra de navegación de la parte superior de la pantalla, elija la Región de AWS en donde se encuentran las pilas.
-
En el panel de navegación de la izquierda, seleccione Refactorizaciones de la pila.
-
En la página de refactorizaciones de la pila, seleccione Iniciar la refactorización de la pila.
-
En Descripción, proporcione una descripción que lo ayude a identificar la refactorización de la pila. A continuación, elija Siguiente.
-
Para la pila 1, haga lo siguiente:
-
Elija Actualizar la plantilla para una pila existente o Crear una pila nueva.
Si seleccionó Actualizar la plantilla para una pila existente, seleccione una pila existente de la lista. O elija Introducir un ARN de pila para introducir el ARN de una pila existente.
Si seleccionó Crear nueva pila, en Nombre de pila, proporcione un nombre para la nueva pila.
-
En Reemplazar una plantilla existente por una plantilla refactorizada, seleccione URL de Amazon S3 o Cargar un archivo de plantilla para cargar la plantilla deseada para la pila 1.
-
Elija Siguiente.
-
-
Para la pila 2, haga lo siguiente:
-
Elija Actualizar la plantilla para una pila existente o Crear una pila nueva.
Si seleccionó Actualizar la plantilla para una pila existente, seleccione una pila existente de la lista. O elija Introducir un ARN de pila para introducir el ARN de una pila existente.
Si seleccionó Crear nueva pila, en Nombre de pila, proporcione un nombre para la nueva pila.
-
En Reemplazar la plantilla existente por una plantilla refactorizada, seleccione URL de Amazon S3 o Cargar archivo de plantilla para cargar la plantilla deseada para la pila 2.
-
Elija Siguiente.
-
-
En la página Especificar los cambios de nombre de los ID de los recursos lógicos, asegúrese de que CloudFormation sepa cómo refactorizar las pilas asignando los recursos que se muestran a sus ID lógicos correctos. Como parte de la refactorización de la pila, si se ha cambiado el ID lógico de algún recurso, debe especificar el nombre de la pila de origen, el ID lógico original, el nombre de la pila de destino y el ID lógico al que se le ha cambiado el nombre. En algunos casos, es posible que la consola de CloudFormation detecte automáticamente la asignación de recursos y, antes de continuar, solo tiene que comprobar que la asignación de recursos rellenada previamente es correcta.
-
Elija Siguiente.
-
En la página Revisar y ejecutar, revise todas las selecciones de los pasos anteriores y confirme que todo está configurado correctamente.
-
Cuando tenga todo listo para refactorizar las pilas, elija Ejecutar la refactorización de la pila.
Refactorización de las pilas (AWS CLI)
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.
-
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.
Utilice el siguiente procedimiento para crear una pila mediante la AWS CLI.
Refactorización de las pilas
-
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 código 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 código 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 código 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