📋

最近の Terraform のディレクトリ構造の分け方

2022/12/23に公開

※この記事の内容は 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