sorta kinda...

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

CloudFormation ってリソースの更新ができるんだ

CloudFormation ってすげーなって本気で思い始めてる那須です。マジで。

今まで、CloudFormation といえばリソースを作成したりいらなくなったら削除したりするしかできないと思ってたんですが、特定のものは更新ができました。更新ができると運用でも使えるんじゃないかと思いますね。

 

気づいたきっかけ

SNSトピックのポリシーってありますよね? 例えば AWS Config から SNS に投げたりする場合に、SNS 側でトピックポリシーを調整しないといけないのですが、全リージョンで Config 有効にしてたら SNS も全リージョンでトピックポリシーを調整しないといけません。やってられません。

あー CloudFormation のスタックセットで全リージョン一気にトピックポリシーだけ更新できたらなあ…

 

ふと AWS ドキュメントを見てみた

docs.aws.amazon.com
f:id:nasrinjp1:20180531224915p:plain

更新に伴う要件: 中断はありません。

docs.aws.amazon.com

中断を伴わない更新
AWS CloudFormation は、リソースの使用を中断することなく、またリソースの物理 ID を変更することなく、リソースを更新します。たとえば、AWS::CloudTrail::Trail リソースの任意のプロパティを更新すると、AWS CloudFormation は中断せずに証跡を更新します。

なるほど。

 

半信半疑でやってみた

更新したいトピックポリシーの更新前の内容です。Principal が * になっているので、これを変更したいとします。

f:id:nasrinjp1:20180531225720p:plain

トピックポリシーを更新する内容のテンプレートを準備します。スタックセットで全リージョンで実行するので、AWS アカウントやリージョンは疑似パラメータを使います。

{
    "AWSTemplateFormatVersion": "2010-09-09",
    "Resources": {
        "test": {
            "Type": "AWS::SNS::TopicPolicy",
            "Properties": {
                "PolicyDocument": {
                    "Version": "2008-10-17",
                    "Id": "__default_policy_ID",
                    "Statement": [
                        {
                            "Sid": "__default_statement_ID",
                            "Effect": "Allow",
                            "Principal": {
                                "AWS": {
                                    "Ref": "AWS::AccountId"
                                }
                            },
                            "Action": [
                                "SNS:*"
                            ],
                            "Resource": {
                                "Fn::Sub": "arn:aws:sns:${AWS::Region}:${AWS::AccountId}:config-topic"
                            },
                            "Condition": {
                                "StringEquals": {
                                    "AWS:SourceOwner": {
                                        "Ref": "AWS::AccountId"
                                    }
                                }
                            }
                        }
                    ]
                },
                "Topics": [
                    {
                        "Fn::Sub": "arn:aws:sns:${AWS::Region}:${AWS::AccountId}:config-topic"
                    }
                ]
            }
        }
    }
}

これをつかって CloudFormation を実行すると…

f:id:nasrinjp1:20180531225841p:plain

おー!更新できた!!

 

というわけで

更新できちゃいました。CloudFormation のリソース説明に↓が書いてあると更新できますね。

更新に伴う要件: 中断はありません。

 

気になってること

更新できたのはいいのですが、「あ、間違えた」って場合に CloudFormation スタックを削除する場面があると思います。今回も一応削除して元にもどるかやってみたらこうなりました。

f:id:nasrinjp1:20180531231917p:plain

更新した箇所は元に戻ってたんですが、全然関係ない Condition の中身がなんか変わってました。このままでもいいのかどうかは謎です。ま、CloudFormation スタックを削除しなければいいよね。変更履歴にもなるし。

 

一緒に楽しくクラウドを使いまくってくれる仲間を募集中

BeeX は SAP だけやってるのではなく、AWS を中心としたクラウドの仕事も山ほどあります。心の底から一緒に楽しんで前に進んでくれる仲間を募集中です! ↓の採用ページからでも私への twitterFacebook でのコンタクトでもどこからでもいいので、気軽にご連絡いただけるととても嬉しいです!あなたからの連絡を待ってますよー!

www.beex-inc.com