Terraformのディレクトリ構成は色々あり、どれも長所短所ありますが、規模が大きくなってくるとある程度形が決まってきます。
私が良いと思うディレクトリ構成を紹介します。
①環境ごとにフォルダを分ける
一番多いのがこのパターンだと思います。ディレクトリ構成のベストプラクティスとして検索すると大抵これです。分かりやすいですよね。各環境フォルダに入ってterraform
コマンドを叩きます。
root
|--modules
|--envs
|--development
|-- main.tf
|-- outputs.tf
|-- provider.tf
|-- README.md
|-- terraform.tf
|-- variables.tf
|-- README.md
|--staging
|-- main.tf
|-- outputs.tf
|-- provider.tf
|-- README.md
|-- terraform.tf
|-- variables.tf
|-- README.md
|--production
|-- main.tf
|-- outputs.tf
|-- provider.tf
|-- README.md
|-- terraform.tf
|-- variables.tf
メリット
- 分かりやすい
- 文献が多い
デメリット
- 環境ごとにファイルを作成するため差分が出てきやすい
- 階層が(少し)深い
②環境ファイルで分ける
環境を丸々ディレクトリで分けるのではなく、環境変数のみを分けて、それを呼び出します。そのため、リソース名などが環境変数できっちり分離されます。
root
|--main.tf
|--outputs.tf
|--provider.tf
|--README.md
|--terraform.tf
|--variables.tf
|--modules
|--envs
|--development
|-- terraform.tfvars
|-- backend.tfbackend
|--staging
|-- terraform.tfvars
|-- backend.tfbackend
|--production
|-- terraform.tfvars
|-- backend.tfbackend
メリット
- root直下で実行可能(なので移動が楽)
- 最低限の設定ファイルだけを各環境用のディレクトリにおけば良い
デメリット
- コマンドが長くなる
- 環境ごとに柔軟な構成を作ることが難しくなる
terraform init -backend-config=envs/development/backend.tfbackend
terraform plan -var-file=envs/development/terraform.tfvars
個人的な見解
特にこだわりがなければ、「①環境ごとにフォルダを分ける」にするのが良いと思います。ディレクトリごとに環境が分かれていて分かりやすかったり、Terraform Cloudで環境ごとにワークスペースを作成して実行できるからです。ただし、環境差分が出ないように注意しましょう。
また、Terragruntを利用するのもありですが、学習コストなどが発生するため周りと相談するのが良いです。