堆栈重构
堆栈重构可简化 CloudFormation 堆栈中资源的重新整理,同时仍保留现有资源属性和数据。借助堆栈重构功能,您可以在堆栈之间移动资源,将整体堆栈拆分为较小的组件,或者将多个堆栈整合为一个。
堆栈重构的工作原理
在计划堆栈重构时,应考虑以下步骤:
-
评估当前基础设施:检查现有的 CloudFormation 堆栈和资源,以确定堆栈重构的机会。
-
规划重构:定义应如何整理资源。应注意相关依赖项、命名惯例和操作限制。这些因素可能会影响 CloudFormation 稍后进行的验证。
确定要将资源重构到的目标堆栈的数量。您可以在至少 2 个堆栈和最多 5 个堆栈之间移动资源。资源可以在嵌套堆栈之间移动。
-
更新模板:修改您的 CloudFormation 模板以反映计划的更改,例如在模板之间移动资源定义。您可以在重构期间重命名逻辑 ID。
-
创建堆栈重构:提供要重构的堆栈名称和模板列表。
-
检查重构对基础设施的影响并解决所有冲突:CloudFormation 会验证您提供的模板并检查跨堆栈依赖项、存在标签更新问题的资源类型以及资源逻辑 ID 冲突。
如果验证成功,CloudFormation 将生成执行重构后将发生的重构操作预览。
如果验证失败,您可以在解决发现的问题后重试。如果存在冲突,则需要提供能够显示冲突资源的来源和目标的资源逻辑 ID 映射。
-
执行重构:确认更改符合您对堆栈重构的预期后,执行堆栈重构。
-
监控:检查
ExecutionStatus以了解堆栈重构的状态,确保重构成功。
堆栈重构限制
规划堆栈重构时应注意以下限制:
-
重构操作不允许创建新资源、删除资源或更改资源配置。
-
在堆栈重构期间,您不能更改或添加新的参数、条件或映射。一种可能的解决方法是在执行重构之前更新堆栈。
-
您不能将同一资源重构到多个堆栈。
-
如果新堆栈使用某些伪参数(例如:
AWS::StackName),则无法将资源重构到该堆栈。 -
CloudFormation 不支持空堆栈。如果堆栈重构会移除堆栈中的所有现有资源,您必须在创建该堆栈重构之前向该堆栈添加一个资源。此资源可以是简单的资源,例如
waitCondition资源类型。 -
堆栈重构不支持包含堆栈策略的堆栈,包括允许资源更改的策略。
-
不支持以下资源:
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::CodePipeline::CustomActionTypeAWS::Cognito::UserPoolRiskConfigurationAttachmentAWS::Cognito::UserPoolUICustomizationAttachmentAWS::Cognito::UserPoolUserToGroupAttachmentAWS::Config::ConfigRuleAWS::DataBrew::DatasetAWS::DataBrew::JobAWS::DataBrew::ProjectAWS::DataBrew::RecipeAWS::DataBrew::RulesetAWS::DataBrew::ScheduleAWS::DataZone::DataSourceAWS::DataZone::EnvironmentAWS::DataZone::EnvironmentBlueprintConfigurationAWS::DataZone::EnvironmentProfileAWS::DataZone::ProjectAWS::DataZone::SubscriptionTargetAWS::DynamoDB::GlobalTableAWS::EC2::LaunchTemplateAWS::EC2::SpotFleetAWS::EC2::VolumeAttachmentAWS::EC2::VPCDHCPOptionsAssociationAWS::ElasticBeanstalk::ConfigurationTemplateAWS::FIS::ExperimentTemplateAWS::Glue::SchemaAWS::GuardDuty::IPSetAWS::GuardDuty::PublishingDestinationAWS::GuardDuty::ThreatIntelSetAWS::ImageBuilder::ComponentAWS::IoTFleetWise::CampaignAWS::IoTWireless::WirelessDeviceImportTaskAWS::Lambda::EventInvokeConfigAWS::Lex::BotVersionAWS::M2::ApplicationAWS::Maester::DocumentTypeAWS::MediaTailor::ChannelAWS::MSK::ConfigurationAWS::MSK::ServerlessClusterAWS::NeptuneGraph::PrivateGraphEndpointAWS::Omics::AnnotationStoreAWS::Omics::ReferenceStoreAWS::Omics::SequenceStoreAWS::OpenSearchServerless::CollectionAWS::Panorama::PackageVersionAWS::PCAConnectorAD::ConnectorAWS::PCAConnectorAD::DirectoryRegistrationAWS::PCAConnectorAD::TemplateAWS::PCAConnectorAD::TemplateGroupAccessControlEntryAWS::QuickSight::ThemeAWS::RefactorSpaces::EnvironmentAWS::RefactorSpaces::RouteAWS::RefactorSpaces::ServiceAWS::RoboMaker::RobotApplicationAWS::RoboMaker::SimulationApplicationAWS::SageMaker::InferenceComponenAWS::ServiceCatalog::PortfolioPrincipalAssociationAWS::ServiceCatalog::PortfolioProductAssociationAWS::ServiceCatalog::PortfolioShareAWS::ServiceCatalog::TagOptionAssociationAWS::ServiceCatalogAppRegistry::AttributeGroupAssociationAWS::ServiceCatalogAppRegistry::ResourceAssociationAWS::StepFunctions::StateMachineVersionAWS::Synthetics::CanaryAWS::VoiceID::DomainAWS::WAFv2::IPSetAWS::WAFv2::RegexPatternSetAWS::WAFv2::RuleGroupAWS::WAFv2::WebACL
使用 Amazon Command Line Interface 重构堆栈
以下命令用于堆栈重构:
下面示例展示了如何使用 Amazon Command Line Interface(CLI)重构堆栈。
-
首先,您需要有您要重构的 CloudFormation 模板。以下命令用于检索模板:
aws cloudformation get-template --stack-nameExampleStack1拥有该模板后,请使用您选择的集成式开发环境(IDE)对其进行更新,以便使用所需的结构和资源组织。
-
使用
create-stack-refactor命令创建堆栈重构,并提供重构所涉及的每个堆栈的堆栈名称和模板:aws cloudformation create-stack-refactor \ --stack-definitions \ StackName=MySns,TemplateBody@=file://afterSns.yaml\ StackName=MyLambdaSubscription,TemplateBody@=file://afterLambda.yaml\ --enable-stack-creation \ --resource-mappingsfile://refactor.json--resource-mappings参数是可选的,但如果在模板验证期间检测到冲突,则必须使用该参数。除提供Source和Destination堆栈外,您还需要提供LogicalResourceId。下面是一个refactor.json示例文件。[ { "Source": { "StackName": "MySns", "LogicalResourceId": "MyFunction" }, "Destination": { "StackName": "MyLambdaSubscription", "LogicalResourceId": "Function" } } ] -
创建重构后,CloudFormation 会生成重构更改预览,以便您预览拟议更改将对基础设施产生的影响。在此示例中,创建的
StackRefactorId为stack-refactor-1ab2-c34d-5ef6。使用以下命令预览更改:aws cloudformation list-stack-refactor-actions \ --stack-refactor-idstack-refactor-1ab2-c34d-5ef6 -
检查并确认更改后,使用
execute-stack-refactor命令完成重构过程:aws cloudformation execute-stack-refactor \ --stack-refactor-idstack-refactor-1ab2-c34d-5ef6 -
执行
execute-stack-refactor后,您可以使用以下命令监控操作状态:aws cloudformation describe-stack-refactor \ --stack-refactor-idstack-refactor-1ab2-c34d-5ef6CloudFormation 将自动更新重构操作的
Status和ExecutionStatus。