CloudFormation で作成したリソースの変更や削除の制御方法をまとめた
また json をガシガシ書く日が始まりそうです。那須です。
CloudFormation 便利ですね。ある程度決まった形の構成を作る時なんかはテンプレート準備しておけばすぐにその構成を作れます。 まあ作るのは簡単なんですが、更新や削除ってすでに運用に入っていると心理的にやりにくかったりしますよね。 たとえば、このリソースだけは絶対変更させたくない!とか、削除されたら困る!とか。
というわけで、CloudFormation で作成したリソースの更新や削除についてどんな制御ができるのか、自分の頭の整理を兼ねてまとめてみました。
スタックポリシーで更新&削除させない
スタック作成時にスタックポリシーを設定しておくと、指定された更新アクションができなくなります。 例えば、下記のように何も更新させないスタックポリシーを設定したとします。
{ "Statement": [ { "Effect": "Deny", "Action": "Update:*", "Principal": "*", "Resource": "*" } ] }
VPC で何か変更しようとすると…
そのまま進めると、スタックポリシーで拒否されてるよ!ってエラーが出てロールバックされます。
スタックポリシーを変更させない
じゃスタックポリシー変更しちゃえばいいんじゃないの?ということで、スタック更新時に一時的にスタックポリシーを上書きする場合があります。 これをやられたらダメな場合は、そのユーザに下記のような IAM ポリシーを適用しましょう。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": "cloudformation:SetStackPolicy", "Resource": "*" } ] }
その後、スタック更新の流れで、このようにスタックポリシーを設定します。
{ "Statement": [ { "Effect": "Allow", "Action": "Update:*", "Principal": "*", "Resource": "*" } ] }
するとスタックポリシーをいじることはダメ!とエラーがでます。
スタックを削除させない
スタックポリシーはスタック内のリソースが対象でしたが、CloudFormation はスタックそのものも削除できるのでこれも気をつけないとダメですね。 スタックポリシーでいくら削除アクションを拒否してたとしても、スタックそのものの削除に対しては無力です。
まず、スタックそのものを削除させたくない場合は、スタックの削除保護を有効にします。
削除保護の変更をクリックして
有効化します。
削除保護が有効になっているのがわかりますね。
削除保護が有効の場合は、スタックを削除しようとしてもこのように削除させてもらえません。
スタックの削除保護を変更させない
じゃあスタックの削除保護を無効にしてしまえばいいよね?ってことで、削除保護設定を変更されるとスタックを削除されてしまう可能性がありますよね。 それを防ぐために、IAM ポリシーで削除保護の設定変更を下記のように制御します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Deny", "Action": [ "cloudformation:UpdateTerminationProtection" ], "Resource": "*" } ] }
この IAM ポリシーがついているユーザで削除保護の設定を変更しようとすると、このようなエラーになって削除保護設定を変更できなくなります。
スタックが削除されてしまってもリソースは削除しない
ミラクルが起きてスタック削除されてしまう可能性はないの?本当に!?と心配な方もいらっしゃるかと思います。 私もわりと心配性なので、可能性は0ですよ!って言い切る自信はまあないです。 そんな方のために DeletionPolicy があります。
例えば NACL で絶対守らせたい内容があって、それだけは削除させたくない!って場合は、下記例のように "DeletionPolicy" : "Retain" を対象リソースに追加しておきます。全部削除されたくないなら、全リソースに追加するだけです。
{ "Type": "AWS::EC2::NetworkAcl", "DeletionPolicy" : "Retain", "Properties": { "VpcId": { "Ref": "VPC" }, "Tags": [ { "Key": "Name", "Value": "mecha-daiji" } ] } }
頻繁に更新や削除を制御する場面はないかもしれないけど
知らないより知ってた方がいざという時にすぐ対応できるのでいいですよね。