sorta kinda...

主にAWS関連ですが、これに限らずいろいろ勉強したことや思ったことを書いていきます。

CloudFormation で作成したリソースの変更や削除の制御方法をまとめた

また json をガシガシ書く日が始まりそうです。那須です。

CloudFormation 便利ですね。ある程度決まった形の構成を作る時なんかはテンプレート準備しておけばすぐにその構成を作れます。 まあ作るのは簡単なんですが、更新や削除ってすでに運用に入っていると心理的にやりにくかったりしますよね。 たとえば、このリソースだけは絶対変更させたくない!とか、削除されたら困る!とか。

というわけで、CloudFormation で作成したリソースの更新や削除についてどんな制御ができるのか、自分の頭の整理を兼ねてまとめてみました。

 

スタックポリシーで更新&削除させない

docs.aws.amazon.com

スタック作成時にスタックポリシーを設定しておくと、指定された更新アクションができなくなります。 例えば、下記のように何も更新させないスタックポリシーを設定したとします。

{
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "Update:*",
            "Principal": "*",
            "Resource": "*"
        }
    ]
}

VPC で何か変更しようとすると…
f:id:nasrinjp1:20180815003102p:plain

そのまま進めると、スタックポリシーで拒否されてるよ!ってエラーが出てロールバックされます。
f:id:nasrinjp1:20180815003110p:plain

 

スタックポリシーを変更させない

docs.aws.amazon.com

じゃスタックポリシー変更しちゃえばいいんじゃないの?ということで、スタック更新時に一時的にスタックポリシーを上書きする場合があります。 これをやられたらダメな場合は、そのユーザに下記のような IAM ポリシーを適用しましょう。

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

その後、スタック更新の流れで、このようにスタックポリシーを設定します。
f:id:nasrinjp1:20180815003553p:plain

{
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "Update:*",
            "Principal": "*",
            "Resource": "*"
        }
    ]
}

するとスタックポリシーをいじることはダメ!とエラーがでます。
f:id:nasrinjp1:20180815003602p:plain

 

スタックを削除させない

docs.aws.amazon.com

スタックポリシーはスタック内のリソースが対象でしたが、CloudFormation はスタックそのものも削除できるのでこれも気をつけないとダメですね。 スタックポリシーでいくら削除アクションを拒否してたとしても、スタックそのものの削除に対しては無力です。

まず、スタックそのものを削除させたくない場合は、スタックの削除保護を有効にします。

削除保護の変更をクリックして
f:id:nasrinjp1:20180815002259p:plain

有効化します。
f:id:nasrinjp1:20180815002308p:plain

削除保護が有効になっているのがわかりますね。
f:id:nasrinjp1:20180815002317p:plain

削除保護が有効の場合は、スタックを削除しようとしてもこのように削除させてもらえません。
f:id:nasrinjp1:20180815002324p:plain

 

スタックの削除保護を変更させない

じゃあスタックの削除保護を無効にしてしまえばいいよね?ってことで、削除保護設定を変更されるとスタックを削除されてしまう可能性がありますよね。 それを防ぐために、IAM ポリシーで削除保護の設定変更を下記のように制御します。

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

この IAM ポリシーがついているユーザで削除保護の設定を変更しようとすると、このようなエラーになって削除保護設定を変更できなくなります。
f:id:nasrinjp1:20180815002813p:plain

 

スタックが削除されてしまってもリソースは削除しない

docs.aws.amazon.com

ラクルが起きてスタック削除されてしまう可能性はないの?本当に!?と心配な方もいらっしゃるかと思います。 私もわりと心配性なので、可能性は0ですよ!って言い切る自信はまあないです。 そんな方のために DeletionPolicy があります。

例えば NACL で絶対守らせたい内容があって、それだけは削除させたくない!って場合は、下記例のように "DeletionPolicy" : "Retain" を対象リソースに追加しておきます。全部削除されたくないなら、全リソースに追加するだけです。

{
    "Type": "AWS::EC2::NetworkAcl",
    "DeletionPolicy" : "Retain",
    "Properties": {
        "VpcId": {
            "Ref": "VPC"
        },
        "Tags": [
            {
                "Key": "Name",
                "Value": "mecha-daiji"
            }
        ]
    }
}

 

頻繁に更新や削除を制御する場面はないかもしれないけど

知らないより知ってた方がいざという時にすぐ対応できるのでいいですよね。