AWS CloudFormation スタックと関連リソースの削除を自動化する
SANDEEP SINGH および James Jacob、Amazon Web Services
概要
AWS CloudFormation は、クラウド Infrastructure as Code (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 スタックの外部に作成される場合があります。以下に 2 つの例を示します。
CloudFormation では、ユーザーデータスクリプトを実行する Amazon Elastic Compute Cloud (Amazon EC2) インスタンスをプロビジョニングする場合があります。その後、このスクリプトはアプリケーション関連のデータを保存するための AWS Systems Manager パラメータを作成する場合があります。このパラメータは CloudFormation では管理されません。
CloudFormation では、ログを保存するための Amazon CloudWatch Logs グループを自動的に生成する Lambda 関数をプロビジョニングする場合があります。このロググループは CloudFormation では管理されません。
これらのリソースは CloudFormation によって直接管理されることはありませんが、多くの場合スタックが削除されたときにクリーンアップする必要があります。管理対象外のままにしておくと孤立状態となり、不要なリソース消費につながる可能性があります。
これらのガードレールにより作業が煩雑化する可能性はありますが、これは重要度が高く意図的な仕様です。CloudFormation がすべての制約を上書きし、リソースを無差別に削除できるようにすると、多くのシナリオで有害で予期しない結果が生じる可能性があります。ただし、環境の管理を担当する DevOps またはクラウドエンジニアは、特に開発、テスト、またはステージング環境では、これらの制約を上書きする必要がある場合があります。
ターゲットを絞ったビジネス成果
このフレームワークを実装すると、次の利点を実現できます。
コスト管理 – エンドツーエンドのテスト環境やユーザー受け入れテスト環境など、一時的な環境を定期的に効率的にクリーンアップすることで、リソースが必要以上に長く実行されないようにします。これにより、コストを大幅に削減できます。
セキュリティ – 古いリソースや未使用のリソースの自動クリーンアップは、アタックサーフェスを低減し、安全な AWS 環境を維持するのに役立ちます。
運用効率 – 定期クリーンアップと自動クリーンアップには、次の運用上の利点があります。
古いロググループまたは空の Amazon S3 バケットを削除する自動スクリプトは、環境をクリーンで管理しやすいようにすることで、運用効率を向上させることができます。
スタックを迅速に削除して再作成すると、設計と実装のための迅速なイテレーションが可能になるため、アーキテクチャの堅牢性と回復性が向上する可能性があります。
環境を定期的に削除および再構築すると、潜在的な問題を特定して修正するのに役立ちます。これにより、インフラストラクチャが現実のシナリオに耐えることができます。
前提条件と制限
前提条件
アクティブな AWS アカウント
Python バージョン 3.6 以降がインストールされている
制限
命名規則は、削除するリソースを識別するために使用されます。このパターンのサンプルコードでは、リソース名のプレフィックスが使用されますが、独自の命名規則を定義できます。この命名規則を使用しないリソースは識別されず、その後も削除されません。
アーキテクチャ
次の図は、このフレームワークがターゲット CloudFormation スタックとそれに関連付けられた追加のリソースをどのように識別するかを示しています。

この図表は、次のワークフローを示しています:
リソースの収集 – 自動化フレームワークでは命名規則を使用して、関連するすべての CloudFormation スタック、Amazon Elastic Container Registry (Amazon ECR) リポジトリ、DynamoDB テーブル、Amazon S3 バケットを返します。
前処理 – 自動化フレームワークは、CloudFormation がリソースを削除できるようにするために上書きする必要があるサービス制約を特定して対応します。例えば、DynamoDB テーブルの
DeletionProtectionEnabled設定をFalseに変更します。コマンドラインインターフェイスでは、リソースごとに制約を上書きするかどうか確認するプロンプトが表示されます。スタックの削除 – 自動化フレームワークは CloudFormation スタックを削除します。コマンドラインインターフェイスで、スタックを削除するかどうかを確認するプロンプトが表示されます。
後処理 – 自動化フレームワークが、スタックの一部として CloudFormation から直接プロビジョニングされなかった関連リソースをすべて削除します。これらのリソースタイプの例には、Systems Manager パラメータおよび CloudWatch ロググループが含まれます。個別の関数は、これらのリソースを収集し、前処理してから削除します。コマンドラインインターフェイスでは、リソースごとにリソースを削除するかどうかを確認するプロンプトが表示されます。
自動化とスケール
CloudFormation スタックにサンプルコードに含まれていない他のリソースが含まれている場合、またはスタックにこのパターンで対処されていない制約がある場合、ユースケースに合わせて自動化フレームワークを適応させることができます。リソースの収集、前処理、スタックの削除、後処理と同じ手法に従います。
ツール
AWS のサービス
AWS CloudFormation を使用すると、AWS リソースをセットアップし、迅速かつ一貫したプロビジョニングを行い、AWS アカウントと AWS リージョン全体でライフサイクル全体にわたってリソースを管理できます。
CloudFormation コマンドラインインターフェイス (CFN-CLI) は、AWS およびサードパーティーの拡張機能を開発およびテストし、CloudFormation で使用するために登録するのに役立つオープンソースツールです。
AWS SDK for Python (Boto3)
は、Python アプリケーション、ライブラリ、またはスクリプトを AWS のサービスと統合するのに役立つソフトウェア開発キットです。
その他のツール
コードリポジトリ
このパターンのコードは、GitHub 内の「cloudformation-stack-cleanup
ベストプラクティス
識別しやすいようにリソースにタグを付ける – タグ付け戦略
を実行して、さまざまな環境や目的で作成されたリソースを特定します。タグに基づいてリソースをフィルタリングするのに役立つため、クリーンアッププロセスを簡素化できます。 リソースライフサイクルの設定 – 一定期間後にリソースを自動的に削除するために、リソースライフサイクルを定義します。この手法は、一時的な環境が永続的なコスト負担にならないようにするのに役立ちます。
エピック
| タスク | 説明 | 必要なスキル |
|---|---|---|
リポジトリをクローン作成します。 |
| DevOps エンジニア |
Poetry をインストールします。 | 手順 | DevOps エンジニア |
依存関係をインストールします。 |
| DevOps エンジニア |
(オプション) Pyenv をインストールします。 | 手順 | DevOps エンジニア |
| タスク | 説明 | 必要なスキル |
|---|---|---|
ターゲットリソースを収集、前処理、削除する関数を作成します。 |
| DevOps エンジニア、Python |
| タスク | 説明 | 必要なスキル |
|---|---|---|
CloudFormation スタックを作成します。 |
| AWS DevOps |
Systems Manager パラメータを作成します。 | 次のコマンドを入力し、CloudFormation を介してプロビジョニングされない Systems Manager パラメータを作成します。
| AWS DevOps |
Amazon S3 バケットを作成する。 | 次のコマンドを入力し、CloudFormation を介してプロビジョニングされない Amazon S3 バケットを作成します。
| AWS DevOps |
| タスク | 説明 | 必要なスキル |
|---|---|---|
CloudFormation スタックを削除します。 |
| AWS DevOps |
リソースの削除を検証します。 | 出力で、すべてのサンプルリソースが削除されていることを確認します。出力例については、このパターンの追加リソースのセクションを参照してください。 | AWS DevOps |
関連リソース
スタックを削除する (CloudFormation ドキュメント)
CloudFormation のトラブルシューティング (CloudFormation ドキュメント)
Lambda 関数に Amazon VPC 内のリソースへのアクセスを許可する (Lambda ドキュメント)
AWS CloudFormation スタックが DELETE_FAILED ステータスから移行しない場合の削除方法を教えてください。
(AWS ナレッジセンター)
追加情報
以下は、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']