スタックリファクタリング
スタックリファクタリングを使用すると、既存のリソースプロパティとデータを維持しながら CloudFormation スタック内のリソースを再編成できます。スタック間でのリソースの移動、大きなスタックの小さなスタックへの分割、または複数スタックの単一スタックへの統合が可能です。
スタックリファクタリングの仕組み
スタックリファクタリングには以下のフェーズがあります。
-
現在のインフラストラクチャを評価する – 既存の CloudFormation スタックとリソースを見直して、スタックリファクタリングの機会を特定します。
-
リファクタリングを計画する – リソースの編成方法を定義します。依存関係、命名規則、運用上の制限を検討してください。後に CloudFormation の検証に影響する可能性があります。
-
リファクタリング先スタックを決定する – リソースをリファクタリングするスタックを決定します。リソースは、最小で 2 つ、最大で 5 つのスタック間で移動できます。リソースはネストされたスタック間で移動できます。
-
テンプレートを更新する – CloudFormation テンプレートを変更して、テンプレート間でのリソース定義の移動などの計画済みの変更を反映します。論理 ID の名前はこのプロセス中に変更できます。
-
スタックリファクタリングを作成する – リファクタリングするスタック名とテンプレートのリストを指定します。
-
リファクタリングによる影響を確認し、競合があれば解決する – CloudFormation が指定されたテンプレートを検証し、スタック間の依存関係、タグの更新問題があるリソースタイプ、リソース論理 ID の競合をチェックします。
検証が成功した場合は、リファクタリングの実行中に行われるリファクタリングアクションのプレビューを CloudFormation が生成します。
検証に失敗した場合は、特定された問題を解決して再試行します。競合が存在する場合は、競合するリソースのソースとリファクタリング先を示すリソース論理 ID マッピングを指定します。
-
リファクタリングを実行する – 変更がリファクタリングの目標と一致することを確認したら、スタックのリファクタリングを完了します。
-
監視する – 実行ステータスを追跡して、オペレーションが正常に完了することを確認します。
スタックリファクタリングに関する考慮事項
スタックをリファクタリングするときは、次の点に留意してください。
-
リファクタリングオペレーションでは、新しいリソース作成、リソース削除、リソース設定の変更が許可されません。
-
スタックのリファクタリング中、新しいパラメータ、条件、マッピングを変更または追加することはできません。この場合に考えられる回避策は、リファクタリングを実行する前にスタックを更新することです。
-
同じリソースを複数のスタックにリファクタリングすることはできません。
-
AWS::StackNameなど、ソーススタックとリファクタリング先スタックで値が異なる擬似パラメータを参照するリソースをリファクタリングすることはできません。 -
CloudFormation は空のスタックをサポートしません。リファクタリングによってスタックがリソースのない状態になる場合は、まずそのスタックに少なくとも 1 つのリソースを追加してから create-stack-refactor を実行する必要があります。これは、
AWS::SNS::TopicやAWS::CloudFormation::WaitConditionといったシンプルなリソースにすることができます。例:Resources: MySimpleSNSTopic: Type: AWS::SNS::Topic Properties: DisplayName: MySimpleTopic -
スタックリファクタリングは、スタックポリシーが何を許可し、拒否するかにかかわらず、スタックポリシーがアタッチされているスタックをサポートしません。
スタックリファクタリングの AWS CLI コマンド
スタックリファクタリングの AWS CLI コマンドには以下が含まれます。
-
計画された変更を検証してプレビューを生成するための create-stack-refactor。
-
スタックリファクタリングオペレーションのステータスと詳細を取得するための describe-stack-refactor。
-
検証済みのスタックリファクタリングオペレーションを完了するための execute-stack-refactor。
-
既存のスタックのテンプレートを取得するための get-template。
-
アカウント内のすべてのスタックリファクタリングオペレーションを、現在のステータスと基本情報とともに一覧表示するための list-stack-refactors。
-
リファクタリングの実行中に CloudFormation が各スタックとリソースに対して実行する特定のアクションのプレビューを表示するための list-stack-refactor-actions。
AWS CLI を使用したスタックのリファクタリング
AWS CLI を使用してスタックをリファクタリングするには、以下の手順を実行します。
-
get-template コマンドを使用して、リファクタリングするスタックの CloudFormation テンプレートを取得します。
aws cloudformation get-template --stack-nameStack1テンプレートを取得したら、希望の統合開発環境 (IDE) を使用してテンプレートを更新し、目的の構造とリソース組織を使用するようにします。
-
create-stack-refactor コマンドを使用して、リファクタリングするスタックのスタック名と更新されたテンプレートを指定します。新しいスタックがまだ存在しない場合は、CloudFormation が新しいスタックを作成できるようにする
--enable-stack-creationオプションを含めます。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" }テンプレートの検証中に競合が検出された場合は (次のステップで確認できます)、create-stack-refactor コマンドを
--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.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