最近の Terraform のディレクトリ構造の分け方
※この記事の内容は https://nazo.hatenablog.com/entry/terraform-2022 と同一です。
概要
modules / envs / apps でディレクトリを切っています。
基礎知識: modules と envs
誰が言い出したのかはわかりませんが、modules と envs に分けるパターンはよく見かけます。
modules は文字通りモジュールを配置するところで、 envs はそれらを使う環境が入っているという感じです。
.
├── modules
│ ├── vpc
│ ├── app
│ └── db
└── envs
├── production
└── staging
modules の抽象度は、 12 factor app の バックエンドサービス くらいのイメージを持っていればいいのではないかと思います。VPC みたいな基盤は特殊として、それ以外は「外しても使える程度」を意識するのが良いと思います。
一般的に envs で書かれる tf は、modules を呼び出すだけにしておくのが良いと思います。直接リソースを書くのは最終手段です。
modules と envs はわかるけど apps って何?
全環境で VPC も DB も分けるなら必要ないですが、「複数のアプリで同一の DB を参照したい」というケースは多々あります。進捗が別々の環境を同時に作りたい場合などです。また、費用を節約するために同一の DB リソースを共有するという場合もあります。
そのような状況を考えた時、「土台のバックエンドサービスと、自分で書いたアプリケーションは別の扱いにしたほうがいいのでは」となりました。この「土台のバックエンドサービス」が「envs」で、「自分で書いたアプリケーション」が「apps」になります。
「envs」は、VPC や DB などがまとまったもので、「apps」はデプロイ単位で分けることになります。これにより、1つの VPC や DB に、複数のアプリケーションを同居させることが簡単になります。
.
├── modules
│ ├── vpc
│ ├── app
│ └── db
├── apps
│ ├── staging
│ ├── production
│ └── featurexxxx
└── envs
├── production
└── staging
「envs」以下より「apps」以下のほうが必ず数が多くなります。また、「apps」は「envs」の設定に依存しますが、逆の依存は必ず存在しないようにします。
Discussion