IaC — インフラをコードで書いて自動構築する

概要 — まず全体をつかむ

初級では IaC を「インフラをコードで書いて自動構築する考え方」と捉えました。中級では、宣言的 vs 手続き的 の違い、べき等性、そしてコードの履歴管理との相性を見ます。

詳細 — 1段階ずつ追う

これは何をする係?

IaC には大きく2つの書き方があります。

  • 宣言的 — 「こうあってほしい」という 最終状態 を書く。どう作るかはツールに任せる
  • 手続き的 — 「まずこれ、次にこれ」と 手順 を1つずつ書き並べる

主流は宣言的です。ツールが 現状コード(望む状態) を比べ、足りない物を作り・余分を消して、望む状態へ収束 させます。

アニメーション『IaCの宣言的な収束』を開く
コード(望む構成)# こうあってほしいVPC × 1サーバ × 2ロードバランサ × 1履歴管理(git)に残すIaCツール現状とコードを比べて差分を計算足りない→作る余分→消す読む差分を適用現状を取得実際のクラウド資源VPC一致→維持サーバ 1一致→維持サーバ 2足りない→作るロードバランサ一致→維持余分な古い資源余分→消す同じコード → 同じ環境(再現性・べき等:何度実行しても同じ状態に収束する)

この「現状に合わせて必要な分だけ動く」性質から、べき等性(※1)が生まれます。何度実行しても、既に望む状態なら何もせず、ずれていれば直すだけ。だから 安全に繰り返せます

登場人物メモ:

  • ※1 べき等性 — 何度実行しても同じ結果に収束する性質。途中失敗しても再実行で復旧できる
  • ※2 プロビジョニング — サーバやネットワークなど、資源そのものを用意すること
  • ※3 構成管理 — 用意した資源の中身(設定・パッケージ等)をあるべき状態に保つこと
