※ 専門家ではなく一利用者の意見であることに注意してください
実装から間もないリソースや設定が管理できない
terraformはクラウドプロバイダのAPIと.tfの繋ぎ込みをするツールに過ぎないため、繋ぎ込み部が実装されていない場合は当然terraformで管理することができない。 新しく追加されたリソースはもちろん、既存のリソースに対して新しく設定が追加された場合などもterraformで管理することができない。
terraformで管理している設定と管理されていない設定が混在しうる
IaCに求められる重要な役割として「網羅性」が挙げられると思う。 terraformにおいては当然、全てのインフラが.tfに記述されていることが期待されると思うが、実際の運用では必ずしもそうならない。 GUIからぽちぽちしないと作れない類のリソースや設定というのは割とあって、それらはterraformで管理できず、網羅性が担保できない。
ドキュメントを隅々まで読む必要がある
terraformにリソースを追加、あるいは変更しようと思った場合にドキュメントを隅々まで読む必要がある。
例えばbigquery_dataset_iamを見て欲しい。
ドキュメントにはWarnような形でさまざまなNoteが記載されているのだが、このルールに則らない場合、apply(反映)と同時に全てのBQデータセットに対する権限が剥奪されるという挙動が起きる。 こうした罠のような仕様というのはぼちぼちあって、terraformの真っ当な利用者はドキュメントを隅々まで読むことが常に求められる。
ドキュメントを読むことは該当のリソースに対する仕様を全て理解することと等しいため、terraformの勉強というのは基本的に終わりがなく、ちゃんと使おうと思えば思うほど辛い。 当然キャッチアップもしんどい。
また、バグもそれなりにあるため挙動がおかしければ実装を読みにいく必要がある。
よくあるユースケースでローカルからtfstateファイルに変更を加えなければならない
terraform importやterraform state rmといったコマンドは、tfstateに変更を加える際に利用される。 tfstateはterraformにおいてSSoTのような役割を果たしており、基本的にはこの内容に従ってクラウドプロバイダに変更が反映される。 リソースは同一だがAPIのバージョンが上がってマイグレーションしなければいけなくなった場合などに、これらのコマンドを使ってtfstateをいじらなければならない。 慣れていないと事故に繋がりやすく、さながら本番DBにALTER TABLEをかけているような緊張感がある。
権限が足りない場合、applyするまで分からない
.tfファイルをGitHubで管理し、applyはCircleCIやGitHub ActionsなどのCI/CDツールを用いて行うのがterraformの一般的な使い方である。 権限が足りているかどうかは実際にapplyしないと分からないので、引っかかると割とげんなりする。 planの段階で教えてくれたらいいのに、と常々思っている。