CloudFormationスタックの削除方法と注意点
はじめに
CloudFormationを使いこなす上で、スタックの作成だけでなく、その削除方法も理解しておくことは非常に重要です。
スタックを削除することで、関連するすべてのAWSリソースをまとめてクリーンアップでき、不要なコストの発生を防ぐことができます。しかし、削除時には思わぬ落とし穴があり、適切な知識なしに実行すると予期しない問題に遭遇する可能性があります。
今回は、スタックの基本的な削除方法から、よく発生する問題とその対処法まで、実践的な内容を解説します。
スタックの削除手順
マネジメントコンソールでの削除
スタックを削除する最も一般的な方法は、AWSマネジメントコンソールを使用することです。
手順:
-
CloudFormationコンソールへ移動
- AWSマネジメントコンソールで「CloudFormation」と検索し、コンソールを開きます
-
削除するスタックを選択
- 削除したいスタックをリストから選択します
-
削除ボタンをクリック
- 画面右上の「削除」ボタンをクリックします
-
スタック名の確認
- 確認画面が表示されたら、削除するスタック名を入力し、「スタックの削除」ボタンをクリックします
これにより、CloudFormationがスタック内のリソースを依存関係に従って一つずつ削除していきます。
AWS CLIでの削除
コマンドラインから削除する場合は、以下のコマンドを使用します:
# スタックの削除
aws cloudformation delete-stack --stack-name my-stack-name
# 削除状況の確認
aws cloudformation describe-stacks --stack-name my-stack-name
スタック削除の注意点とトラブルシューティング
スタックの削除は通常スムーズに完了しますが、特定のリソースが存在する場合、エラーが発生することがあります。よく発生する問題とその対処法を詳しく解説します。
1. S3バケットの削除問題
問題:
CloudFormationは、デフォルトでは空でないS3バケットを削除できません。バケット内にデータが残っている場合、削除が失敗し、スタックの状態が「DELETE_FAILED」になります。これは、意図せず重要なデータを削除してしまうのを防ぐためのAWSの仕様です。
エラーメッセージ例:
The bucket you tried to delete is not empty (Service: Amazon S3; Status Code: 409; Error Code: BucketNotEmpty)
解決策:
方法1: 手動でS3バケットを空にする
# AWS CLIでバケット内のオブジェクトをすべて削除
aws s3 rm s3://your-bucket-name --recursive
# バージョン管理が有効な場合は、削除マーカーも削除
aws s3api delete-objects --bucket your-bucket-name \
--delete "$(aws s3api list-object-versions \
--bucket your-bucket-name \
--output json --query '{Objects: Versions[].{Key:Key,VersionId:VersionId}}')"
方法2: DeletionPolicyを設定する
テンプレートにDeletionPolicy: Retainを追加することで、スタックを削除してもS3バケットを保持できます:
Resources:
MyS3Bucket:
Type: AWS::S3::Bucket
DeletionPolicy: Retain # スタック削除時もバケットを保持
Properties:
BucketName: my-important-bucket
# その他のプロパティ...
方法3: 自動削除の設定(開発環境向け)
開発環境などでデータの保持が不要な場合は、Lambda関数を使った自動削除も可能です:
Resources:
MyS3Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: my-dev-bucket
NotificationConfiguration:
LambdaConfigurations:
- Event: s3:ObjectCreated:*
Function: !GetAtt EmptyBucketLambda.Arn
2. RDSインスタンスの削除保護
問題:
RDSインスタンスに削除保護が設定されている場合、CloudFormationでの削除が失敗します。
解決策:
# 削除保護を無効化
aws rds modify-db-instance \
--db-instance-identifier my-db-instance \
--no-deletion-protection \
--apply-immediately
3. セキュリティグループの依存関係
問題:
他のリソースから参照されているセキュリティグループは削除できません。
解決策:
- 依存関係を特定する
- 参照しているリソースを先に削除または設定変更
- セキュリティグループを削除
4. DELETE_FAILEDからの復旧
DELETE_FAILED状態になった場合の対処手順:
ステップ1: 失敗原因の特定
- CloudFormationコンソールでスタックを選択
- 「イベント」タブを確認
-
DELETE_FAILED状態のリソースとエラーメッセージを確認
ステップ2: 問題の解決
- 上記の各問題に応じた解決策を実行
ステップ3: スタックの再削除
- CloudFormationコンソールで「削除」を再実行
- 必要に応じて「リソースをスキップ」オプションを使用
リソースをスキップする場合:
aws cloudformation delete-stack \
--stack-name my-stack-name \
--retain-resources ResourceLogicalId1 ResourceLogicalId2
削除前のベストプラクティス
1. 事前チェックリスト
スタック削除前に以下を確認しましょう:
- 重要なデータがS3バケットに含まれていないか
- RDSのスナップショットが取得されているか
- 他のスタックから参照されているリソースがないか
- 削除後に影響を受けるアプリケーションがないか
2. DeletionPolicyの活用
重要なリソースには適切なDeletionPolicyを設定:
Resources:
ProductionDatabase:
Type: AWS::RDS::DBInstance
DeletionPolicy: Snapshot # 削除時にスナップショットを作成
Properties:
# データベースのプロパティ...
LoggingBucket:
Type: AWS::S3::Bucket
DeletionPolicy: Retain # 削除時にバケットを保持
Properties:
# バケットのプロパティ...
3. タグによる管理
削除対象の明確化のため、適切なタグを設定:
Resources:
MyResource:
Type: AWS::EC2::Instance
Properties:
Tags:
- Key: Environment
Value: Development
- Key: Project
Value: MyProject
- Key: Owner
Value: team@company.com
まとめ
| 問題 | 原因 | 解決策 |
|---|---|---|
| S3バケットが削除できない | バケット内にデータが残っている | 手動でバケットを空にする、またはDeletionPolicy: Retainを設定 |
| RDSが削除できない | 削除保護が有効になっている | 削除保護を無効化してから削除 |
| セキュリティグループが削除できない | 他のリソースから参照されている | 依存関係を解消してから削除 |
スタックがDELETE_FAILED |
特定のリソースの削除に失敗 | イベントログで原因を特定し、個別に対処後に再削除 |
CloudFormationスタックの削除は、インフラのライフサイクル管理において重要な操作です。特に本番環境では、削除前の十分な確認と適切な準備が欠かせません。
今回紹介した注意点と対処法を理解しておくことで、安全かつ確実にスタックの削除を行い、クリーンなAWS環境を維持できます。また、適切なDeletionPolicyの設定により、重要なデータの意図しない削除を防ぐことができます。
次回は、CloudFormationのネストスタックとクロススタック参照について詳しく解説する予定です。お楽しみに!
この記事が役に立った方は、ぜひ「いいね」や「ストック」をお願いします!