堆栈重构 - Amazon CloudFormation
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

堆栈重构

堆栈重构可简化 CloudFormation 堆栈中资源的重新整理,同时仍保留现有资源属性和数据。借助堆栈重构功能,您可以在堆栈之间移动资源,将整体堆栈拆分为较小的组件,或者将多个堆栈整合为一个。

堆栈重构的工作原理

在计划堆栈重构时,应考虑以下步骤:

  1. 评估当前基础设施:检查现有的 CloudFormation 堆栈和资源,以确定堆栈重构的机会。

  2. 规划重构:定义应如何整理资源。应注意相关依赖项、命名惯例和操作限制。这些因素可能会影响 CloudFormation 稍后进行的验证。

    确定要将资源重构到的目标堆栈的数量。您可以在至少 2 个堆栈和最多 5 个堆栈之间移动资源。资源可以在嵌套堆栈之间移动。

  3. 更新模板:修改您的 CloudFormation 模板以反映计划的更改,例如在模板之间移动资源定义。您可以在重构期间重命名逻辑 ID。

  4. 创建堆栈重构:提供要重构的堆栈名称和模板列表。

  5. 检查重构对基础设施的影响并解决所有冲突:CloudFormation 会验证您提供的模板并检查跨堆栈依赖项、存在标签更新问题的资源类型以及资源逻辑 ID 冲突。

    如果验证成功,CloudFormation 将生成执行重构后将发生的重构操作预览。

    如果验证失败,您可以在解决发现的问题后重试。如果存在冲突,则需要提供能够显示冲突资源的来源和目标的资源逻辑 ID 映射。

  6. 执行重构:确认更改符合您对堆栈重构的预期后,执行堆栈重构。

  7. 监控:检查 ExecutionStatus 以了解堆栈重构的状态,确保重构成功。

堆栈重构限制

规划堆栈重构时应注意以下限制:

  • 重构操作不允许创建新资源、删除资源或更改资源配置。

  • 在堆栈重构期间,您不能更改或添加新的参数、条件或映射。一种可能的解决方法是在执行重构之前更新堆栈。

  • 您不能将同一资源重构到多个堆栈。

  • 如果新堆栈使用某些伪参数(例如:AWS::StackName),则无法将资源重构到该堆栈。

  • CloudFormation 不支持空堆栈。如果堆栈重构会移除堆栈中的所有现有资源,您必须在创建该堆栈重构之前向该堆栈添加一个资源。此资源可以是简单的资源,例如 waitCondition 资源类型。

  • 堆栈重构不支持包含堆栈策略的堆栈,包括允许资源更改的策略。

  • 不支持以下资源:

    • 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::CodePipeline::CustomActionType

    • AWS::Cognito::UserPoolRiskConfigurationAttachment

    • AWS::Cognito::UserPoolUICustomizationAttachment

    • AWS::Cognito::UserPoolUserToGroupAttachment

    • AWS::Config::ConfigRule

    • 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::DynamoDB::GlobalTable

    • AWS::EC2::LaunchTemplate

    • AWS::EC2::SpotFleet

    • AWS::EC2::VolumeAttachment

    • AWS::EC2::VPCDHCPOptionsAssociation

    • AWS::ElasticBeanstalk::ConfigurationTemplate

    • AWS::FIS::ExperimentTemplate

    • AWS::Glue::Schema

    • AWS::GuardDuty::IPSet

    • AWS::GuardDuty::PublishingDestination

    • AWS::GuardDuty::ThreatIntelSet

    • AWS::ImageBuilder::Component

    • AWS::IoTFleetWise::Campaign

    • AWS::IoTWireless::WirelessDeviceImportTask

    • AWS::Lambda::EventInvokeConfig

    • AWS::Lex::BotVersion

    • AWS::M2::Application

    • AWS::Maester::DocumentType

    • AWS::MediaTailor::Channel

    • AWS::MSK::Configuration

    • AWS::MSK::ServerlessCluster

    • AWS::NeptuneGraph::PrivateGraphEndpoint

    • AWS::Omics::AnnotationStore

    • AWS::Omics::ReferenceStore

    • AWS::Omics::SequenceStore

    • AWS::OpenSearchServerless::Collection

    • AWS::Panorama::PackageVersion

    • AWS::PCAConnectorAD::Connector

    • AWS::PCAConnectorAD::DirectoryRegistration

    • AWS::PCAConnectorAD::Template

    • AWS::PCAConnectorAD::TemplateGroupAccessControlEntry

    • AWS::QuickSight::Theme

    • AWS::RefactorSpaces::Environment

    • AWS::RefactorSpaces::Route

    • AWS::RefactorSpaces::Service

    • AWS::RoboMaker::RobotApplication

    • AWS::RoboMaker::SimulationApplication

    • AWS::SageMaker::InferenceComponen

    • 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::WAFv2::IPSet

    • AWS::WAFv2::RegexPatternSet

    • AWS::WAFv2::RuleGroup

    • AWS::WAFv2::WebACL

使用 Amazon Command Line Interface 重构堆栈

以下命令用于堆栈重构:

下面示例展示了如何使用 Amazon Command Line Interface(CLI)重构堆栈。

  1. 首先,您需要有您要重构的 CloudFormation 模板。以下命令用于检索模板:

    aws cloudformation get-template --stack-name ExampleStack1

    拥有该模板后,请使用您选择的集成式开发环境(IDE)对其进行更新,以便使用所需的结构和资源组织。

  2. 使用 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-mappings file://refactor.json

    --resource mappings 参数是可选的,但如果在模板验证期间检测到冲突,则必须使用该参数。除提供 SourceDestination 堆栈外,您还需要提供 LogicalResourceId。下面是一个 refactor.json 示例文件。

    [ { "Source": { "StackName": "MySns", "LogicalResourceId": "MyFunction" }, "Destination": { "StackName": "MyLambdaSubscription", "LogicalResourceId": "Function" } } ]
  3. 创建重构后,CloudFormation 会生成重构更改预览,以便您预览拟议更改将对基础设施产生的影响。在此示例中,创建的 StackRefactorIdstack-refactor-1ab2-c34d-5ef6。使用以下命令预览更改:

    aws cloudformation list-stack-refactor-actions \ --stack-refactor-id stack-refactor-1ab2-c34d-5ef6
  4. 检查并确认更改后,使用 execute-stack-refactor 命令完成重构过程:

    aws cloudformation execute-stack-refactor \ --stack-refactor-id stack-refactor-1ab2-c34d-5ef6
  5. 执行 execute-stack-refactor 后,您可以使用以下命令监控操作状态:

    aws cloudformation describe-stack-refactor \ --stack-refactor-id stack-refactor-1ab2-c34d-5ef6

    CloudFormation 将自动更新重构操作的 StatusExecutionStatus