自動化刪除 AWS CloudFormation 堆疊和相關聯的資源 - AWS 方案指引

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

自動化刪除 AWS CloudFormation 堆疊和相關聯的資源

由 SANDEEP SINGH (AWS) 和 James Jacob (AWS) 建立

Summary

AWS CloudFormation 是一項廣泛使用的服務,可用來管理雲端基礎設施即程式碼 (IaC)。當您使用 CloudFormation 時,請以稱為堆疊的單一單位來管理相關資源。意即您能夠建立、更新和刪除堆疊,藉此建立、更新並刪除資源集合。

有時,您不再需要 CloudFormation 堆疊中的資源。根據資源及其組態,刪除堆疊及其相關聯的資源可能很複雜。在實際生產系統中,由於 CloudFormation 無法覆寫的條件或限制衝突,刪除有時會失敗或需要很長時間。它可能需要仔細的規劃和執行,以確保以高效且一致的方式正確刪除所有資源。此模式說明如何設定架構,協助您管理刪除涉及下列複雜性的 CloudFormation 堆疊:

  • 具有刪除保護的資源 – 有些資源可能已啟用刪除保護。常見範例為 Amazon DynamoDB 資料表和 Amazon Simple Storage Service (Amazon S3) 儲存貯體。刪除保護可防止自動刪除,例如透過 CloudFormation 刪除。如果您想要刪除這些資源,您必須手動或以程式設計方式覆寫或暫時停用刪除保護。在繼續之前,您應該仔細考慮刪除這些資源的含意。

  • 具有保留政策的資源 – 某些資源,例如 AWS Key Management Service (AWS KMS) 金鑰和 Amazon S3 儲存貯體,可能具有指定在請求刪除後應保留多久的保留政策。您應該在清除策略中考慮這些政策,以保持符合組織政策和法規要求。

  • 延遲刪除連接到 VPC 的 Lambda 函數 – 刪除連接到虛擬私有雲端 (VPC) 的AWS Lambda函數可能需要 5-40 分鐘,取決於程序中涉及的多個互連相依性。如果您在刪除堆疊之前從 VPC 分離函數,您可以將此延遲減少到 1 分鐘以下。

  • 非由 CloudFormation 直接建立的資源 – 在某些應用程式設計中,資源可能會在原始 CloudFormation 堆疊之外建立,無論是由應用程式本身或透過堆疊佈建的資源。以下是兩個範例:

    • CloudFormation 可能會佈建執行使用者資料指令碼的 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。然後,此指令碼可能會建立 AWS Systems Manager 參數來存放應用程式相關資料。此參數不是透過 CloudFormation 管理。

    • CloudFormation 可能會佈建 Lambda 函數,自動產生用於儲存日誌的 Amazon CloudWatch Logs 群組。此日誌群組不是透過 CloudFormation 管理。

    雖然這些資源並非由 CloudFormation 直接管理,但通常在刪除堆疊時需要清除這些資源。如果未受管理,它們可能會變得孤立,並導致不必要的資源消耗。

雖然這些護欄可能會造成複雜性,但它們是有意且關鍵的。允許 CloudFormation 覆寫所有限制條件和無差別刪除資源,在許多情況下可能會導致不利和不可預見的後果。不過,身為負責管理環境的 DevOps 或雲端工程師,有時可能需要覆寫這些限制,尤其是在開發、測試或預備環境中。

目標業務成果

透過實作此架構,您可以實現下列優點:

  • 成本管理 – 定期且有效率地清理暫時性環境,例如end-to-end或使用者接受度測試環境,有助於防止資源執行超過必要的時間。這可以大幅降低成本。

  • 安全 – 自動清除過時或未使用的資源可減少攻擊面,並有助於維護安全 AWS 的環境。

  • 營運效率 – 定期和自動清理可提供下列營運優勢:

    • 移除舊日誌群組或空 Amazon S3 儲存貯體的自動化指令碼可以透過保持環境乾淨且可管理來提高營運效率。

    • 快速刪除和重新建立堆疊可支援設計和實作的快速反覆運算,這可能會導致更強大和彈性的架構。

    • 定期刪除和重建環境可協助您識別和修正潛在問題。這可協助您確保基礎設施可以承受真實世界的案例。

先決條件和限制

先決條件

限制

  • 命名慣例用於識別應刪除的資源。此模式中的範例程式碼使用資源名稱的字首,但您可以定義自己的命名慣例。不會識別或隨後刪除未使用此命名慣例的資源。

