1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

CloudFormationスタックの削除保護を一括で有効化するシェルスクリプト

Posted at

はじめに

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_COMPLETE
  • UPDATE_COMPLETE
  • ROLLBACK_COMPLETE
  • UPDATE_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 で確認してから実行してください。

誤削除による障害を未然に防ぐため、ぜひ活用してみてください。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?