⚒️

Terraform を数年やってから CDK に戻ってきた今の所感

2024/01/20に公開

AWS リソースを構築する際の Terraform と CDK の使用感に関する記事です。
2024/1 現在の所管ということで、さっくり書いていきます。

はじめに

CDK / Terraform のメリデメをまとめた記事の中でぼくの感覚に一番近かったものを貼っておきます。具体的な話が知りたい方はこちらを読んでいただくと良いと思います。

https://qiita.com/luton-mr/items/afe70781807bf3b5016a

ぼくはこの記事読んで「もうこれでいいじゃん」ってなったので、頑張って細かい話をまとめるのは諦めて、より感覚に近い部分をまとめることにしました。

ほぼ独り言なのでご注意ください。

使用歴

一応、それぞれの使用歴について。

  • Terraform: 前職で 2 年半ほどプロダクション利用
  • CDK: 前々職の頃に副業で少し齧ったのち、最近ジョインした案件で使い始めて 2 ヶ月

なので流れとしては CDK ちょろっと → Terraform がっつり → CDK ちょろっと という感じ。

ちなみに副業で CDK 触る前は、CFn (CloudFormation) テンプレートをベタ書きしたり、Serverless Framework 使ったりもしてました。

結論

新規プロジェクトやるなら CDK for Terraform 使ってみたい。

どういうこと

使用感について、と言いながら結論が突拍子もないですね。
順を追って説明します。

基本的に Terraform がいい

現時点でぼくは Terraform >>> CDK という立場です。

ツールへの習熟度が多分に影響していると思われるので参考になるかは分かりませんが、感覚的なところから共有すると、Terraform は「思い通り軽快に操作できる」ツール、CDK は「(強力だが) 重たく取り回しが悪い」ツールというイメージ。

Terraform がナイフだとしたら、CDK は銃って感じでしょうか。(武器の例えしか思いつかなかったもので、物騒ですみません)これは Terraform が AWS API を直接呼び出す & 独自にステート管理をする仕組みを採用している一方で、CDK が CFn (CloudFormation) をベースに作られていることに由来しています。

例えばデプロイスピード。触ってもらえばすぐに分かりますが、段違いです。
Terraform の方が圧倒的に速い。

あるいはステートの管理。
Terraform ではステートを直接修正するコマンドが色々用意されています。(state mv state rm import など) これにより、コードのリファクタをする際、実態のリソースに不要な影響を与えることなく簡単に変更を行うことができます。

しかし CDK では気軽にステートをいじることができません。ステート上の ID を修正すれば、必ずリソースが再作成されます。ID だけサクッと直すとかできないので、気軽にコードのリファクタがし辛い印象です。

もちろん、ステートを気軽に触れないようになっている CDK の方が正しい、という考え方はあると思います。ただ個人的にはリファクタを日常的に繰り返しながら開発することが多いので、ちょっと定義の構造を変えようとしたらすぐにリソースが再作成されてしまう、という状況はやや動き辛いなあという印象です。

考えることの少ない CDK の良さ

とはいえ、CDK に触れていていいな、と思うこともあります。

よく言われることですが、まず記述量が少ない。べらぼうに減る。
resourceA.grant(resourceB) みたいな書き方で IAM Role の作成と権限の追加が勝手にされるのとかは、結構衝撃的ですね。

元々 CFn テンプレートをベタで書いてたこともあるし、細かいパラメータ入れていくのとか全然苦ではないタイプです。ですが CDK の楽さを知った上で Terraform 使って Lambda 用の IAM Role とか書いてると「めちゃくちゃめんどくさいやんけ」という気持ちになります。

信頼ポリシー書いて、ロール作って、実行用権限渡して、必要なリソースへのアクセス権限渡して、、、もうなんかいい感じにしといてくれ。

あとは TypeScript で CDK を扱っていますが、型ヒントは本当にありがたい。
Terraform 使っているとドキュメントと睨めっこして設定値の形式とか把握していく必要がありますがそういう苦労がないのは良い。特に初めて定義書くリソースの時とかは重宝しますね。

記述量が減る / 型ヒントで入力支援してくれる = 考えることを減らしてくれるのが CDK の良さ。
リソースの定義をガシガシ書いていくタイミングでは、CDK の開発体験の良さは圧倒的です。

いいとこ取りしたい

思い通りに取り回せて運用時の負担が少ない Terraform、
強力なアシストで考えることを減らし、圧倒的な開発体験を提供する CDK、

得意分野がそれぞれ異なるので、いいとこ取りをしたい。
そんなわけで、CDK for Terraform を使ってみたいなと思ったのでした。

本当に全然触ったことがないので、実際使ってみたら色々ツラミもあるのかな、という気はしますが、開発インターフェースは CDK で裏側が Terraform になるので、両方のツールに慣れていれば両方のいいところを享受できるのではないかなとぼんやり思っています。

直近、使う機会がなさそうですが、趣味で触ったりしつつ、また感覚変わってきたら記事にしようと思います。

Discussion