Terraformとは — インフラをコードで管理するIaCツール

1. 概要

この記事では、以下の内容を解説します。

  • IaC(Infrastructure as Code)とは何か
  • Terraformの基本的な概念と仕組み
  • TerraformでAWSのインフラをどのように管理するか
  • 他のIaCツールとの違い
  • Terraformを学ぶための最初のステップ

「Terraformという名前を聞いたことがあるが、何をするツールなのか分からない」という方を主な対象としています。


2. Terraformにおける位置付け

IaC(Infrastructure as Code)とは

IaCとは、サーバーやネットワークといったインフラの構成を*コードとして記述・管理する手法*です。

例えばAWSでEC2インスタンスを1台作る場合、通常はAWSのマネジメントコンソール(ブラウザ)を操作します。このときの手順を記録しておかなければ、まったく同じ構成を別の環境に再現することはできません。

IaCはこの問題を解決します。インフラの構成をコードで書いておくことで、同じ環境を何度でも再現できるようになります。

【手動管理の場合】
  コンソールをクリック → EC2が完成 → 手順書に書いた(でもすぐ古くなる)

【IaCの場合】
  コードを書く → terraform apply → EC2が完成 → コードをGitで管理

Terraformとは

Terraformは、HashiCorpが開発したIaCツールです。現在はIBM傘下で開発が継続されています。

Terraformの最大の特徴は*宣言的*な記述方式です。「どのような状態にしたいか」をコードで宣言するだけで、現在の状態との差分をTerraformが自動的に計算し、必要な操作を実行してくれます。

💡 宣言的とは? 「AWSにEC2インスタンスをt3.microで1台作れ」という命令(手続き的)ではなく、 「t3.microのEC2インスタンスが1台存在する状態にしてほしい」という宣言(宣言的)のことです。 すでに1台存在していれば何もしない、0台なら1台作る、2台あれば1台削除する、という動作になります。

AWSだけでなく、Azure・GCP・Kubernetes・Cloudflareなど3,000以上のサービスに対応しています。

ライセンスについての注記

2023年8月にHashiCorpはTerraformのライセンスをオープンソース(MPL-2.0)からBSL 1.1に変更しました。一般的なインフラ管理用途では引き続き無償で利用できます。

この変更をきっかけに、オープンソースフォークとしてOpenTofuが誕生しています。TFPediaでは主にTerraform(HashiCorp版)を対象に解説しますが、多くのコード例はOpenTofuでも動作します。


3. Terraformの基本構文

TerraformはHCL(HashiCorp Configuration Language)という言語で設定ファイルを書きます。ファイルの拡張子は.tfです。

以下は、AWSに「t3.microのEC2インスタンスを1台作る」という最もシンプルなコードです。

# providers.tf
# どのクラウドを使うかを宣言
provider "aws" {
  region = "ap-northeast-1"  # 東京リージョン
}

# main.tf
# どんなリソースを作るかを宣言
resource "aws_instance" "web" {
  ami           = data.aws_ami.amazon_linux.id
  instance_type = "t3.micro"

  tags = {
    Name = "my-first-server"
  }
}

「リソースの種類(aws_instance)」と「このプロジェクト内での名前(web)」を指定し、中括弧の中に詳細な設定を書く、という構造です。

HCLの詳細な書き方は「resourceブロックの使い方」で解説しています。


4. 詳細解説

4つの主要概念

Terraformを理解するうえで、以下の4つの概念を押さえておくことが重要です。

Provider(プロバイダー)

ProviderはTerraformとクラウドサービスをつなぐプラグインです。AWSを使うにはhashicorp/awsプロバイダーを、Azureを使うにはhashicorp/azurermプロバイダーをインストールします。

プロバイダーはterraform initコマンドを実行したときに自動でダウンロードされます。

Resource(リソース)

Resourceは実際に作成するインフラの単位です。EC2インスタンス1台、S3バケット1個、それぞれが1つのResourceです。

resource "aws_s3_bucket" "logs" {
  bucket = "my-tfpedia-logs-2026"
}

State(ステート)

Terraformは管理しているインフラの現在の状態をterraform.tfstateというファイルに記録します。これをStateと呼びます。

terraform planを実行すると、コードの内容とStateを比較して「何を変更すべきか」が分かります。

⚠️ 注意: Stateファイルにはデータベースのパスワード等の機密情報が含まれることがあります。GitHubなどの公開リポジトリに誤って含めないように注意してください。

Module(モジュール)

Moduleは複数のResourceをひとまとめにして再利用できるようにしたものです。例えば「VPC + サブネット + セキュリティグループ」のセットをモジュールにしておけば、dev環境でもprd環境でも同じモジュールを呼び出すだけで展開できます。

モジュールの詳細は「moduleブロックの使い方」で解説しています。


terraform の実行フロー

Terraformの基本的な実行手順は3ステップです。

ステップ1: terraform init
  ├─ Providerのダウンロード
  └─ 初回だけ実行すればOK

