Terraformの設定ファイルの構成と書き方

## はじめに
本記事では、Terraformの設定ファイルの基本的な構成と書き方について紹介します。
Terraformでは、インフラ構成をコードで管理するために、`.tf` という拡張子の設定ファイルを使用します。

## 基本的な構成について
プロジェクトの基本的なファイル構成は以下の通りです：

```bash
project/
├── main.tf          # 主要なリソースを定義
├── variables.tf     # 変数を定義
├── outputs.tf       # 出力値を定義
├── terraform.tfvars # 変数の値を設定
└── providers.tf     # プロバイダーの設定
```

### main.tf
`main.tf`は、プロジェクトで作成するリソースを定義する中心的なファイルです。
ここではAWS、Azure、GCPなどのクラウドプロバイダーが提供するリソース（VPC、サブネット、EC2インスタンス、S3バケットなど）を定義します。
すべてのリソースを `main.tf` に記述するのではなく、`vpc.tf`、`subnet.tf`、`ec2.tf `など、リソースの種類や機能に応じてファイルを分割して管理するのが一般的です。

```HCL
resource "プロバイダー_リソースタイプ" "リソース名" {
  属性名1 = "値1"
  属性名2 = "値2"
}
```

記述例：VPCリソースの定義

```HCL
resource "aws_vpc" "main" {
  cidr_block = "10.0.0.0/16"
  tags = {
    Name = "main-vpc"
  }
}
```

### variables.tf
variables.tfは、プロジェクト内で使用する変数を定義するファイルです。
変数を使うことで、同じ値を複数箇所に記述する必要がなくなり、コードの再利用性と保守性が向上します。

```HCL
variable "変数名" {
  description = "変数の説明"
  type        = string # 変数の型（string, number, bool, list, mapなど）
  default     = "デフォルト値"  # 省略可能
}
```

記述例：AWSのリージョンとインスタンスタイプの変数を定義

```HCL
variable "region" {
  description = "AWSのリージョン"
  type        = string
  default     = "ap-northeast-1"
}

variable "instance_type" {
  description = "EC2インスタンスタイプ"
  type        = string
  default     = "t2.micro"
}
```

### outputs.tf
outputs.tfはTerraformの実行結果として出力したい値を定義するファイルです。
Terraformで実際にリソースをプロビジョニングした後、そのリソースの重要な情報を参照することができます。

```HCL
output "出力名" {
  description = "出力の説明"
  value       = "出力する値"
}
```

記述例：EC2のIPアドレスとIDの出力

```HCL
output "instance_ip" {
  description = "ウェブサーバーのパブリックIPアドレス"
  value       = aws_instance.web_server.public_ip
}

output "instance_id" {
  description = "ウェブサーバーのインスタンスID"
  value       = aws_instance.web_server.id
}
```

例えば、EC2インスタンスやデータベースを作成した際に自動的に割り当てられるIPアドレスやIDなどの情報を「出力値」として定義することができます。

１．`terraform apply` でリソース作成後、コマンドラインに自動的にこれらの情報が表示
２．`terraform output` コマンドを実行することでいつでもこれらの情報を確認できます


### terraform.tfvars
terraform.tfvarsは、variables.tfで定義した変数に実際の値を設定するファイルです。
変数の値は、`変数名 = "値"`という形式で記述します。

記述例：定義済み変数への値の割り当て

```HCL
region        = "ap-northeast-1"
instance_type = "t2.micro"
```
これらの設定は、`terraform apply` を実行した際に variables.tf で定義された変数に値を提供するために使用されます。

:::note warn
terraform.tfvars ファイルは環境ごとに異なる設定を定義するために使用され、gitignore に追加してバージョン管理から除外するのが一般的です。特にアクセスキーやシークレットキーなどの機密情報を含む場合は注意が必要です。
:::

### providers.tf 
`providers.tf` は、Terraformが使用するプロバイダー（AWS、Azure、GCPなど）を設定するファイルです。
このファイルでは、どのクラウドプロバイダーを使用するか、そのバージョンはどうするかなどを指定します。
また、複数のプロバイダーを同時に使用することも可能です。

```HCL
provider "プロバイダー名" {
  設定属性1 = 値1
  設定属性2 = 値2
}

terraform {
  required_providers {
    プロバイダー名 = {
      source  = "ソース"
      version = "バージョン制約"
    }
  }
}
```

記述例：プロバイダーの設定とTerraformバージョンを指定

```HCL
provider "aws" {
  region  = "ap-northeast-1"  # 使用するリージョン
  profile = "default"         # AWS認証情報のプロファイル（省略可）
}

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"  # プロバイダーのソース
      version = "~> 4.0"         # 使用するバージョン（4.x系を使用）
    }
  }
  
  # Terraformのバージョン指定も可能
  required_version = ">= 1.0.0"
}
```

## まとめ
本記事では、Terraformの設定ファイルの構成と基本的な書き方について紹介しました。Terraformを効果的に使うには、構文だけでなく変数やモジュール、状態管理などの知識も欠かせません。

- リソースの種類や役割ごとにファイルを分けて整理することで、可読性を高める
- コードの再利用性を高めるために、変数やモジュールを積極的に活用する
- 環境ごとの設定の違いは変数ファイルで適切に管理する（開発・ステージング・本番）
- アクセスキーなどの機密情報は `.gitignore` に追加し、バージョン管理から除外する

これらのポイントを意識することで、保守性が高く、安全で効率的なTerraformコードが書けるようになります。

https://developer.hashicorp.com/terraform/docs