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

むっちゃ簡単!CloudFormation テンプレートの json/yaml 変換

AWS でひたすらリソースを作っては消すを繰り返している那須です。

CloudFormation テンプレートって jsonyaml で書きますが、最初 json で書いててやっぱり yaml で書くべきやったなーって思う時ありませんか? yaml はコメントが書けたり json を比べてカッコとか書かなくていいので余計なことでエラーを出さなくて済むのでいいですよね。

json から yaml に変換するツールやサービスって探すといっぱいあるんですが、yaml から json に変換するようなものって意外と少ないので、このあたり自由に変換できたらいいのになーと思ってたら、、、ありました。ので紹介しましょう!

 

CloudFormation デザイナーっていいな

AWS リソースのアイコンをドラッグ&ドロップするだけでテンプレートを作成してくれる便利なのがデザイナーです。本来の用途はテンプレート作成ですが、この json / yaml 変換がなかなか優秀なのですよ。

CloudFormation コンソールに行くと、「テンプレートのデザイン」ボタンがあるので押します。 f:id:nasrinjp1:20180527112612p:plain

すると、上半分が AWS リソースアイコンを置くエリア、下半分がその結果作成されるテンプレートのエリアです。テンプレートエリアで直接編集できるので、そこに基となる jsonyaml をコピペします。そして「テンプレートの言語の選択」で切り替えるだけで json/yaml が変換できますよ。

json を選択してる状態で json でテンプレートを書きます。 f:id:nasrinjp1:20180527112624p:plain

そして、そのまま yaml を選択するだけでテンプレート言語が yaml になります! f:id:nasrinjp1:20180527120110p:plain

もちろん、yaml から json にもできますよ。

 

まとめ

要件次第で言語を切り替えられるので、最初はやりやすい言語でテンプレート作成したほうが精神衛生上もよいですね!

 

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

今は BeeX に所属しているのですが、BeeX は SAP だけやってるのではなく、AWS や Azure の仕事も山ほどあります。心の底から一緒に楽しんで前に進んでくれる仲間を募集中です!↓の採用ページからでもどこからでもいいので、とりあえず話だけでも聞いていただければとても嬉しいです!あなたからの連絡を待ってますよー! www.beex-inc.com