本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
堆疊重構
透過堆疊重構,您可以重整 CloudFormation 堆疊中的資源,同時保留現有資源的屬性與資料。您可以在堆疊之間移動資源、將大型堆疊分割成較小的堆疊,或將多個堆疊合併成一個堆疊。
堆疊重構的運作方式
堆疊重構包含下列階段:
-
評估目前的基礎設施 – 檢閱您現有的 CloudFormation 堆疊與資源,找出可進行堆疊重構的機會。
-
規劃重構 – 定義資源的組織方式。考量資源相依性、命名慣例及運作限制。這些因素會影響後續的 CloudFormation 驗證。
-
決定目的地堆疊 – 確定您要將資源重構至哪些堆疊。您可以在至少 2 個堆疊 (使用 主控台) 和最多 5 個堆疊 (使用 ) 之間移動資源 AWS CLI。資源可在巢狀堆疊之間移動。
-
更新範本 – 變更 CloudFormation 範本,以反映規劃的變更,例如在範本間移動資源定義。您可在此程序期間重新命名邏輯 ID。
-
建立堆疊重構 – 提供您要重構的堆疊名稱與範本清單。
-
檢閱重構影響並解決任何衝突 – CloudFormation 會驗證您提供的範本,並檢查跨堆疊相依性、標籤更新有問題的資源類型,以及資源邏輯 ID 衝突。
若驗證成功,CloudFormation 會產生執行期間即將執行的重構動作預覽。
若驗證失敗,請解決偵測到的問題後重試。若有衝突,請提供資源邏輯 ID 映射,以顯示衝突資源的來源和目的地。
-
執行重構 – 確認變更符合重構目標後,完成堆疊重構。
-
監控 – 追蹤執行狀態,確保作業順利完成。
堆疊重構考量事項
重構堆疊時,請注意下列事項:
-
堆疊重構僅限於重整現有資源。您無法在重構期間建立或刪除資源、修改資源組態,或變更或新增參數、條件或映射。若要進行這些變更,請先更新您的堆疊,然後執行堆疊重構。
-
您無法將相同的資源重構入多個堆疊。
-
若資源參考的虛擬參數 (例如
AWS::StackName) 在來源與目標堆疊中的數值不同,則無法對該資源進行重構。 -
CloudFormation 不支援空白堆疊。若重構會導致某個堆疊沒有資源,您必須先向該堆疊新增至少一項資源,再執行 create-stack-refactor。可新增簡單資源,例如
AWS::SNS::Topic或AWS::CloudFormation::WaitCondition。例如:Resources: MySimpleSNSTopic: Type: AWS::SNS::Topic Properties: DisplayName: MySimpleTopic -
堆疊重構不支援已附加堆疊政策的堆疊,不論該政策允許或拒絕哪些操作。
先決條件
若要重構堆疊,您必須已建立修訂後的範本。
使用 get-template 命令,擷取您要重構的堆疊對應 CloudFormation 範本。
aws cloudformation get-template --stack-nameStack1
取得範本後,使用您偏好的整合式開發環境 (IDE) 更新範本,使其符合預期的結構與資源組織方式。
重構堆疊 (主控台)
使用下列程序來重構使用主控台的堆疊。
重構堆疊
登入 AWS 管理主控台 ,並在 https://https://console.aws.amazon.com/cloudformation 開啟 CloudFormation 主控台。
-
在畫面頂端的導覽列上,選擇 AWS 區域 堆疊所在的 。
-
在左側導覽窗格中,選擇堆疊重構。
-
在堆疊重構頁面上,選擇開始堆疊重構。
-
針對描述,提供描述以協助您識別堆疊重構。然後選擇下一步。
-
對於堆疊 1,請執行下列動作:
-
選擇更新現有堆疊的範本或建立新堆疊。
如果您選擇更新現有堆疊的範本,請從清單中選擇現有的堆疊。或者,選擇輸入堆疊 ARN 以輸入現有堆疊的 ARN。
如果您選擇建立新堆疊,請針對堆疊名稱提供新堆疊的名稱。
-
在將現有範本取代為重構範本下,選擇 Amazon S3 URL 或上傳範本檔案,以上傳 Stack 1 所需的範本。
-
選擇下一步。
-
-
對於 Stack 2,請執行下列動作:
-
選擇更新現有堆疊的範本或建立新堆疊。
如果您選擇更新現有堆疊的範本,請從清單中選擇現有的堆疊。或者,選擇輸入堆疊 ARN 以輸入現有堆疊的 ARN。
如果您選擇建立新堆疊,請針對堆疊名稱提供新堆疊的名稱。
-
在將現有範本取代為重構範本下,選擇 Amazon S3 URL 或上傳範本檔案,以上傳 Stack 2 所需的範本。
-
選擇下一步。
-
-
在指定邏輯資源 ID 重新命名頁面上,確定 CloudFormation 知道如何將顯示的任何資源映射至其正確的邏輯 IDs 來重構堆疊。作為堆疊重構的一部分,如果任何資源的邏輯 IDs已變更,您需要提供來源堆疊名稱、原始邏輯 ID、目的地堆疊名稱和重新命名的邏輯 ID 來指定其重新命名方式。在某些情況下,CloudFormation 主控台可能會自動偵測資源映射,您可以直接驗證預先填入的資源映射是否正確,然後再繼續。
-
選擇下一步。
-
在檢閱和執行頁面上,檢閱先前步驟中的所有選擇,並確認一切設定正確。
-
當您準備好重構堆疊時,請選擇執行堆疊重構。
重構堆疊 (AWS CLI)
用於堆疊重構的 AWS CLI 命令包括:
-
create-stack-refactor 用於驗證和產生規劃變更的預覽。
-
describe-stack-refactor 用於擷取堆疊重構操作的狀態與詳細資訊。
-
execute-stack-refactor 用於完成經驗證的堆疊重構操作。
-
list-stack-refactors 用於列出您帳戶中所有堆疊重構操作及其目前狀態和基本資訊。
-
list-stack-refactor-actions 用於顯示 CloudFormation 在重構執行期間將對每個堆疊和資源執行的特定動作的預覽。
利用以下程序使用 AWS CLI重構堆疊。
重構堆疊
-
使用 create-stack-refactor 命令,並提供要重構的堆疊名稱與更新後的範本。加入
--enable-stack-creation選項,讓 CloudFormation 可在新堆疊不存在時建立。aws cloudformation create-stack-refactor \ --stack-definitions \ StackName=Stack1,TemplateBody@=file://template1-updated.yaml\ StackName=Stack2,TemplateBody@=file://template2-updated.yaml\ --enable-stack-creation命令會傳回
StackRefactorId,後續步驟將會用到。{ "StackRefactorId": "9c384f70-4e07-4ed7-a65d-fee5eb430841" }若範本驗證期間偵測到衝突 (可在下一個步驟確認),請搭配
--resource-mappings選項使用 create-stack-refactor 命令。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以下是範例
resource-mapping.json檔案。[ { "Source": { "StackName": "Stack1", "LogicalResourceId": "MySNSTopic" }, "Destination": { "StackName": "Stack2", "LogicalResourceId": "MyLambdaSNSTopic" } } ] -
使用 describe-stack-refactor 命令來確定
Status為CREATE_COMPLETE。這表示驗證已完成。aws cloudformation describe-stack-refactor \ --stack-refactor-id9c384f70-4e07-4ed7-a65d-fee5eb430841輸出範例:
{ "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" } -
使用 list-stack-refactor-actions 命令,預覽即將執行的特定動作。
aws cloudformation list-stack-refactor-actions \ --stack-refactor-id9c384f70-4e07-4ed7-a65d-fee5eb430841輸出範例:
{ "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" } } } ] } -
檢閱並確認變更後,使用 execute-stack-refactor 命令來完成堆疊重構操作。
aws cloudformation execute-stack-refactor \ --stack-refactor-id9c384f70-4e07-4ed7-a65d-fee5eb430841 -
使用 describe-stack-refactor 命令監控執行狀態。
aws cloudformation describe-stack-refactor \ --stack-refactor-id9c384f70-4e07-4ed7-a65d-fee5eb430841輸出範例:
{ "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" }
資源限制
-
堆疊重構僅支援具有
provisioningType為FULLY_MUTABLE的資源類型,您可以使用 describe-type 命令確認。 -
建立重構時,CloudFormation 會驗證資源適用性,並在 describe-stack-refactor 命令的輸出中回報所有不支援的資源。
-
下列資源不支援堆疊重構:
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