Refatoração de pilhas
Com a refatoração de pilhas, é possível reorganizar os recursos em suas pilhas do CloudFormation enquanto preserva as propriedades e os dados dos recursos existentes. É possível mover recursos entre pilhas, dividir pilhas grandes em pilhas menores ou combinar várias pilhas em uma única pilha.
Tópicos
Como a refatoração de pilhas funciona
A refatoração de pilhas envolve as seguintes fases:
-
Avaliação da infraestrutura atual: analise suas pilhas e recursos existentes do CloudFormation para identificar oportunidades de refatoração de pilhas.
-
Planejamento da refatoração: defina como os recursos devem ser organizados. Considere suas dependências, convenções de nomenclatura e limites operacionais. Isso pode afetar a validação do CloudFormation posteriormente.
-
Determinção das pilhas de destino: decida em quais pilhas você refatorará os recursos. Você pode mover recursos entre pelo menos duas pilhas (usando o console) e no máximo cinco pilhas (usando a AWS CLI). Os recursos podem ser movidos entre pilhas aninhadas.
-
Atualização de modelos: altere seus modelos do CloudFormation para refletir a alteração planejada, como mover definições de recursos entre modelos. É possível renomear IDs lógicos durante esse processo.
-
Criação da refatoração de pilhas: forneça uma lista dos nomes e modelos da pilha que você deseja refatorar.
-
Análise do impacto da refatoração em sua infraestrutura e resolução de quaisquer conflitos: o CloudFormation valida os modelos fornecidos por você e verifica dependências entre pilhas, tipos de recursos com problemas de atualização de tags e conflitos de ID lógico de recursos.
Se a validação for bem-sucedida, o CloudFormation gerará uma prévia das ações de refatoração que ocorrerão após a execução.
Se a validação falhar, resolva os problemas identificados e tente novamente. Em caso de conflitos, forneça um mapeamento de ID lógico de recurso que mostre a origem e o destino dos recursos conflitantes.
-
Execução da refatoração: após confirmar se as alterações estão alinhadas com suas metas de refatoração, conclua a refatoração da pilha.
-
Monitoramento: acompanhe o status da execução para garantir que a operação seja concluída com êxito.
Considerações sobre refatoração de pilhas
Ao refatorar suas pilhas, lembre-se do seguinte:
-
A refatoração da pilha se limita à reorganização dos recursos existentes. Você não pode criar ou excluir recursos, modificar configurações de recursos ou alterar ou adicionar novos parâmetros, condições ou mapeamentos durante a refatoração. Para fazer essas alterações, primeiro atualize suas pilhas e, em seguida, realize a refatoração da pilha.
-
Não é possível refatorar o mesmo recurso em várias pilhas.
-
Você não pode refatorar recursos que se referem a pseudoparâmetros cujos valores diferem entre as pilhas de origem e destino, como
AWS::StackName. -
O CloudFormation não oferece suporte a pilhas vazias. Se a refatoração deixar uma pilha sem recursos, você deve primeiro adicionar pelo menos um recurso a essa pilha antes de executar o create-stack-refactor Isso pode ser um recurso simples, como
AWS::SNS::TopicouAWS::CloudFormation::WaitCondition. Por exemplo:Resources: MySimpleSNSTopic: Type: AWS::SNS::Topic Properties: DisplayName: MySimpleTopic -
A refatoração de pilha não é compatível com pilhas que tenham políticas de pilha anexadas, independentemente do que as políticas permitam ou neguem.
Pré-requisitos
Para refatoração de pilhas, você já deve ter criado os modelos revisados.
Use o comando get-template para recuperar os modelos do CloudFormation para as pilhas que você deseja refatorar.
aws cloudformation get-template --stack-nameStack1
Quando tiver os modelos, use o ambiente de desenvolvimento integrado (IDE) de sua escolha para atualizá-los para usar a estrutura e a organização de recursos desejadas.
Refatorar pilhas (console)
Use o procedimento a seguir para refatorar uma pilha usando o console.
Para refatorar pilhas
Faça login no Console de gerenciamento da AWS e abra o console CloudFormation em https://console.aws.amazon.com/cloudformation
. -
Na barra de navegação na parte superior da tela, escolha a Região da AWS em que as pilhas estão localizadas.
-
No painel de navegação à esquerda, escolha Refatorações de pilha.
-
Na página Refatorações de pilha, escolha Iniciar refatoração de pilha.
-
Em Descrição, forneça uma descrição para ajudar a identificar a refatoração da pilha. Em seguida, escolha Próximo.
-
Na Pilha 1, faça o seguinte:
-
Escolha Atualizar o modelo para uma pilha existente ou Criar nova pilha.
Se você escolher Atualizar o modelo para uma pilha existente, selecione uma pilha existente na lista. Ou escolha Inserir um ARN de pilha para inserir o ARN de uma pilha existente.
Se você escolher Criar nova pilha, em Nome da pilha, forneça um nome para a nova pilha.
-
Em Substituir modelo existente por modelo refatorado, escolha URL do Amazon S3 ou Fazer upload de um arquivo de modelo para carregar o modelo desejado para a Pilha 1.
-
Escolha Próximo.
-
-
Na Pilha 2, faça o seguinte:
-
Escolha Atualizar o modelo para uma pilha existente ou Criar nova pilha.
Se você escolher Atualizar o modelo para uma pilha existente, selecione uma pilha existente na lista. Ou escolha Inserir um ARN de pilha para inserir o ARN de uma pilha existente.
Se você escolher Criar nova pilha, em Nome da pilha, forneça um nome para a nova pilha.
-
Em Substituir modelo existente por modelo refatorado, escolha URL do Amazon S3 ou Fazer upload de um arquivo de modelo para carregar o modelo desejado para a Pilha 2.
-
Escolha Próximo.
-
-
Na página Especificar renomeações de IDs de recursos lógicos, certifique-se de que o CloudFormation saiba como refatorar pilhas mapeando todos os recursos mostrados para suas IDs lógicas corretas. Como parte da refatoração da pilha, se os IDs lógicos de algum recurso forem alterados, você precisará especificar como ele foi renomeado fornecendo o nome da pilha de origem, o ID lógico original, o nome da pilha de destino e o ID lógico renomeado. Em alguns casos, o console do CloudFormation pode detectar automaticamente o mapeamento de recursos, e você pode simplesmente verificar se o mapeamento de recursos pré-preenchido está correto antes de continuar.
-
Escolha Próximo.
-
Na página Revisar e executar, revise todas as seleções das etapas anteriores e confirme que tudo está configurado corretamente.
-
Quando tudo estiver pronto para refatorar as pilhas, escolha Executar refatoração da pilha.
Refatorar pilhas (AWS CLI)
Os comandos da AWS CLI para refatoração de pilha incluem:
-
create-stack-refactor para validar e gerar uma prévia das alterações planejadas.
-
describe-stack-refactor para recuperar o status e os detalhes de uma operação de refatoração de pilha.
-
execute-stack-refactor para concluir a operação validada de refatoração da pilha.
-
list-stack-refactors para listar todas as operações de refatoração de pilha em sua conta com seu status atual e informações básicas.
-
list-stack-refactor-actions para mostrar uma prévia das ações específicas que o CloudFormation executará em cada pilha e recurso durante a execução da refatoração.
Use o procedimento a seguir para refatorar uma pilha usando a AWS CLI.
Para refatorar pilhas
-
Use o comando create-stack-refactor e forneça os nomes das pilhas e os modelos atualizados para que as pilhas sejam refatoradas. Inclua a opção
--enable-stack-creationpara permitir que o CloudFormation crie novas pilhas se elas ainda não existirem.aws cloudformation create-stack-refactor \ --stack-definitions \ StackName=Stack1,TemplateBody@=file://template1-updated.yaml\ StackName=Stack2,TemplateBody@=file://template2-updated.yaml\ --enable-stack-creationO comando retorna um
StackRefactorIdque você usará em etapas posteriores.{ "StackRefactorId": "9c384f70-4e07-4ed7-a65d-fee5eb430841" }Se forem detectados conflitos durante a validação do modelo (o que você pode confirmar na próxima etapa), use o comando create-stack-refactor com a opção
--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.jsonVeja a seguir um exemplo de arquivo
resource-mapping.json.[ { "Source": { "StackName": "Stack1", "LogicalResourceId": "MySNSTopic" }, "Destination": { "StackName": "Stack2", "LogicalResourceId": "MyLambdaSNSTopic" } } ] -
Use o comando describe-stack-refactor para verificar se
StatuséCREATE_COMPLETE. Isso verifica se a validação foi concluída.aws cloudformation describe-stack-refactor \ --stack-refactor-id9c384f70-4e07-4ed7-a65d-fee5eb430841Resultado do exemplo:
{ "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" } -
Use o comando list-stack-refactor-actions para visualizar as ações específicas que serão executadas.
aws cloudformation list-stack-refactor-actions \ --stack-refactor-id9c384f70-4e07-4ed7-a65d-fee5eb430841Resultado do exemplo:
{ "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" } } } ] } -
Depois de revisar e confirmar suas alterações, use o comando execute-stack-refactor para concluir a operação de refatoração da pilha.
aws cloudformation execute-stack-refactor \ --stack-refactor-id9c384f70-4e07-4ed7-a65d-fee5eb430841 -
Use o comando describe-stack-refactor para monitorar o status da execução.
aws cloudformation describe-stack-refactor \ --stack-refactor-id9c384f70-4e07-4ed7-a65d-fee5eb430841Resultado do exemplo:
{ "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" }
Limitações do recurso
-
A refatoração de pilha só suporta tipos de recursos com um
provisioningTypedeFULLY_MUTABLE, que você pode verificar usando o comando describe-type. -
O CloudFormation validará a qualificação do recurso durante a criação da refatoração e relatará quaisquer recursos não suportados na saída do comando describe-stack-refactor.
-
Os seguintes recursos não são compatíveis com refatoração de pilhas:
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