📝

モジュール化と再利用を用いたTerraformのプロジェクト構造ドキュメント(仮)

2024/08/04に公開

我流で、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 ポリシーの定義

使用ガイドライン

  1. 新しい環境を追加する場合は、env/ ディレクトリ内に適切な環境ディレクトリを作成し、必要な設定ファイルを配置します。

  2. 新しいサービスやアプリケーションを作成する場合は、instances/ 内に新しいディレクトリを作成し、必要なモジュールを組み合わせて具体的な実装を定義します。

  3. 再利用可能なインフラストラクチャコンポーネントを作成する場合は、modules/ ディレクトリ内に新しいモジュールを作成します。既存のモジュールの更新も適宜行います。

  4. 基本的なリソース定義が必要な場合は、resources/ 内に配置し、モジュールから参照します。これらは通常、直接使用されることは少なく、モジュールを通じて間接的に利用されます。

  5. 各層の間の依存関係を意識し、上位の層(例:instances)は下位の層(例:modules)を参照しますが、その逆は避けるようにします。

Discussion