IaC(Infrastructure as Code)
サーバーやネットワークを画面の手作業ではなく“コード”で定義・管理する考え方。Gitで履歴を残し、同じ環境を何度でも再現できる。
- 1.IaC は インフラをコードで定義する手法:手作業のクリックをやめ、設定ファイルからサーバー/ネットワークを構築する。
- 2.嬉しさは 再現性・レビュー・履歴:同じ環境を何度でも作れ、Pull Request で確認でき、Git に変更が残る。
- 3.宣言的(あるべき姿を書く)が主流で、何度流しても結果が同じになる「冪等性」が鍵。
なぜ手作業をやめるのか
クラウドのコンソールをポチポチ操作してサーバーを立てる方法は、最初は速いですが、次の問題を抱えます。
- 再現できない:「本番と同じ検証環境」を手で作ると、必ずどこか食い違う(設定漏れ・スノーフレークサーバー)。
- 記録が残らない:誰がいつ何を変えたか分からず、障害時に切り分けできない。
- 属人化する:手順が担当者の頭の中にしかなく、レビューもできない。
IaC はこれを 「コード=唯一の正(Single Source of Truth)」 にすることで解決します。環境はコードから生成されるので、ファイルを見れば構成が分かり、変更は差分(diff)で追えます。
コード化すると、Pull Request での レビュー、Git での 履歴・巻き戻し、CI/CD での 自動適用 がそのまま使えます。インフラ変更が「手順書とスクショ」から「コードの差分」になるのが本質的な価値です。
宣言的 vs 手続き的
IaC の書き方には大きく2つの流派があります。違いは「何を書くか」です。
- 宣言的(Declarative):あるべき最終状態(What) を書く。「サーバーを2台、このネットワークに」と宣言すると、ツールが現状との差分を計算して必要な操作を実行する。
- 手続き的(Imperative):手順(How) を書く。「サーバーを1台作る → もう1台作る → …」と、やることを順番に並べる。
宣言的は「現状がどうあれ、書いたとおりの状態に収束させる」ため、後述の冪等性と相性が良く、現在の主流です。
| 観点 | 宣言的(Declarative) | 手続き的(Imperative) |
|---|---|---|
| 書く対象 | あるべき状態(What) | 実行手順(How) |
| 差分の計算 | ツールが自動で算出 | 自分で考慮する必要 |
| 再実行 | 同じ状態に収束(冪等になりやすい) | 書き方次第で副作用が出やすい |
| イメージ | 「2台ある状態にして」 | 「1台作る→もう1台作る」 |
| 代表例 | Terraform・CloudFormation | シェルスクリプト・古典的な手順 |
冪等性(べきとうせい)が鍵
IaC で最も大事な性質が 冪等性(idempotency):同じコードを何回適用しても、結果が同じ状態になる こと。
たとえば「サーバーが2台ある状態」を宣言したコードは、
- 0台のとき流す → 2台 作る
- すでに2台あるとき流す → 何もしない(差分ゼロ)
- 1台のとき流す → 不足分を 1台だけ追加
というように、現状に応じて差分だけを埋めます。これにより「もう一回流したら3台になった」といった事故を防げ、安心して何度でも適用できます。
単なるシェルスクリプトは、2回実行すると「ユーザーを二重作成」「同じ行をファイルに追記し続ける」など壊れがちです。冪等になるよう自分で if 判定を書く必要があります。IaC ツールは この冪等性を仕組みとして担保 してくれる点が、素のスクリプトとの大きな差です。
プロビジョニング vs 構成管理
IaC は守備範囲で2層に分けて考えると整理できます。混同しやすいので押さえておきましょう。
- プロビジョニング(基盤の用意):サーバー・ネットワーク・ロードバランサなど インフラそのものを作る。代表が Terraform。クラウドの状態を
stateで管理し、宣言的に構築する。 - 構成管理(中身のセットアップ):用意したサーバーの中で ミドルウェア導入・設定・デプロイ を行う。代表が Ansible。OS の上の状態を整える。
実務では「Terraform で箱(サーバー)を作り、Ansible で中身(nginx 等)を入れる」のように 組み合わせて 使うのが定番です。
| 観点 | プロビジョニング | 構成管理 |
|---|---|---|
| 役割 | インフラ自体を作る | サーバー内部を設定する |
| 対象 | VM・ネットワーク・LB・DNS | パッケージ・設定ファイル・サービス |
| 代表ツール | Terraform / CloudFormation | Ansible / Chef / Puppet |
| 状態管理 | state でクラウドと突き合わせ | 実行のたびにあるべき状態へ収束 |
| たとえ | 土地と建物を建てる | 部屋に家具を配置する |
Terraform でも軽い初期設定はできますし、Ansible でクラウドリソースを作ることも可能です。「Terraform=基盤、Ansible=中身」は 役割の典型 であって、ツールが機能的に排他なわけではありません。チームの方針で線引きします。
コードのイメージ
宣言的な書き方は、こんな雰囲気です(あるべき状態を宣言する)。
# あるべき状態:このスペックのサーバーを1台
resource "aws_instance" "web" {
ami = "ami-xxxxxxxx"
instance_type = "t3.micro"
tags = {
Name = "web-server"
}
}
適用は「差分を確認 → 反映」の2段階が基本です。いきなり本番を変えず、まず計画(プラン)を見るのが安全な作法です。
terraform plan # 何が変わるか差分を表示(まだ変更しない)
terraform apply # 確認のうえ実際に反映
構成管理(Ansible)側は「あるべき状態」をタスクで並べます。冪等なモジュールを使うので、再実行しても余計な変更は起きません。
# nginx が「入っていて起動している」状態にする
- name: install and start nginx
hosts: web
tasks:
- name: nginx をインストール
ansible.builtin.package:
name: nginx
state: present # “あるべき状態”を宣言(無ければ入れる)
- name: nginx を起動・有効化
ansible.builtin.service:
name: nginx
state: started
enabled: true
つまずきポイント
- state ファイルの扱い:Terraform は現状を
stateに記録します。これをローカルに置いて共有しないと、チームで上書き事故が起きます。リモート(S3 等)で共有+ロック が定石。 - 手で直さない(ドリフト):IaC 管理下のリソースをコンソールから手動変更すると、コードと実体がズレる 構成ドリフト が発生し、次回適用で巻き戻る/壊れる原因に。変更は必ずコード経由で。
- 秘密情報をコードに書かない:パスワードや鍵を平文でコミットしない。変数・シークレット管理(Vault 等)に逃がす。
最大のアンチパターンは、コード管理しているのに緊急時だけコンソールで手修正すること。コードと現実が乖離した瞬間、「再現性」も「履歴」も失われます。直したいならコードを直す を徹底するのが、IaC を機能させる前提です。
まとめ
DevOps/インフラ Article
IaC(Infrastructure as Code)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
IaC
比較で見る軸
難易度: intermediate / カテゴリ: DevOps/インフラ / タグ数: 4
導入後に効く点
嬉しさは 再現性・レビュー・履歴:同じ環境を何度でも作れ、Pull Request で確認でき、Git に変更が残る。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- intermediate
- カテゴリ
- DevOps/インフラ
- タグ数
- 4
判断チェックリスト
- 自社の用途が「IaC / Terraform」に近いか確認する。
- 強みである「IaC は インフラをコードで定義する手法:手作業のクリックをやめ、設定ファイルからサーバー/ネットワークを構築する。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。