AWS CloudFormation 雑感

AWS CloudFormation(以下CloudFormation)は、AWS上でInfrastructure as Code(以下IaC)を実現する為にAWSが提供しているソリューション。
競合するプロダクトとしてはHashiCorpが提供しているTerraformが有名だと思う。

AWSでIaCしたい。となった場合どちらかが候補になることが多いと思う。
今回初めてCloudFormationを初めて書いたので特徴や雑感などを書いておく。
Terraformまだ未経験なので比較などはできていない。

ベンダーロックイン

CloudFormationとTerraformの一番の違いはこれになるだろう。
CloudFormationは、当然AWSに最適化されAWSにのみ適応可能なツール。
それに対してTerraformはサードパーティらしくAWS,GCP,Azureなどのクラウドサービスに対応している。

AWS以外の選択肢が存在するならばTerraformを選択するのが無難だろう。

AWS CloudFormation コンソール(GUI)の設定可能

CloudFormationではMetadataセクションが存在しておりその中にAWS::CloudFormation::Interfaceというグループを設定できる。
これはWebブラウザから操作するAWS CloudFormation コンソール上での振舞いを定義するグループで、
主にスタックのパラメータをCloudFormation コンソールから設定するときの表示順、ラベル名を設定することができる。

これを実現できることこそ、クラウドベンダーがIaCツールをリリースしていることの(ベンダー側の)利点であると思う。
個人的にはこの概念を理解するまでに多少の混乱があった。わざわざIaCをしてCUIベースに移行できたのにGUIにも関連を持つの?と
ちょっと理解した状態だとClougFormation コンソールでパラメータを設定する場合には、確かに設定されていたほうが優しいかもな?と少し思うときもある。

リソース作成後コード生成可能

正確に言うとこれはCloudFormationに限った話ではない。
というのも、以前AWSはCloudFormerという作成済みのリソースからCloudFormationのコードを生成するツールをβ版として公開していた。
だが、今利用しようとするとそもそも利用可能なテンプレートにCloudFormerが見当たらなかった。

Q: 永遠にベータのCloudFormerはいつアップデートされるんですか?
A: よく聞いてくれたね笑 残念ながらCloudFormarがこれからアップデートされることはありません。サードパーティ製のFormer2というWebベースのサービスがあるのですが、これが非常によくできているのでそれを使ってください。

[レポート]What’s New in AWS CloudFormation #reinvent #DOP408 | Developers.IO

公式なリリースは見つけられなかったがこういう記事も目に入ってきたのでFormer2を利用するというのが良いのだろう。
そのFormer2は当然CloudFormationのコードを生成することもできるし、Terraformのコードを生成することもできる。

その為、前述のベンダーロックインについてもそんなにリスクにはならないのではないだろうか(CloudFormationで作ったリソースのコードをFormer2でTerraformで吐けばよさそう)。

Ansibleを使ったとき自分が感じていたのは、基本的にコードが元で生成物がリソースという図式で、それが頭にこびりついていたので先にリソース作ってから生成可能という概念を頭に取り込めたのは収穫。

全リソースには対応していない

これはちょっと残念。遭遇した部分でいうとFormer2で生成したコードをCloudFormationにする際はインポートを行う。
既存のリソースとCloudFormationのスタックを関連づける物だが、このインポート時に関連づけたいリソースに非対応のものがあった。
Former2はそこのサポートもしてくれていて、対応リソースのみコード生成してくれるのはとても良い...(親切に対応してないから生成しませんでしたと注意もしてくれる)
が、非対応なリソースもあることが頭にないと少し戸惑うかもしれない。

まとめ

まず大前提として、IaCできていたほうがいいことは間違い無いと思っている。
その上で、TerraformではなくCloudFormationを選択することについては別に二者択一なわけではないのであまり気にしなくて良いかなと思う。