目次
Infrastructure as Codeが必要な理由
本連載では、全12回にわたってTerraformを基礎から実践まで徹底解説します。Infrastructure as Code(IaC)の基本概念から、本番環境で使えるDevSecOpsパターンまで、実際に手を動かしながら学んでいきます。最終回には、マルチクラウド環境のインフラを自信を持ってデプロイできるようになります。
まず第1回では、こんな疑問に答えていきます:なぜInfrastructure as Codeが必要なのか?
📦 サンプルコードリポジトリ
本連載で使用するコード例は、すべてGitHubで公開しています。
リポジトリ: terraform-hcl-tutorial-series
第1回は概念の解説が中心ですが、リポジトリには以下が含まれています:
- 宣言的アプローチと命令的アプローチの違いを示す図解
- Terraformと他のツールの比較資料
- 第2回以降で使用する実践的なサンプルコード
いつでもコードを参照できますし、リポジトリをクローンして手元で試すこともできます:
git clone https://github.com/khuongdo/terraform-hcl-tutorial-series.git
cd terraform-hcl-tutorial-series
# 各回ごとにタグが付いています
git tag -l
# part-01, part-02, part-03, ...
# 特定の回のコードを確認
git checkout part-01
問題:手動インフラ管理の限界
クラウド上にWebアプリケーションをデプロイする場面を想像してみてください。AWSコンソールで作業すると、こんな感じになります:
- VPCを作成するために15画面もクリックして進む
- サブネット、ルートテーブル、セキュリティグループを一つ一つ手作業で設定
- EC2インスタンスを起動するものの、前回どのAMIを使ったか思い出せない
- ステージング環境に同じ構成を再現するのに20分もかかる
- 設定内容をWordにまとめるが、次の変更で即座に古くなる
- 半年後、「このセキュリティグループ、なんで存在してるんだっけ?」と誰も分からない
こんな経験、ありませんか? これが、インフラ管理地獄です。
手動管理の何が問題なのか
環境間の不整合が発生する: 人間の記憶は不完全です。本番環境とステージング環境で設定が微妙にズレていき、気づいたときには「なぜ本番だけエラーが出るの?」という事態に。
変更履歴を追えない: インフラに対してgit diffが使えません。「先週の火曜日、誰が何を変更したんだっけ?」と調べる手段がないのです。
ドキュメントがすぐ陳腐化する: せっかく手順書を書いても、誰かが「ちょっと設定変えとくね」と更新せずに変更した瞬間、信用できなくなります。
デプロイに時間がかかる: クラウドコンソールをポチポチするやり方では、スケールしません。10リージョンに手動展開? 気が遠くなりますね。
本番操作のリスクが高い: 本番環境で誤クリックすると、データベースが消えます。プレビューなし、ロールバックもなし。
属人化する: 「ネットワーク設定はSarahしか分からない。でも今週休暇中...」こんな状況、よくありますよね。
解決策:Infrastructure as Code
Infrastructure as Code(IaC)という考え方は、インフラをソフトウェアのように扱うアプローチです。クラウドコンソールをポチポチする代わりに、「こういうインフラが欲しい」という最終形態を宣言的に記述したファイルを書きます。
# コンソールでポチポチする代わりに...
Click "Create VPC" → Enter CIDR → Click "Create Subnet" → ...
# コードで宣言する:
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
}
resource "aws_subnet" "public" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
}
このコードをTerraformで実行すれば、記述した通りのインフラが自動的に作成されます。何度実行しても、同じ結果が得られます。確実に。
IaCがもたらす革命的なメリット
1. すべてをバージョン管理できる
インフラの設定は、アプリケーションコードと一緒にGitで管理できます:
git log infrastructure/
# 「誰が、いつ、なぜセキュリティグループを変更したか」が分かる
# `git revert`で問題のある変更を即座にロールバック
# ブランチを切って、安心して新しい構成を実験できる
2. 環境間で完全に一貫性を保てる
開発・ステージング・本番、すべて同じコードベースを使います。変わるのは変数だけ:
# インフラの定義は共通
module "app" {
source = "./modules/app"
# 環境ごとに変数を切り替えるだけ
environment = var.environment # "dev", "staging", "prod"
instance_count = var.environment == "prod" ? 10 : 2
}
3. コードそのものがドキュメントになる
コードがドキュメントです。「今、データベース何台動いてるんだっけ?」と思ったら、設定ファイルを読めば一目瞭然:
resource "aws_db_instance" "users" {
identifier = "users-db"
engine = "postgres"
# 全設定が一箇所に集約されている
}
4. デプロイが圧倒的に速くなる
たった1コマンドで、10個のAWSリージョンに同時デプロイ可能:
terraform apply
# 数百のリソースを数分でプロビジョニング
# 依存関係を解析して並列実行
# 実行前にプレビューが見られる
5. 災害復旧が簡単
インフラ全体がコードなので、万が一AWSアカウントが消えても、Gitリポジトリから1時間以内に全部復元できます。
6. チームでレビューしながら進められる
インフラの変更も、コード変更と同じようにレビュープロセスに乗せられます:
# インフラ変更用のブランチを作成
git checkout -b add-redis-cache
# ... 変更を加える ...
git commit -m "Add Redis for session caching"
# プルリクエストを作成してチームレビュー
# 承認されたらマージ
宣言的 vs 命令的:IaCの考え方の違い
IaCツールには大きく分けて2つのアプローチがあります:**命令的(Imperative)と宣言的(Declarative)**です。この違いを理解することが、Terraformを使いこなす第一歩です。
命令的:「どうやって作るか」を指示
命令的なツール(Bashスクリプト、Ansibleプレイブックなど)では、システムに手順を一つ一つ指示します:
# 命令的アプローチの例(Bash)
aws ec2 create-vpc --cidr-block 10.0.0.0/16
aws ec2 create-subnet --vpc-id vpc-123 --cidr-block 10.0.1.0/24
aws ec2 run-instances --subnet-id subnet-456 --image-id ami-789
この方法の問題点:
- すでにVPCが存在していたらどうする?
- 途中でスクリプトが失敗したら?
- リソースを綺麗に削除するには?
- 実行順序を間違えると即エラー
宣言的:「最終的にどうあるべきか」を記述
宣言的なツール(Terraform、CloudFormationなど)では、理想の最終状態を記述します:
# 宣言的アプローチの例(Terraform)
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
}
resource "aws_subnet" "public" {
vpc_id = aws_vpc.main.id
cidr_block = "10.0.1.0/24"
}
Terraformが自動で判断してくれること:
- 何がすでに存在しているか
- 何を新規作成すべきか
- 何を更新すべきか
- 何を削除すべきか
- どの順序で実行すればいいか
初回実行: リソースを作成 2回目実行: 何もしない(すでに理想状態だから) コード変更後に実行: 変更箇所だけを更新
これが**冪等性(べきとうせい)**です。同じコードを何度実行しても、同じ結果が得られる性質のことです。
なぜTerraformなのか?2025年のIaCエコシステム
「IaCが重要なのは分かった。でも、なぜTerraformを選ぶべきなの?」 この疑問に答えるために、主要なIaCツールを比較してみましょう。
IaCツールの全体像
クラウドベンダー専用ツール:
- AWS CloudFormation: AWS専用、YAML/JSON形式、AWSとの深い統合
- Azure Resource Manager(ARM): Azure専用、JSONテンプレート
- Google Cloud Deployment Manager: GCP専用、YAML/Jinja2形式
マルチクラウド対応ツール:
- Terraform: マルチクラウド対応、HCL言語、巨大なエコシステム
- Pulumi: マルチクラウド対応、TypeScript/Python/Goなど実際のプログラミング言語を使用
- Crossplane: Kubernetes中心、Kubernetes CRDベース
構成管理ツール(IaCとは少し用途が異なる):
- Ansible: 命令的アプローチ、サーバー設定向き、インフラプロビジョニングには不向き
- Chef/Puppet: 成熟しているが下火、学習曲線が急
Terraformが選ばれる理由
1. 最初からマルチクラウドに対応
Terraformは統一された文法で、AWS・GCP・Azure、さらに3,000以上のプロバイダーを操作できます:
# AWS
resource "aws_instance" "web" { ... }
# GCP
resource "google_compute_instance" "web" { ... }
# Azure
resource "azurerm_linux_virtual_machine" "web" { ... }
# 同じワークフロー、同じ言語で全クラウドに対応
2. 圧倒的なプロバイダーエコシステム
クラウドだけではありません。Terraformはこんなものまで管理できます:
- DNS: Cloudflare、Route53、DNSimple
- 監視: Datadog、New Relic、PagerDuty
- データベース: MongoDB Atlas、Snowflake、PostgreSQL
- セキュリティ: Vault、Auth0、Okta
- GitHubまで: リポジトリ設定、チーム管理、ブランチ保護
まさに「すべてを統べる一つのツール」です。
3. インフラ専用に設計されたHCL言語
HashiCorp Configuration Language(HCL)は、インフラ記述のために作られた言語です:
# 読みやすく、JSONのように冗長ではない
# 変数、関数、条件分岐をサポート
# 型チェックと検証機能付き
variable "environment" {
type = string
validation {
condition = contains(["dev", "staging", "prod"], var.environment)
error_message = "Must be dev, staging, or prod."
}
}
4. 賢い状態管理機能
Terraformは状態ファイルで、インフラの現在の状態を追跡します。これにより:
- ドリフト検出(誰かが勝手にコンソールで変更した場合も検知)
- ロック機構による安全な並行作業
- 既存インフラの強力なインポート機能
5. 2025年時点で最も成熟したエコシステム
2025年現在、Terraformは:
- 15年以上の本番環境での実績
- Terraform Registryに10万個以上のモジュール
- Terraform Cloud/Enterpriseによるエンタープライズサポート
- Policy-as-Codeによる強制(Sentinel、OPA)
- 充実したテストフレームワーク(Terratest、tfsec)
- 活発なコミュニティとHashiCorpの継続的な開発
Terraformを選ぶべきケース・選ばないべきケース
✅ Terraformを選ぶべき場合:
- クラウドインフラ(AWS、GCP、Azure)を管理したい
- マルチクラウド、またはベンダーロックインを避けたい
- 宣言的で冪等性のあるインフラ管理をしたい
- インフラをバージョン管理したい
- 再利用可能なモジュールを作りたい
- チームで協力してインフラを管理したい
❌ 他のツールを検討すべき場合:
- AWS一本で、AWS固有機能をフル活用したい: CloudFormationの方がシンプルかも
- Kubernetes中心の運用: CrossplaneがK8sと親和性が高い
- 開発者が慣れた言語で書きたい: PulumiならTypeScript/Python/Goが使える
- 単純なサーバー設定作業: Ansibleの方が軽い
- 既存のChef/Puppet資産がある: 既存投資を活かせるかも
とはいえ、現代のクラウドインフラを管理するほとんどのチームにとって、Terraformがデファクトスタンダードなのは間違いありません。
実際の導入事例
Terraformは世界中の企業で採用されています。いくつか実例を見てみましょう。
事例1:マルチリージョン災害対策(フィンテック企業)
課題: 99.99%の稼働率を保証するため、5つのAWSリージョンに同一構成のインフラを展開したい。
解決策: Terraformモジュールを一度定義し、リージョンごとに変数を変えてデプロイ。
成果:
- デプロイ時間:2時間 → 15分に短縮
- 環境の一貫性:100%(構成のズレゼロ)
- 災害復旧:四半期ごとのフェイルオーバーテストが20分で完了
事例2:急成長スタートアップのスケール対応(SaaS企業)
課題: 顧客数が10社から1,000社へ急増。顧客ごとの専用環境を素早く用意したい。
解決策: 顧客ごとにTerraformワークスペースを作成し、CI/CDで自動化。
成果:
- 新規顧客の環境準備:2日 → 10分に短縮
- コスト把握:顧客ごとのリソース消費が可視化
- 開発者の生産性向上:エンジニアがセルフサービスでインフラを立てられる
事例3:コンプライアンス対応(医療業界)
課題: HIPAA(米国の医療情報保護法)要件を満たすため、インフラ変更を完全に追跡したい。
解決策: Terraform + Git + Policy-as-Codeの組み合わせ。
成果:
- 完全な監査証跡:すべてのインフラ変更がGitで記録される
- コンプライアンス自動化:コミット前フックでセキュリティポリシーを自動チェック
- 監査対応時間:週単位 → 数時間(レビュアーがGitログを読むだけ)
本連載で学べること
これは全12回で構成される、包括的なTerraformチュートリアルの第1回です。今後の予定はこちら:
基礎編(第1〜3回)
- 第1回: Infrastructure as Codeが必要な理由 (今ここ)
- 第2回: Terraformのセットアップ(インストールと認証設定)
- 第3回: 初めてのクラウドリソース作成(AWSへの実践デプロイ)
基本概念編(第4〜7回)
- 第4回: HCL文法の基礎(構文、型、関数)
- 第5回: 変数、出力、状態管理
- 第6回: Terraformの基本ワークフロー(init、plan、apply、destroy)
- 第7回: モジュールで再利用性を高める
応用編(第8〜12回)
- 第8回: マルチクラウドパターン(AWS/GCP/Azure比較)
- 第9回: 状態管理とチームワークフロー
- 第10回: テストと検証(Terratest、tfsec、Policy-as-Code)
- 第11回: セキュリティとシークレット管理(Vault、SOPS、OIDC)
- 第12回: 本番運用パターンとDevSecOps(CI/CD、コンプライアンス)
第12回まで読み終える頃には、自動テスト・セキュリティスキャン・コンプライアンスチェックを備えた、本番環境で使えるインフラをデプロイできるようになります。
必要な前提知識
この連載では、以下の知識を前提としています:
- クラウドの基礎知識: AWSコンソールやGCPの管理画面を触ったことがある程度でOK
- コマンドラインの基本操作: ディレクトリ移動やコマンド実行ができればOK
- Gitの基礎:
git add、git commitの意味が分かる程度でOK
TerraformやIaCの経験は一切不要です!ゼロから丁寧に解説していきます。
連載を通じて作るもの
この12回の連載を通じて、段階的に以下のインフラを構築していきます:
- シンプルなリソース(EC2インスタンス、S3バケットなど)
- 本格的なVPCネットワーク(サブネット、ルーティング、セキュリティグループ付き)
- マルチティアアプリケーション(Webサーバー、データベース、ロードバランサー)
- 再利用可能なモジュール(Terraform Registryへの公開も)
- マルチクラウド展開(AWS + GCP + Azureで同じアプリを動かす)
- 本番運用レベルのインフラ(監視、コンプライアンス、災害復旧対応)
すべてのコード例はGitHubリポジトリで公開予定です(第2回から順次公開)。
チェックポイント:理解度を確認しよう
第2回に進む前に、以下の質問に答えられるか確認してみてください:
Infrastructure as Codeとは何か?
- 答え:クラウドコンソールをポチポチする代わりに、宣言的な設定ファイルでインフラの理想状態を記述し、ソフトウェアのように扱うアプローチ。
宣言的アプローチと命令的アプローチの違いは?
- 答え:宣言的は「最終的にこうあるべき」を記述(例:「サーバーが3台欲しい」)。命令的は「手順を一つずつ」指示(例:「サーバー1を作成、次にサーバー2を...」)。
CloudFormationやPulumiではなく、Terraformを選ぶ理由は?
- 答え:マルチクラウド対応、圧倒的なプロバイダーエコシステム、宣言的なHCL言語、15年以上の本番実績による成熟度。
IaCの主なメリットは?
- 答え:バージョン管理可能、環境間の一貫性、コードがそのままドキュメント、高速デプロイ、チームでのコードレビュー。
これらに自信を持って答えられるなら、第2回に進む準備OKです!
次回予告
第2回:Terraformのセットアップでは、いよいよ実践に入ります:
- お使いのマシンにTerraform CLIをインストール
- AWS/GCP/Azureの認証設定
- プロバイダーという概念の理解
- 最初のTerraformプロジェクトを初期化
terraform initコマンドを初体験
理論編はここまで。第2回からは、実際にTerraformコマンドを叩いて、本物のクラウドリソースをデプロイしていきます。
準備はいいですか? 第2回へ続く → (近日公開)
参考資料
第2回までに、もっと深く知りたい方はこちらもどうぞ:
- HashiCorp公式学習パス - 公式チュートリアル
- Terraform Registry - 10万個以上のモジュールを検索
- Terraform Best Practices - コミュニティ主導のベストプラクティス集
質問や感想があれば、コメント欄でお気軽にどうぞ! すべて読んでいますし、よくある質問は今後の回で取り上げます。
連載ナビゲーション:
- 第1回: Infrastructure as Codeとは? (今ここ)
- 第2回: Terraformのセットアップ
- 第3回: 初めてのクラウドリソース
- 第4回: HCL基礎
- 第5回: Variables, Outputs & State
- 第6回: Terraformの基本ワークフロー
- 第7回: モジュールで整理する (近日公開)
- 第8回: マルチクラウドパターン (近日公開)
- 第9回: State管理 & チームワークフロー (近日公開)
- 第10回: テスト & 検証 (近日公開)
- 第11回: セキュリティ & シークレット管理 (近日公開)
- 第12回: 本番環境パターン & DevSecOps (近日公開)
本記事は「Terraform基礎から実践まで」連載シリーズの一部です。Terraformを使ったInfrastructure as Codeをマスターしましょう。