堆疊重構 - AWS CloudFormation

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

堆疊重構

堆疊重構可簡化 CloudFormation 堆疊中的資源重組,同時仍保留現有的資源屬性和資料。透過堆疊重構,您可以在堆疊之間移動資源、將單體堆疊分割為較小的元件,或將多個堆疊合併為一個。

堆疊重構的運作方式

規劃堆疊重構時,請考量以下步驟:

  1. 評估您目前的基礎設施:檢閱現有的 CloudFormation 堆疊和資源,以識別堆疊重構機會。

  2. 規劃您的重構:定義應如何組織資源。考慮您的相依性、命名慣例和操作限制。這些可能會影響稍後的 CloudFormation 驗證。

    決定您要重構資源的目標堆疊數量。您可以在至少 2 個堆疊之間移動資源,最多 5 個堆疊。您可以在巢狀堆疊之間移動資源。

  3. 更新您的範本:修改 CloudFormation 範本以反映計劃的變更,例如在範本之間移動資源定義。您可以在重構期間重新命名邏輯 IDs。

  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

使用 重構堆疊 AWS Command Line Interface

下列命令用於堆疊重構:

以下是如何使用 AWS 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 會產生重構變更預覽,讓您預覽提議的變更對基礎設施的影響。在此範例中,StackRefactorId建立的 是 stack-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 會自動更新重構操作ExecutionStatusStatus和 。