CloudFormation Stackの削除を防止する機能についてまとめてみた

2023.08.07

はじめに

削除してはいけない CloudFormation スタックを誤って削除してしまった経験、みなさんはお持ちでしょうか。私はあります。

AWS のナレッジセンターでは、CloudFormation スタックの削除を防止する機能に関して以下のナレッジが公開されています。

CloudFormation スタックのリソースを誤って削除または更新しないように保護する | AWS re:Post

CloudFormation スタックのリソースを削除または更新することを防ぐためには、次のことができます。

・DeletionPolicy 属性を設定して、スタックレベルで個々のリソースが削除されないようにします。
・AWS Identity and Access Management (IAM) ポリシーを使用して、スタックとそのリソースを削除または更新するユーザーの権限を制限します。
・スタックリソースの更新を防ぐためにスタックポリシーを割り当てます。
・ユーザーが AWS CloudFormation コンソールまたは AWS Command Line Interface (AWS CLI) からスタックを削除できないようにするために、削除保護を有効にしてください。

要約すると、以下の 4 つの方法が考えられるようです。

・DeletionPolicy 属性を設定する方法
・IAM ポリシーで制限する方法
・スタックポリシーで更新を防ぐ方法
・削除保護を有効にする方法

これらの方法について、以下まとめてみようと思います。

DeletionPolicy 属性を設定する方法

CloudFormation テンプレートの DeletionPolicy 属性 を記述する方法です。
簡潔に言うと、スタックの削除時にリソースは削除されずに残すことができます。
Retain,RetainExceptOnCreate,Snapshot,Delete の4種類を記述することができます。
DeletionPolicy 属性を明示しない場合、デフォルトでDeleteが適用されています(スタックを削除するとリソースも削除される)。
各タイプの動作の詳細は以下のブログが参考になります。

また、DeletionPolicy 属性を後から変更したい場合は、以下のブログが参考になります。

なお、DeletionPolicy 属性はスタック自体の削除を防ぐ訳ではありません。
そのため、スタックを削除した後、リソースを再度 CloudFormation にて管理したい場合は、リソースをインポートする必要があります

インポート機能の利用には、インポートするリソースを含む、スタック全体を記述したテンプレートが必要となります。
再度テンプレートを記述する必要がある場合は、Former2 を使用することもできます。Former2 を使用すると構築済みのリソースのテンプレートを自動で作成することができます。
Former2 の詳細は以下のブログをご参照ください。

一方で、インポート機能に対応していないリソースも存在します。
インポート機能に対応しているリソースは以下のドキュメントから確認することができます
(ドキュメントに記載のないリソースはインポート機能に対応していません)。

Resources that support import and drift detection operations - AWS CloudFormation

従って、DeletionPolicy 属性によってリソースが削除から保護されたとしても、リソースがインポート機能に対応していない場合、リソースを再度 CloudFormation にて管理することはできないものとなります

IAM ポリシーで制限する方法

CloudFormation の機能を利用するわけではなく、単純に IAM ポリシーの記述でスタックの削除を防ぐ方法です。

AWS Identity and Access Management によるアクセスの制御 - AWS CloudFormation

スタックの削除を制限する場合、基本的には以下の記述になるかと思います。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "cloudformation:DeleteStack"
            ],
            "Resource": "*"
        }
    ]
}

特定のスタックの削除を制限したい場合は、以下のような記述となります。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Deny",
            "Action": [
                "cloudformation:DeleteStack"
            ],
            "Resource": "arn:aws:cloudformation:<リージョン名>:<アカウントID>:stack/<スタック名>/*"
        }
    ]
}

スタックポリシーで更新を防ぐ方法

スタックポリシーを適用することで、スタックの更新を防ぐ方法です。
マネジメントコンソールからスタックポリシーを適用したい場合は、スタック作成時の"詳細オプション"から設定することができます。

注意点として、スタックポリシーではスタック自体の削除を防ぐことはできません
スタックポリシーはあくまでもスタックの更新時のみに適用されるポリシーとなるためです。

スタックのリソースが更新されないようにする - AWS CloudFormation

スタックポリシーは、スタックの更新時のみ適用されます。AWS Identity and Access Management (IAM) ポリシーのようなアクセスコントロールは提供しません。特定のスタックリソースを誤って更新しないように、スタックポリシーはフェイルセーフメカニズムとしてのみ使用してください。AWS リソースまたはアクションへのアクセスを制御するには、IAM を使用します。

例えば、スタックポリシーのアクションUpdate:Deleteは、「スタックで作成されたリソースの削除が発生するような更新アクション」を防ぐポリシーです。
そのため、"リソースの手動削除"や"スタックの削除"を防ぐことはできません。
スタックの削除を防ぎたい場合は、スタックポリシー以外の方法を利用する必要があります

削除保護を有効にする方法

スタックの削除保護を有効にする方法です。
他の方法と比べても簡単に有効/無効化することができると思います。

削除保護が無効化されることを防ぎたい場合は、cloudformation:UpdateTerminationProtection アクションの権限を拒否する形で、任意のポリシーに記述してください。

スタックの削除保護 - AWS CloudFormation

スタックの削除保護を有効または無効にするには、cloudformation:UpdateTerminationProtection アクションの権限が必要です。

まとめ

CloudFormation のスタックの削除を防止する機能についてまとめてみました。
それぞれの方法に特徴があるので、一概にどの方法が良いと言えるわけでもないかと思います。
また、複数の方法を併用することも可能です。
要件に応じて利用する方法を検討していただければと思います。

アノテーション株式会社について

アノテーション株式会社は、クラスメソッド社のグループ企業として「オペレーション・エクセレンス」を担える企業を目指してチャレンジを続けています。「らしく働く、らしく生きる」のスローガンを掲げ、様々な背景をもつ多様なメンバーが自由度の高い働き方を通してお客様へサービスを提供し続けてきました。現在当社では一緒に会社を盛り上げていただけるメンバーを募集中です。少しでもご興味あれば、アノテーション株式会社WEBサイトをご覧ください。