ステップ2: terraform validate(任意・推奨)
  ├─ コードの構文チェック
  └─ エラーがないか事前に確認できる

ステップ3: terraform plan
  ├─ コードとStateを比較
  ├─ 「何を作成・変更・削除するか」を表示
  └─ 実際の変更は行われない(確認用)

ステップ4: terraform apply
  ├─ planの内容を確認して "yes" と入力
  └─ 実際にAWS APIを呼び出してリソースを作成

terraform validateでコードの構文チェックを行い、terraform planで変更内容を確認してからterraform applyすることが鉄則です。planを確認せずにapplyすると、意図しない削除が起こる可能性があります。


5. 他のIaCツールとの比較

Terraformと同じような用途で使われるツールと比較します。

ツール特徴向いているケース
Terraformマルチクラウド・宣言的・エージェントレスAWS/Azure/GCPを組み合わせて使う
AWS CloudFormationAWSネイティブ・YAML/JSON記述AWSのみ・AWS全サービスに対応
AWS CDKTypeScript/Pythonで記述プログラマーがコードでインフラを管理
Ansible手続き的・設定管理が得意OS設定・ミドルウェアのインストール
PulumiJavaScript/Python等の汎用言語汎用言語でインフラをコード化

*Ansibleとの違い*は特によく混乱されます。Ansibleはサーバーの中の設定(Nginxのインストール等)を管理するのが得意で、Terraformはインフラ自体(EC2の作成・VPCの設定等)を管理するのが得意です。両方を使い分ける現場も多くあります。


6. よくある質問

Q. Terraformを使い始めるには何が必要ですか?

以下の3つを用意します。

  1. Terraform CLI公式サイトからダウンロード
  2. AWSアカウントと認証情報 — IAMユーザーまたはIAMロールのアクセスキー
  3. テキストエディタ — VS CodeにTerraform拡張機能を入れると便利

インストールの詳細は「インストールと最初のコード」を参照してください。

Q. 無料で使えますか?

Terraform CLI自体は無料です(BSLライセンスの制限内で)。 ただしAWSのリソースを作成すると、AWSの利用料金が発生します。学習用には*ローカルプロバイダー*(AWSを使わずにローカルファイルを操作する)を使う方法もあります。

Q. どのくらいで習得できますか?

基本的な使い方(resource / variable / output)であれば、数日〜1週間で使い始められます。モジュール設計や本番環境の運用は、実際にプロジェクトで使いながら習得していくことが一般的です。


7. ベストプラクティス(最初に知っておくこと)

細かいベストプラクティスはそれぞれの記事で解説しますが、Terraformを使い始める前に知っておくべき基本的な考え方を3点まとめます。

*必ずplanを確認してからapplyする*

terraform planの出力は毎回必ず確認します。-/+(削除後に再作成)マークが出ている場合は、ダウンタイムや意図しないデータ損失につながる可能性があります。

*Stateファイルをチームで共有する*

ひとりで使う場合はローカルのStateファイルでも問題ありませんが、チームで使う場合はS3などのリモートで管理します。こうすることで「誰かが変更したのに他のメンバーが知らなかった」という事故を防げます。

*バージョンを固定する*

*.terraform.lock.hclはGitで管理する*

.terraform.lock.hclファイルはGitリポジトリに含めてください。このファイルはプロバイダーのバージョンをロックするためのもので、Terraform公式がGit管理を推奨しています。.gitignoreに追加するのは誤りです。

# .gitignoreに追加すべきファイル
.terraform/              # ダウンロードしたプロバイダーのキャッシュ
*.tfstate               # Stateファイル(リモートbackendを使う場合)
*.tfstate.backup        # Stateバックアップ
terraform.tfvars        # 機密情報を含む場合のみ

# ❌ 追加してはいけない
# .terraform.lock.hcl  # Git管理推奨(チームでバージョン固定のため)

Terraformのバージョン(required_version)とプロバイダーのバージョン(required_providersversion)は必ず指定します。バージョンを固定しないと、意図せずアップグレードされた際に動作が変わることがあります。


8. 関連記事

TFPediaで次に読む記事の推奨順序です。

*まずはここから:*

*基本ブロックを学ぶ:*

*コマンドを学ぶ:*

*実務に向けて:*


9. まとめ

  • Terraformは「インフラをコードで管理する」IaCツールで、AWSなどのクラウドリソースをコードで定義・管理できる
  • コードに「こういう状態にしてほしい」と宣言するだけで、Terraformが現在の状態との差分を計算して適用してくれる(宣言的)
  • terraform initterraform planterraform apply の3ステップが基本の実行フロー
  • Provider(クラウドとの接続)・Resource(作成するリソース)・State(現在の状態の記録)・Module(再利用可能なコードの塊)が4つの主要概念
  • まず「resourceブロックの使い方」から読み進めることを推奨する

動作確認バージョン: Terraform >= 1.9 公式ドキュメント: https://developer.hashicorp.com/terraform/intro