架構

下圖顯示此架構如何識別目標 CloudFormation 堆疊及其相關聯的其他資源。

探索、處理和刪除 CloudFormation 堆疊及其相關聯資源的階段。

該圖顯示以下工作流程:

  1. 收集資源 – 自動化架構使用命名慣例來傳回所有相關 CloudFormation 堆疊、Amazon Elastic Container Registry (Amazon ECR) 儲存庫、DynamoDB 資料表和 Amazon S3 儲存貯體。

    注意

    此階段的函數使用分頁程式,這是 Boto3 中的一項功能,可抽象化經過截斷 API 結果集的反覆運算程序。這可確保處理所有資源。若要進一步最佳化效能,請考慮套用伺服器端篩選,或考慮使用 JMESPath 來執行用戶端篩選。

  2. 預先處理 – 自動化架構可識別並解決必須覆寫的服務限制條件,以允許 CloudFormation 刪除資源。例如,它會將 DynamoDB 資料表DeletionProtectionEnabled的設定變更為 False。在命令列界面中,針對每個資源,您會收到提示,詢問您是否要覆寫限制條件。

  3. 刪除堆疊 – 自動化架構會刪除 CloudFormation 堆疊。在命令列界面中,您會收到提示,詢問您是否要刪除堆疊。

  4. 後處理 – 自動化架構會刪除未直接透過 CloudFormation 佈建的任何相關資源,做為堆疊的一部分。這些資源類型的範例包括 Systems Manager 參數和 CloudWatch 日誌群組。個別函數會收集這些資源、預先處理它們,然後刪除它們。在命令列界面中,針對每個資源,您會收到提示,詢問您是否要刪除資源。

    注意

    此階段的函數使用分頁程式,這是 Boto3 中的一項功能,可抽象化經過截斷 API 結果集的反覆運算程序。這可確保處理所有資源。若要進一步最佳化效能,請考慮套用伺服器端篩選,或考慮使用 JMESPath 來執行用戶端篩選。

自動化和擴展

如果您的 CloudFormation 堆疊包含範例程式碼中未包含的其他資源,或堆疊具有此模式中未解決的限制,則您可以針對您的使用案例調整自動化架構。遵循相同的方法來收集資源、預先處理、刪除堆疊,然後進行後續處理。

工具

AWS 服務

  • AWS CloudFormation 可協助您設定 AWS 資源、快速且一致地佈建資源,以及在整個 AWS 帳戶 和 生命週期中管理資源 AWS 區域。

  • CloudFormation 命令列界面 (CFN-CLI) 是一種開放原始碼工具,可協助您開發和測試 AWS 和第三方延伸模組,然後註冊它們以在 CloudFormation 中使用。

  • 適用於 Python (Boto3) 的 AWS SDK 是一種軟體開發套件,可協助您整合 Python 應用程式、程式庫或指令碼 AWS 服務。

其他工具

  • 按一下是 Python 工具,可協助您建立命令列界面。

  • Poetry 是一種在 Python 中管理相依性和封裝的工具。

  • Pyenv 是一種工具,可協助您管理和切換 Python 版本。

  • Python 是一種一般用途的電腦程式設計語言。

程式碼儲存庫

此模式的程式碼可在 GitHub cloudformation-stack-cleanup 儲存庫中使用。

最佳實務

  • 標記資源以方便識別 – 實作標記策略來識別為不同環境和目的建立的資源。標籤可協助您根據資源的標籤篩選資源,以簡化清除程序。

  • 設定資源生命週期 – 定義資源生命週期,以便在特定期間之後自動刪除資源。此實務可協助您確保暫時環境不會成為永久成本負債。

史詩

任務描述所需的技能

複製儲存庫。

  1. 在虛擬環境中建立資料夾。將其命名為您的專案名稱。

  2. 在本機電腦上開啟終端機,然後導覽至此資料夾。

  3. 輸入下列命令,將 cloudformation-stack-cleanup 儲存庫複製到您的專案目錄:

    git clone https://github.com/aws-samples/cloudformation-stack-cleanup.git
DevOps 工程師

安裝 Poetry。

依照指示 (Poetry 文件) 在目標虛擬環境中安裝 Poetry。

DevOps 工程師

