💭

既存のインフラリソースをTerraformに組み込む時に気をつけてほしいこと。

2020/10/15に公開

スタートアップがよく組織を立ち上げるときにAWSのコンソールでがちゃがちゃしてその後にそれなりに組織が大きくなってきた時にインフラの構成や変更がしにくくなってきたからコード管理したいというニーズ、いわゆるIaCというのが一般的なものになってきました。

その中の選択されるツールとしてTerraformは一番の候補になってくるリソースかと思います。
そんなTerraformを実際に導入する際に既存のリソースをTerraformerを使用して管理しようとしたりしていると思いますが、そのTerraformerを使用した際に注意するべきことを個人の見解でまとめてみたので一つの意見として参考にしていただけたらと思います。

今回はAWSに主眼をおいて記事を書いていきます。

Terraformerでもってきた際の問題点

まずTerraformerで既存のリソースを持ってくる事自体はいいのですがその際に問題点としてサービスごとにしかリソースを吐き出してくれないことにあります。

たとえばec2のリソースはec2、rdsはrdsとそれぞれのサービスリソースに対してしか引っ張ってきてくれないです。
他のリソースはこのような振り分けで引っ張ってきてくれます。
https://github.com/GoogleCloudPlatform/terraformer#use-with-aws

この問題点として環境ごとに管理したい場合やサービスごとに管理したい場合などでわけたい事が多々あるかと思います。

Tagによる振り分け

上記の解決策としてTagでふりわける方法はあります。
たとえば env: devenv: prodと異なるTagを振り分けた2台のEC2インスタンスがあるかと思います。

このEC2インスタンスはそれぞれどちらかのTagを付与されていてコンソールからの検索の際はそのTagなどで絞り込みをすることができるかと思います。

https://docs.aws.amazon.com/ja_jp/ARG/latest/userguide/find-resources-to-tag.html

Terraformerでもそれを利用して--filterオプションを使用しdevはdev配下に、prodはprod配下になどの振り分けを実現することができます。
https://github.com/GoogleCloudPlatform/terraformer#filtering

こうすることによって環境毎にりそーすをわけることができます。
これも一つの解決策として有効になります。

最初の段階でディレクトリ構造を考えておく

Terraformを操るというのは実質tfstateを操るということとイコールです。
このtfstateはディレクトリごとに管理されるのが一般的でこの設計は後々にも響いてきます。

tfstateの分割などでリソースの管理方法を変更することができますが既存の環境を持ってきたものをリファクタするというのはかなり力のいる作業になるかと思いますし、アプリケーションは変更を作業ブランチでできるかと思いますがTerraformはtfstateそのものを変更することになるのでかなり勇気も必要です。

できれば僕は触りたくないですし平穏にそこはやりたいです笑
もちろん組織というのは変化しますしその中で最適化されたものはあると思います。

なので将来的に〜と考えすぎるよりも今の構成からちょっと未来の部分を考えるかもし今の関わっているプロジェクトのドメインの境界線がわかるのであればそれに沿って分割していくなどもひとつの手段だと思っています。

Terraformのディレクトリ構造に関しては過去に別の媒体で記事にしているので気になれば覗いてみてください。
https://jade225.hateblo.jp/entry/2020/08/22/140202

またこんな記事もありますし大変勉強になりますのでぜひ一度参考にしてみてください
https://blog.engineer.adways.net/entry/2020/07/03/150000

もしも既にTerraformをTerraformerのまま運用してしまった場合

もし上のようなAWSのサービス別で組んだ場合で管理が難しくなってしまっている場合ですが、、、、、

気合い入れて整理しましょう。
今それを修正するこすとよりも将来的に運用していくコストのほうが遥かに重たくなるので気合い入れてディレクトリ構造を修正することを僕はオススメしています。

過去一番ディレクトリ構造をうまくできたチームではどこを修正すれば大丈夫などの可視性がとてもよくリソースの変更に対して特にストレスなく行うことができました。

まとめ

簡単なまとめとしてですが

  • Terraformerでimportしてものをそのまま使用しない。
  • 最初の段階でディレクトリ構造を考えておく
  • もし最初にそのまま使用しているのであれば気合い入れて管理しやすいように修正をする。

チームにもしTerraformに知見のあるメンバーがいない段階でチャンレジしたいのであれば、外部でもいいので知見のある方に意見をもらうことを推奨します。

特にその人に作業をしてもらうのではなく都度相談に乗ってもらい実際の実装はチーム内でのメンバーでおこなうことがいいでしょう。
それによってチーム内で新しいノウハウがたまりインフラエンジニアだけではなくアプリケーション側のエンジニアも積極的に触れる好循環が生まれます。

Terraform自体は素晴らしいツールでありチームの生産性を上げてくれるものになっているので是非上記のようなことを念頭に入れて開発を進めていただければと思います。

Discussion