AWSクラウドサーバで用いるIaCツールはCDKとTerraformのどちらが良いのか?
こんにちは!はじめまして!
パナソニックITSにてAWSのアーキテクチャ設計を担当している横尾です。
今回は、あるプロジェクトのIaC(Infrastructure as Code)ツールとしてCDKとTerraformを使用し比較した結果をご紹介します。プロジェクトのIaCツールとしてCDKとTerraformのどちらを使用するか迷っている方のご参考になれば嬉しいです。
プロジェクトごとに状況は違うため、あくまで事例の一つだと思って聞いていただけると幸いです。
CDK vs Terraformの比較結果
初めに結論です。
CDK:小規模なお試し環境構築に向いている
Terraform:大規模プロジェクトに向いている
自分は上記のようにツールごとに適している場面が違うように思いました。
なぜ適している場面が異なっているのか?については、プロジェクトで実際に発生した問題を交えて順に説明していきます。
問題1:CloudFormationは1スタックのリソース数上限がある
プロジェクト立ち上げ時に以下の理由によりCDKを採用しました。
Terraform / CloudFormation / SAMに比べると記述量が少なく、開発スピードが上がる
自己解決できない問題はAWSサポートの支援を受けることが可能
社内でCDKの使用経験者がいた
プロジェクトの当初は私自身もクラウド初心者であり、AWSを業務で扱うことは初めてだったため、とりあえずCDKで進めてみようとなりました。
苦労しながらもCDKを用いてAWS環境の構築を行っていき、一年ほど経過したある日、問題は突然発生しました。
CDKのデプロイ時に以下のエラーが発生し、AWS環境への反映ができなくなりました。
“Template format error: Number of resources, 520, is greater than maximum allowed, 500”
CDKはデプロイ時にCloudFormationのスタック作成処理が作動します。CloudFormationのスタックには1スタックにつきリソース数500個の上限(※2024年12月現在)があり、この上限を超えてしまったことによりエラーが発生しました。
出典:CloudFormation クォータを理解する - AWS CloudFormation
上限の情報は知っていたのですが、まさか500個を超えるとは思ってもいなかったというのが本音です。
問題に対してはNested Stackを使用することでスタックを2つに増やし上限を超えないように対策を行いました※2。しかし、一時的に問題を回避しただけであり、プロジェクトが拡大しリソース数が合計1000個以上に増加した場合にまた対策を行う必要があります。
以上がCDKでクラウドサーバ構築し運用していく中での最初の問題でした。
参考記事:https://dev.classmethod.jp/articles/cdk-stack-splitting-nested-stack-solution/
問題2:外部ツールとCDKの連携が困難なユースケースがある
問題1の対策を行った1か月後に次の問題が発生しました。
GitHubとAWSを連携させて開発を行いたい機能が出てきた際に、次のユースケースで連携が難しいと感じるパターンに出会いました。
GitHub Actionsを使用してCDKで生成したAWSリソースの設定値を変更した場合、その後のCDKデプロイが通らなくなります。
CDKで生成したリソースはCDKで制御しなくてはならず、外部ツールから変更を行うと変更点を検知してデプロイ時にエラーになってしまいます(図1)。
こちらの問題を解決するために調査を行ったものの、CDKで解決できても、構成が複雑化・管理コストが上がる方法しか見つかりませんでした。
調査の中で、Terraformを使用すればすぐに解決できることが判明したため、今回の機能のみTerraformを使用することにしました。
Terraformの場合、予め外部から変更される可能性があるリソースに設定を行ってデプロイすることが可能です(図2)※3。この設定を行えば、GitHub ActionsでTerraformが生成したリソースに変更を加えた後もTerraformのデプロイは正常に動作し続けます。
外部ツールの連携をしたい場合は、ユースケースによってはCDKだと生成リソースとの依存度が高く、ツール導入が難しいケースがあると思いました。
まとめ
プロジェクトの中でCDKとTerraformを使用してみて気づいたメリット/デメリットを下記にまとめました。
CDKのメリット
言語の選択肢が多い
少ない記述量で多くのリソースを作成可
AWSサポートからの支援可能
CDKのデメリット
1スタック500リソースの制限
外部ツールと相性が悪い
新しいサービスのため情報が少ない
生成リソースとの依存度が高く、問題発生時の解決コストが高い
Terraformのメリット
生成リソース数に制限無し
外部ツールと相性が良い
情報が多く最善策がすぐに見つかる
生成リソースとの依存関係が低く問題発生時になんとでも対策できる安心感
Terraformのデメリット
独自言語のため、学習コストがかかる
AWSサポートからの支援不可
記述量がCDKに比べると多い
したがって、拡張性や環境のアップデートが必要のないお試し環境や小中規模のプロジェクトの作成であればCDK(とNested Stackの合わせ技)、将来的な拡張性や柔軟性を備えた環境のアップデートを行っていくような大規模プロジェクトはTerraformが向いていると思いました。
クラウド環境において、システムの開発のみならず運用やアップデートを継続して取り組むためにも、IaCは必須となる技術だと思います。今後もそれぞれのツールの比較検討を進め、最適なものを選択できるようにしていきたいと思います!