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 に行く人は是非ワークショップに参加してみてください。聞くだけのセッションよりもいい時間になると思いますよ!