📝
モジュール化と再利用を用いたTerraformのプロジェクト構造ドキュメント(仮)
我流で、terraformのより良い、構造はどうするのが良いのだろう?と考えた結果になります。
忌憚ない意見いただけると嬉しいです!
プロジェクト構造ドキュメント
ディレクトリ構造
.
├── env/
│ ├── production/main.ft
│ ├── staging/main.tf
│ └── development/main.tf
├── instances/
│ ├── data_warehouse/main.tf
│ ├── web_backend/main.tf
│ └── analytics_pipeline/main.tf
├── modules/
│ ├── bigquery/main.tf
│ ├── networking/main.tf
│ └── storage/main.tf
└── resources/
├── google/bigquery/dataset/main.tf
└── aws/iam/policy/main.tf
ディレクトリの役割と説明
1. env/
役割: 異なる実行環境の設定を管理します。
説明:
- 各環境(本番、ステージング、開発など)に特有の設定を含みます。
- 環境固有の変数、バックエンド設定、プロバイダー設定などを定義します。
- 各環境ディレクトリには、その環境で使用するインスタンスへの参照が含まれます。
使用例:
-
env/production/main.tf
: 本番環境の主要な設定ファイル -
env/staging/variables.tf
: ステージング環境の変数定義
2. instances/
役割: モジュールの具体的な実装やデプロイ可能な単位を定義します。
説明:
- モジュールを組み合わせて具体的なサービスやアプリケーションを構成します。
- 各インスタンスは、特定の目的や機能を持つ完全なシステムを表します。
- モジュールに具体的な値やパラメータを提供し、実際のデプロイ可能な形に変換します。
使用例:
-
instances/data_warehouse/main.tf
: データウェアハウスの具体的な実装 -
instances/web_backend/variables.tf
: Web バックエンドの変数定義
3. modules/
役割: 再利用可能な抽象化されたリソース定義を提供します。
説明:
- プロジェクト全体で再利用可能な、抽象化されたインフラストラクチャコンポーネントを定義します。
- 各モジュールは特定の機能や目的を持ち、パラメータ化されています。
- モジュールは環境やインスタンス間で共有され、一貫性と再利用性を提供します。
使用例:
-
modules/bigquery/main.tf
: BigQuery リソースの抽象化された定義 -
modules/networking/variables.tf
: ネットワークモジュールの変数定義
4. resources/
役割: 最小単位のリソース定義を提供します。
説明:
- 個々のクラウドリソースに対する最も基本的な定義を含みます。
- モジュールやインスタンスの構築ブロックとして機能します。
- プロバイダー固有のリソース(例:GCP Dataset、GCP Table、GCP Bucket など)を定義します。
- これらのリソースは通常、モジュール内で使用され、直接インスタンス化されることは少ないです。
- リソースの定義時のディレクトリ構成は、resource名の"_"区切りで命名。そのディレクトリ内にmain.tfを作り定義していく。
使用例:
-
resources/google/bigquery/dataset/main.tf
: Google Cloud Dataset リソースの基本定義 -
resources/aws/iam/policy/main.tf
: AWSのIAM ポリシーの定義
使用ガイドライン
-
新しい環境を追加する場合は、
env/
ディレクトリ内に適切な環境ディレクトリを作成し、必要な設定ファイルを配置します。 -
新しいサービスやアプリケーションを作成する場合は、
instances/
内に新しいディレクトリを作成し、必要なモジュールを組み合わせて具体的な実装を定義します。 -
再利用可能なインフラストラクチャコンポーネントを作成する場合は、
modules/
ディレクトリ内に新しいモジュールを作成します。既存のモジュールの更新も適宜行います。 -
基本的なリソース定義が必要な場合は、
resources/
内に配置し、モジュールから参照します。これらは通常、直接使用されることは少なく、モジュールを通じて間接的に利用されます。 -
各層の間の依存関係を意識し、上位の層(例:instances)は下位の層(例:modules)を参照しますが、その逆は避けるようにします。
Discussion