安裝依存項目。

  1. 輸入下列命令以導覽至專案目錄:

    cd cloudformation-stack-cleanup
  2. 輸入以下命令:

    poetry install

    這會安裝所有必要的相依性,例如 Boto3、ClickCloudFormation CLI 的原始程式碼。

DevOps 工程師

(選用) 安裝 Pyenv。

依照指示 (GitHub) 安裝 Pyenv。

DevOps 工程師
任務描述所需的技能

建立收集、預先處理和刪除目標資源的函數。

  1. 在複製的儲存庫中,輸入下列命令以導覽至 cli目錄:

    cd cfncli/cli
  2. 開啟 cleanup_enviornment.py 檔案。

  3. 建立新的 Python 函數,收集您要修改的資源類型。如需範例,請參閱此檔案中的 gather_ddb_tables函數。

  4. 建立新的 Python 函數,覆寫目標資源的服務限制條件。如需範例,請參閱此檔案中的 remove_ddb_deletion_protection函數。

  5. 建立新的 Python 函數,以收集未受管的目標資源。如需範例,請參閱此檔案中的 gather_log_groups函數。

  6. 建立新的 Python 函數,刪除未受管的目標資源。如需範例,請參閱此檔案中的 delete_log_group函數。

  7. 儲存並關閉 cleanup_enviornment.py 檔案。

DevOps 工程師,Python
任務描述所需的技能

建立 CloudFormation 堆疊。

  1. 導覽至 專案目錄。

  2. 輸入下列命令來建立佈建 DynamoDB 資料表和安全群組的 CloudFormation 堆疊。更新 的值<VPCID>

    aws cloudformation create-stack \ --stack-name sampleforcleanup-Stack \ --template-body file://samples/sample-cfn-stack.yaml \ --parameters ParameterKey=VpcId,ParameterValue=<VPCID> \ --region us-east-1
AWS DevOps

建立 Systems Manager 參數。

輸入下列命令以建立未透過 CloudFormation 佈建的 Systems Manager 參數:

aws ssm put-parameter \ --name "/sampleforcleanup/database/password" \ --value "your_db_password" \ --type "SecureString" \ --description "Database password for my app" \ --tier "Standard" \ --region "us-east-1"
AWS DevOps

建立 Amazon S3 儲存貯體。

輸入下列命令來建立未透過 CloudFormation 佈建的 Amazon S3 儲存貯體:

aws s3api create-bucket \ --bucket samplesorcleanup-unmanagedbucket-<UniqueIdentifier> \ --region us-east-1 \ --create-bucket-configuration LocationConstraint=us-east-1
AWS DevOps
任務描述所需的技能

刪除 CloudFormation 堆疊。

  1. 輸入下列命令來刪除您建立的範例 CloudFormation 堆疊、Systems Manager 參數和 Amazon S3 儲存貯體:

    cfncli --region us-east-1 \ dev cleanup-env \ --prefix-list sampleforcleanup
  2. 出現提示時,請輸入 Y以繼續。

AWS DevOps

驗證資源刪除。

在輸出中,確認已刪除所有範例資源。如需範例輸出,請參閱此模式的其他資源區段。

AWS DevOps

相關資源

其他資訊

以下是來自 cfncli命令的範例輸出:

cfncli --region aus-east-1 dev cleanup-env --prefix-list sampleforcleanup https://sts.us-east-1.amazonaws.com Cleaning up: ['sampleforcleanup'] in xxxxxxxxxx:us-east-1 Do you want to proceed? [Y/n]: Y No S3 buckets No ECR repositories No Lambda functions in VPC The following DynamoDB tables will have their deletion protection removed: sampleforcleanup-MyDynamoDBTable Do you want to proceed with removing deletion protection from these tables? [Y/n]: Y Deletion protection disabled for DynamoDB table 'sampleforcleanup-MyDynamoDBTable'. The following CloudFormation stacks will be deleted: sampleforcleanup-Stack Do you want to proceed with deleting these CloudFormation stacks? [Y/n]: Y Initiated deletion of CloudFormation stack: `sampleforcleanup-Stack` Waiting for stack `sampleforcleanup-Stack` to be deleted... CloudFormation stack `sampleforcleanup-Stack` deleted successfully. The following ssm_params will be deleted: /sampleforcleanup/database/password Do you want to proceed with deleting these ssm_params? [Y/n]: Y Deleted SSM Parameter: /sampleforcleanup/database/password Cleaned up: ['sampleforcleanup']