この部分をもっと深く(上級

宣言的IaCの心臓は、望む状態へ現実を寄せる調整(reconciliation)です。人は「どうあってほしいか」だけを書き、ツールが差を埋めます。

  • plan — コード(望む状態)と現況の記録を突き合わせ、「何を作り・変え・消すか」の差分を先に見せる。適用前に影響を確認できる
  • apply — その差分だけを実行し、実状態を望む状態へ寄せる。全部を作り直さない
  • この「差分だけ動く」性質がべき等性の正体。既に望む状態なら何もせず、ずれていれば直すだけ
アニメーション『IaCの宣言的な収束』を開く
コード(望む構成)# こうあってほしいVPC × 1サーバ × 2ロードバランサ × 1履歴管理(git)に残すIaCツール現状とコードを比べて差分を計算足りない→作る余分→消す読む差分を適用現状を取得実際のクラウド資源VPC一致→維持サーバ 1一致→維持サーバ 2足りない→作るロードバランサ一致→維持余分な古い資源余分→消す同じコード → 同じ環境(再現性・べき等:何度実行しても同じ状態に収束する)

登場人物メモ:

  • ※1 state(状態ファイル) — ツールが把握する「今の構成」の台帳。差分計算の基準
  • ※2 ドリフト — コードを通さない手動変更で、コードと現実がずれること
  • ※3 プロバイダ — 各サービスのAPIを、宣言的な操作へ翻訳するアダプタ
やさしく言うと(初級

IaC は、サーバ・ネットワークといった インフラの構成をコードで書き、ツールに 自動で構築させる 考え方です。

料理でたとえると、勘で味付けするのではなく レシピ(※1 設定ファイル)に分量を書き残す イメージ。レシピどおりに作れば、誰が作っても・何度作っても同じ料理になります。

手作業との違いはここです。

  • 手作業 — 画面を操作。手順は記憶頼み、人によってばらつく
  • IaC — 構成をファイルに記述。そのまま再現 でき、履歴も残る

登場人物メモ:

  • ※1 設定ファイル — 望むインフラの構成を書いたコード。これが「レシピ」になる
  • ※2 プロビジョニング — コードに従ってサーバ等を実際に用意する工程

仕事の流れ

  1. 望む構成を コードで宣言 する(クラウドVPCまで丸ごと)
  2. ツールが 現状との差分 を計算する(何が足りず・何が余分か)
  3. 差分だけを 適用 して、実状態を望む状態へ寄せる
  4. コードを履歴管理に置き、変更はレビューを経て反映する
やさしく言うと(初級
  1. 望むインフラの構成を ファイルに書く(サーバ何台・ネットワークはこう…)
  2. ツールにそのファイルを 読ませる
  3. ツールが構成を 自動で構築(※2 プロビジョニング)する
  4. 同じファイルを使えば、別の場所でも 同じ環境が再現 される

ポイントは、作業の中身が 文章として残る こと。次の人はその文章を読めば、何がどう作られているか分かります。

設計の勘所

  • 宣言的を基本に — 手順ではなく状態を書く。差分の計算はツールに任せ、人はゴールに集中
  • べき等に保つ — 何度流しても壊れない設計にすると、失敗時の再実行が怖くなくなる
  • プロビジョニングと構成管理(※2※3)— 資源を「用意する」層と、中身を「あるべきに保つ」層を分けて考える
  • 履歴管理との相性 — 構成をコードにすると変更履歴が残り、いつ誰が何を変えたか追える。壊れたら前の版へ戻せる

さらに CI/CD と組み合わせると、構成の変更も 自動でテストして適用 できます。アプリだけでなくインフラも、同じ流れ作業に乗せられるわけです。

この部分をもっと深く(上級

規模が大きくなると、部品化作り直す発想が効いてきます。

  • モジュール化 — VPC一式やサーバ群など、まとまった構成を再利用できる部品にする。同じ部品から開発用・本番用を差分パラメータだけ変えて量産できる
  • 合成 — 小さなモジュールを組み合わせて大きな構成を作る。重複を減らし、変更を1か所に集約できる
  • イミュータブルインフラ — 動いているサーバを手で直さず、新しい版を丸ごと作って古い版と入れ替えるDockerイメージの差し替えと同じ発想で、ドリフトが起きにくく、戻すのも入れ替えるだけ
やさしく言うと(初級
  • 再現できる — 同じコードから同じ環境が何度でも作れる(開発用・本番用をそろえやすい)
  • 履歴が残る — 「いつ・誰が・何を変えたか」がコードの変更として追える
  • レビューできる — 変更を出す前に、他の人が内容を確認できる

手順が人の記憶から コードへ移る ので、属人化(その人しか分からない状態)が減ります。

⚠️ うまくいかないとき

  • 手動変更でのずれ(ドリフト) — 画面で直すとコードと現実が食い違い、次の適用で上書きされる
  • 削除の巻き添え — 宣言から外した資源が消える。消してよい物か確認が要る
  • 状態の取り違え — ツールが持つ「今の状態」の記録が壊れると、差分計算を誤る
  • 秘密情報の混入 — 鍵やパスワードをコードに直書きすると、履歴に残って漏れる

このうちドリフトは、コード(望む状態)と実際のクラウド(実状態)を突き合わせれば見つかります。plan が差分(追加/変更/削除)を洗い出し、apply で望む状態へ戻します。

アニメーション『ドリフト検出(コードと現実のズレ)』を開く
ドリフト検出 — コードと現実のズレを見つけて直すコード(望む状態)サーバ2台開放ポート443 のみタグenv: prod実際のクラウド(実状態)サーバ手で1台 増設3台開放ポート手で22を 開放443 + 22タグ手で 削除なし手作業でズレるplan:差分を検出(追加/変更/削除)変更サーバ 3台 → 2台 に戻す削除手で開けたポート22 を閉じる追加消えたタグ env: prod を戻すapply:差分だけ適用して、望む状態へ戻す
この部分をもっと深く(上級
  • 手動変更によるドリフト — 画面で直すとstateと食い違い、次のapplyで意図せず上書きされる
  • stateの破損・取り違え — 現況の台帳が壊れると差分計算を誤り、実在する物を作り直したり二重化する
  • 削除の巻き添え — 宣言から外した資源が消える。planで消える対象を必ず確認する
  • 秘密のstate流出 — 平文の秘密を含んだstateを不用意に共有・コミットして漏らす
やさしく言うと(初級
  • 手で直してずれる — コードを通さず画面で直すと、コードと現実が食い違う
  • コードのミスが全体に波及 — 間違ったまま流すと、全環境に同じ間違いが広がる
  • 消す操作も自動 — 「消す」もコードどおり実行されるので、書き間違いに注意

理解度チェック

そのまま解けます(成績は保存されません)。無料アカウントを作ると、学習の記録と進捗の山登りが始まります。

1. IaCでいう「べき等性」とはどういう性質?

2. 宣言的なIaCの特徴として正しいのは?

3. 「まずこれ、次にこれ」と手順を1つずつ書き並べる書き方を何と呼ぶ?

4. サーバやネットワークなど「資源そのものを用意すること」を指すのはどれ?

5. 構成をコード(IaC)にして履歴管理に置く利点として正しいのは?

6. 宣言的IaCで「宣言から外した資源」はどうなる?

7. 画面から手で直してコードと現実が食い違うことを、カタカナで何と呼ぶか答えてください。

8. 「どうあってほしいか(最終状態)」を書き、どう作るかはツールに任せる書き方を何と呼ぶか、最後が「的」で終わる語で答えてください。