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

概要 — まず全体をつかむ

サーバやネットワークを用意するとき、管理画面を 手でポチポチ設定 していくと、手順が人の頭の中にしか残らず、次に同じものを作るとき必ずどこかずれます。これを解決するのが IaC(Infrastructure as Code) です。

詳細 — 1段階ずつ追う

これは何をする係?

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

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

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

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

登場人物メモ:

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

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

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

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

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

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

登場人物メモ:

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

仕事の流れ

  1. 望むインフラの構成を ファイルに書く(サーバ何台・ネットワークはこう…)
  2. ツールにそのファイルを 読ませる
  3. ツールが構成を 自動で構築(※2 プロビジョニング)する
  4. 同じファイルを使えば、別の場所でも 同じ環境が再現 される

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

この部分をもっと深く(中級
  1. 望む構成を コードで宣言 する(クラウドVPCまで丸ごと)
  2. ツールが 現状との差分 を計算する(何が足りず・何が余分か)
  3. 差分だけを 適用 して、実状態を望む状態へ寄せる
  4. コードを履歴管理に置き、変更はレビューを経て反映する

コード化でうれしい理由

  • 再現できる — 同じコードから同じ環境が何度でも作れる(開発用・本番用をそろえやすい)
  • 履歴が残る — 「いつ・誰が・何を変えたか」がコードの変更として追える
  • レビューできる — 変更を出す前に、他の人が内容を確認できる

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

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

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

⚠️ うまくいかないとき

  • 手で直してずれる — コードを通さず画面で直すと、コードと現実が食い違う
  • コードのミスが全体に波及 — 間違ったまま流すと、全環境に同じ間違いが広がる
  • 消す操作も自動 — 「消す」もコードどおり実行されるので、書き間違いに注意
この部分をもっと深く(中級
  • 手動変更でのずれ(ドリフト) — 画面で直すとコードと現実が食い違い、次の適用で上書きされる
  • 削除の巻き添え — 宣言から外した資源が消える。消してよい物か確認が要る
  • 状態の取り違え — ツールが持つ「今の状態」の記録が壊れると、差分計算を誤る
  • 秘密情報の混入 — 鍵やパスワードをコードに直書きすると、履歴に残って漏れる

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

アニメーション『ドリフト検出(コードと現実のズレ)』を開く
ドリフト検出 — コードと現実のズレを見つけて直すコード(望む状態)サーバ2台開放ポート443 のみタグenv: prod実際のクラウド(実状態)サーバ手で1台 増設3台開放ポート手で22を 開放443 + 22タグ手で 削除なし手作業でズレるplan:差分を検出(追加/変更/削除)変更サーバ 3台 → 2台 に戻す削除手で開けたポート22 を閉じる追加消えたタグ env: prod を戻すapply:差分だけ適用して、望む状態へ戻す

理解度チェック

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

1. 手作業でのインフラ構築が、IaCと比べて劣る点として本文が挙げているのはどれ?

2. IaCで「履歴が残る」とは、具体的にどういうことか?

3. IaCによって「属人化(その人しか分からない状態)」が減るのはなぜか?

4. 同じIaCのコードを別の環境で実行すると、どうなる?

5. IaCを使う環境で、コードを通さず管理画面で直接インフラを変えると何が問題になるか?

6. コードに従って、サーバなどのインフラを実際に用意する工程を何と呼ぶ?(カタカナ)

7. 「インフラの構成をコードに書いて自動構築する」考え方を、英字3文字の略称で答えてください。

8. IaC(Infrastructure as Code)を一言でいうと?