cfn-lint の使い方を覚えた!
これを書いている時間はラスベガス時間 2:00am です。めちゃ眠いけどあと 3 時間でチェックアウトして移動です。。那須です。
re:Invent でワークショップにも参加してみました。 ワークショップ参加するなら、簡単なものじゃなくて難しいやつがいいなー&今興味があるものがいいなーと思って探していたら、CloudFormation のテンプレートを動的に作成するっぽいものを見つけたのでこれにしてみました。
参加してみたらちょっと思ってたんと違うなって思ったんですが、内容はすごくよかったので内容を紹介しますね。 ちなみに写真は撮り忘れました。。
セッション名
DEV418-R1 - [REPEAT 1] Programming Dynamic AWS CloudFormation Templates
ワークショップの内容
資料とサンプルコードをダウンロードして、それを基に進めていきました。
- Lab1: マクロを使って S3 バケットを 3 つ作成する
- Lab2: カスタムリソースとマクロを使って Lab1 で作成した S3 バケットに 3 つずつオブジェクトを作成する
- Lab3: cfn-lint を使って作成したテンプレートの構文チェックする
Lab1
Lab1 は以前にマクロについて記事を書いた時に仕組みもおさえたので楽勝でした。 AWS CLI でCloudFormation デプロイするのは初めてでしたね。
Lab2
Lab2 はカスタムリソースで S3 オブジェクトを作成するのですが、実際のカスタムリソースを作成するコードは初めて見たので、ちょっと時間がかかりましたがなんとか完了できました。
マクロの処理部分となる Lambda 関数が AWS Serverless Application Model (SAM) と呼ばれるツール?で作成する流れになっていて、え?何これ?って思いながら必死で調べましたよ!
そもそも SAM とは?というところからワークショップの時間内で調べてしまったのでさらに時間がかかったのですが、いつも頼りにしているブログを見つけて事なきを得ましたw
クラスメソッドさん、本当にいつもありがとうございます!
仕組みはだいたいわかったので、近いうちに自分でも SAM を使って何か書いてみるつもりです。
Lab3
わざと構文間違えた CloudFormation テンプレートを準備して、cfn-lint でチェックするという内容でした。
まずは cfn-lint をインストールするところからです。 普通に pip で入れます。これだけです。もちろん Python3 がインストールされていることが前提条件ですよ。
pip3 install cfn-lint
ワークショップで使ったサンプルがいまいち実感わかなかったので、過去に自分で作成した EC2 インスタンス作成テンプレートをちょこちょこっと内容を変えて、cfn-lint でチェックしてみます。
$ cfn-lint create_ec2_invalid.json E4001 Metadata Interface has invalid property ParameterGroup create_ec2_invalid.json:5:13 W2001 Parameter HostName not used. create_ec2_invalid.json:59:9 W7001 Mapping ImageId not used create_ec2_invalid.json:128:9 E1012 Ref Hostname not found as a resource or parameter create_ec2_invalid.json:207:25
おー、ちゃんと間違えて書いたところがひっかかっただけでなく、自分では気づいてなかったことまで指摘してくれましたw これは嬉しいです!
Metadata Interface has invalid property ParameterGroup は、ParameterGroup なんてプロパティはないよ!と言っています。 実際には ParameterGroups と入れるところを最後の s を消したので、チェックできてますね。
Parameter HostName not used と Ref Hostname not found as a resource or parameter はセットで、パラメータでは HostName としてるのに参照時に Hostname と N を小文字にしてしまっているので、これもチェックできてます。
Mapping ImageId not used は、そんなマッピングどこにも使われてないよ!って言われてます。 これ気づいてませんでしたw 使われてないだけで害はないのですが、知らない人がこのテンプレートを見た時に「このマッピング何?」ってなるので、できればきれいにしておきたいですね。
上記の指摘を修正して再実行すると何もレスポンスがなく実行完了するので、これでチェック完了になります。
感想
Python か何かでテンプレートを自動作成するものとばっかり思い込んで参加してみたらこの内容だったので、「あれ?」ってなったんですが、SAM と cfn-lint のことを知れただけでなく実物を見ることができていい時間になりました。 今まで何回も AWS コンソールで実際にデプロイしようとしてエラーになってたので結構手間だったんですが、cfn-lint で事前にチェックしておけば何回もコンソール画面を行き来しなくてもいいですね。 積極的に使っていこうと思います!
来年 re:Invent に行く人は是非ワークショップに参加してみてください。聞くだけのセッションよりもいい時間になると思いますよ!
CloudFormation の Custom Resource についてのチョークトークに参加しました
まさかの腹痛で re:Play 行くのやめました。とても残念です。那須です。
21:00 くらいには治まってたんですが、翌朝むちゃくちゃ出発時間が早かったのと、パーティの途中でまた体調悪くなったら最悪やなと思ってやめました…
あと 7 時間程度でホテルをチェックアウトして帰国開始です。 長いようで短い 1 週間でしたがいろんな収穫があったので、本当に参加してよかったと思います。 まだ一度も参加したことがない人は、是非来年の re:Invent に行ってみてください! こんなに有意義かつ楽しいイベントは他にはないと思いますよ!
今回はちょっと気になっていた CloudFormation のカスタムリソースについてのチョークトークに参加してきたので、その内容をまたざっくりとお伝えします。
セッション名
DEV417-R1 - [REPEAT 1] Build AWS CloudFormation Custom Resources (Chalk Talk)
こんな内容だった
最初にカスタムリソースとは何ぞや?の説明がありました。次の話題と重複するのでここでは省略します。
次に、カスタムリソース、マクロ、DSLやCDKとの違いについての説明です。 ものすごくおおざっぱに書くと↓こんな感じです。
- カスタムリソース:CloudFormation がサポートしてないリソースを作成する
- マクロ:CloudFormation がサポートするリソースを作るけどもうちょっと柔軟に定義する(繰り返しとか
- CDK:それ用の言語というかコマンドでリソースを作成する(CloudFormation の画面とかは触らない
カスタムリソースってこんな感じで書くよーというお話。 実際にデモを見せてもらいました。 リソース名を入れると勝手にフォーマットが補完されて入力されるようにしてたので、そこが一番感動しましたw
サンプルとかフレームワークは既にあるから、1 からコード書かなくてもいいよ、って話。
カスタムリソース使ってる例がいくつかあるのでその紹介です。 最後に CloudFormation カスタムリソースでライトを点ける動画を紹介してくれました。 こんなこともできるんですねw
Done. @AWSCloudFormer controlling #SmartHome light bulbs pic.twitter.com/TNPkCsFD2d
— Ben Kehoe @ reInvent (@ben11kehoe) May 1, 2017
最後に
カスタムリソースを使えば、CloudFormation でサポートされていないリソース(AWS以外もOK)を作成できることが分かりました。 一度カスタムリソースのサンプルをいろいろ見て、少しずつ試していこうと思います。