はじめに
AWS CloudFormationを使っていると、誤ってスタックを削除してしまうリスクがあります。特に本番環境のスタックを誤って削除すると、大きな障害につながる可能性があります。
CloudFormationには「削除保護(Termination Protection)」という機能があり、これを有効にすると誤削除を防ぐことができます。しかし、スタックが多数ある場合、1つずつ手動で設定するのは大変です。
そこで、全スタックの削除保護を一括で有効化するシェルスクリプトを作成しました。
スクリプト
#!/bin/bash
# CloudFormationスタックの削除保護を有効にするスクリプト
usage() {
echo "Usage: $0 [-p|--profile <profile_name>] [-r|--region <region>] [-d|--dry-run]"
echo " -p, --profile AWS CLIプロファイル名"
echo " -r, --region AWSリージョン (デフォルト: ap-northeast-1)"
echo " -d, --dry-run 実際には変更せず、対象スタックを表示するのみ"
exit 1
}
PROFILE_OPT=""
REGION="ap-northeast-1"
DRY_RUN=false
while [[ $# -gt 0 ]]; do
case $1 in
-p|--profile)
if [[ -z "$2" ]]; then
echo "Error: --profile requires a value"
usage
fi
PROFILE_OPT="--profile $2"
shift 2
;;
-r|--region)
if [[ -z "$2" ]]; then
echo "Error: --region requires a value"
usage
fi
REGION="$2"
shift 2
;;
-d|--dry-run)
DRY_RUN=true
shift
;;
-h|--help)
usage
;;
*)
echo "Unknown option: $1"
usage
;;
esac
done
echo "リージョン: $REGION"
echo "スタック一覧を取得中..."
echo ""
# スタック名一覧を取得(ネストされたスタックは除外)
STACKS=$(aws cloudformation list-stacks \
--stack-status-filter CREATE_COMPLETE UPDATE_COMPLETE ROLLBACK_COMPLETE UPDATE_ROLLBACK_COMPLETE \
--query 'StackSummaries[?ParentId==`null`].StackName' \
--output text \
--region "$REGION" \
$PROFILE_OPT)
if [[ -z "$STACKS" ]]; then
echo "対象のスタックが見つかりませんでした。"
exit 0
fi
# スタック数をカウント
STACK_COUNT=$(echo "$STACKS" | wc -w | tr -d ' ')
echo "対象スタック数: $STACK_COUNT"
echo ""
if [[ "$DRY_RUN" == true ]]; then
echo "[Dry-run モード] 以下のスタックが削除保護の対象です:"
echo ""
for STACK in $STACKS; do
echo " - $STACK"
done
exit 0
fi
# 各スタックの削除保護を有効化
SUCCESS_COUNT=0
FAIL_COUNT=0
for STACK in $STACKS; do
echo "削除保護を有効化中: $STACK"
if aws cloudformation update-termination-protection \
--enable-termination-protection \
--stack-name "$STACK" \
--region "$REGION" \
$PROFILE_OPT > /dev/null 2>&1; then
echo " ✓ 完了"
((SUCCESS_COUNT++))
else
echo " ✗ 失敗"
((FAIL_COUNT++))
fi
done
echo ""
echo "=== 結果 ==="
echo "成功: $SUCCESS_COUNT"
echo "失敗: $FAIL_COUNT"
使い方
1. スクリプトを保存して実行権限を付与
chmod +x enable_cfn_deletion_protection.sh
2. Dry-runで対象スタックを確認
まずは --dry-run オプションを使って、どのスタックが対象になるか確認しましょう。
./enable_cfn_deletion_protection.sh --profile your-profile --dry-run
実行結果:
リージョン: ap-northeast-1
スタック一覧を取得中...
対象スタック数: 10
[Dry-run モード] 以下のスタックが削除保護の対象です:
- my-app-production
- my-app-staging
- my-database-stack
...
ネストされたスタックは自動的に除外されます。
3. 削除保護を有効化
対象スタックを確認したら、--dry-run を外して実行します。
./enable_cfn_deletion_protection.sh --profile your-profile
実行結果:
リージョン: ap-northeast-1
スタック一覧を取得中...
対象スタック数: 10
削除保護を有効化中: my-app-production
✓ 完了
削除保護を有効化中: my-app-staging
✓ 完了
...
=== 結果 ===
成功: 10
失敗: 0
オプション一覧
| オプション | 説明 |
|---|---|
-p, --profile |
AWS CLIプロファイル名を指定 |
-r, --region |
AWSリージョンを指定(デフォルト: ap-northeast-1) |
-d, --dry-run |
実際には変更せず、対象スタックを表示するのみ |
-h, --help |
ヘルプを表示 |
対象となるスタック
以下のステータスのスタックが対象になります:
CREATE_COMPLETEUPDATE_COMPLETEROLLBACK_COMPLETEUPDATE_ROLLBACK_COMPLETE
除外されるスタック:
- 削除済みのスタック
- 作成中のスタック
-
ネストされたスタック(
ParentIdが設定されているスタック)
ネストされたスタックは親スタックから管理されるため、個別に削除保護を設定できません。親スタックの削除保護を有効にすることで、ネストされたスタックも間接的に保護されます。
注意点
-
ネストされたスタック: このスクリプトはネストされたスタックを自動的にスキップします。ネストされたスタックは親スタックの削除保護によって間接的に保護されます。
-
StackSets: StackSetsで作成されたスタックインスタンスも対象になりますが、StackSets自体の削除保護は別途設定が必要です。
-
削除保護の解除: 削除保護を解除するには、AWS CLIで以下のコマンドを実行します。
aws cloudformation update-termination-protection \ --no-enable-termination-protection \ --stack-name your-stack-name
まとめ
このスクリプトを使えば、多数のCloudFormationスタックの削除保護を簡単に一括設定できます。本番環境への適用前に必ず --dry-run で確認してから実行してください。
誤削除による障害を未然に防ぐため、ぜひ活用してみてください。