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::Topic
oAWS::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-name
Stack1
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.
-
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-creation
para 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
StackRefactorId
que 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.json
A 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
Status
seaCREATE_COMPLETE
. Esto verifica que la validación esté completa.aws cloudformation describe-stack-refactor \ --stack-refactor-id
9c384f70-4e07-4ed7-a65d-fee5eb430841
Ejemplo 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-id
9c384f70-4e07-4ed7-a65d-fee5eb430841
Ejemplo 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-id
9c384f70-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-id
9c384f70-4e07-4ed7-a65d-fee5eb430841
Ejemplo 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
provisioningType
deFULLY_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::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