Skip to content

Infrastructure as Code(インフラストラクチャ・アズ・コード)

はじめに

このような悪夢を経験したことがありますか:本番サーバーがダウンしたが、当初どのように設定されたか誰も覚えていない? サーバーに手動でログインし、記憶を頼りにコマンドを打ち込み、タイプミスをしないよう祈る——これが従来の運用の日常でした。Infrastructure as Code(IaC)はこれを完全に変えました:コードを使ってインフラを定義・管理し、サーバー設定をソフトウェアのようにバージョン管理可能、再現可能、監査可能にします。

この記事で学べること

この章を終えると、次のことが身につきます:

  • コア概念:IaC とは何か、なぜそれがモダンな運用の基盤なのかを理解
  • ワークフローの理解:Terraform の Write → Plan → Apply → Destroy の4段階ワークフローを習得
  • ツール選定:Terraform、Pulumi、CloudFormation などの主流ツールの長所と短所を理解
  • リスク認識:設定ドリフトの危険性と検出方法を理解
  • ベストプラクティス:IaC プロジェクトのエンジニアリング管理手法を習得
内容コア概念
第1章IaC の概念手動運用 vs コード管理
第2章Terraform ワークフローWrite → Plan → Apply
第3章ツール比較Terraform、Pulumi、CDK
第4章設定ドリフト検出、予防、修復
第5章ベストプラクティスモジュール化、状態管理、CI/CD

0. 全体像:なぜインフラにも「ソースコード」が必要なのか?

あなたがシェフだと想像してください。すべての料理を感覚で作っていたら——今日は塩をスプーン1杯、明日は2杯——味は常に不安定です。しかし、レシピを書き留めれば——各調味料のグラム数まで正確に指定すれば——誰でも同じ味を再現できます。

インフラ管理も同じ問題に直面しています。1台のサーバーの設定には、OS、ネットワークルール、セキュリティグループ、ストレージボリューム、環境変数など数十のパラメータが関わる可能性があります。手動設定はエラーが起こりやすいだけでなく、再現不可能、監査不可能、ロールバック不可能です。

IaC のコアバリュー

  • 再現可能:同じコードは何回実行しても同じ結果になる(冪等性)
  • バージョン管理可能:インフラの変更が Git で管理され、誰が何を、なぜ変更したかが一目でわかる
  • 監査可能:すべての変更が記録され、コンプライアンス要件を満たす
  • 自動化可能:CI/CD パイプラインによる自動デプロイで、人的エラーを排除
  • 協調可能:チームメンバーが Pull Request でインフラの変更をレビュー——コードレビューと同じように

1. IaC の概念:「手動クリック」から「コード宣言」へ

従来の運用のやり方は次の通りです:クラウドプラットフォームのコンソールにログインし、手動でクリックしてサーバーを作成し、ネットワークを設定し、セキュリティグループを設定します。このアプローチは数台のサーバーを管理する場合には対応できますが、数十、数百台にスケールすると悪夢になります。

IaC の中心的な考え方は:宣言型コードで望むインフラの状態を記述し、ツールに自動的に実現させることです。ツールに「まず VPC を作成し、次にサブネットを作成し、次にセキュリティグループを作成する」(命令型)と指示する必要はありません。単に「このようなネットワーク環境が欲しい」(宣言型)と言えば、ツールが必要なステップを自動的に計算します。

交互演示 ── 手动运维 vs 基础设施即代码
手动运维流程
1
🌐
登录云控制台
需要记住密码
2
🖥️
手动创建服务器
配置可能遗漏
3
🔧
配置安全组规则
容易开放过多端口
4
💾
挂载存储卷
大小可能选错
5
🔗
配置负载均衡
路由规则易出错
6
📋
手动记录到文档
文档很快过时
对比维度手动运维基础设施即代码
可重复性每次操作可能不同代码保证完全一致
速度分钟到小时级秒到分钟级
审计追踪依赖人工记录Git 历史自动记录
协作口头传达、截图Code Review、PR 流程
回滚几乎不可能git revert 一键回滚
次元手動運用Infrastructure as Code
操作方法コンソールにログインしてクリックコードファイルを作成
再現性ドキュメントと記憶に依存コードがドキュメント、100% 再現可能
変更追跡記録なしまたは不完全Git バージョン管理、完全な履歴
協力方法口頭コミュニケーション、ドキュメントの受け渡しPull Request レビュー
ロールバック機能手動の逆操作git revert + 再 apply
一貫性環境間の差異が大きい開発/テスト/本番が完全に同一

宣言型 vs 命令型

  • 宣言型(Declarative):「何が欲しいか」を記述し、ツールが「どうやるか」を自動計算。Terraform、CloudFormation がこのアプローチを採用。長所は冪等性が高いことで、短所は柔軟性が制限されること。
  • 命令型(Imperative):「どうやるか」を記述し、段階的に実行。Ansible、シェルスクリプトがこのアプローチを採用。長所は柔軟性で、短所は冪等性の保証が困難なこと。
  • ハイブリッド:Pulumi、AWS CDK は汎用プログラミング言語で記述し、宣言型の状態管理と命令型の柔軟性を併せ持つ。

2. Terraform ワークフロー:Write → Plan → Apply

Terraform は現在最も人気のある IaC ツールで、HashiCorp が開発しています。そのワークフローは明確で直感的で、ソフトウェア開発の「コーディング→レビュー→デプロイ→クリーンアップ」のように4つの段階に分かれています。

交互演示 ── Terraform 工作流四阶段
📝Write
🔍Plan
🚀Apply
🗑️Destroy
📝Write ── 编写基础设施代码

用声明式语言(HCL)描述你期望的基础设施状态。代码就是文档,可以提交到 Git 进行版本管理和 Code Review。

Terminal
📄使用 .tf 文件描述资源
🔧HCL 语法简洁易读
📦支持模块化复用

4段階ワークフロー

  1. Write(記述):HCL(HashiCorp Configuration Language)でインフラ定義ファイル(.tf)を作成。必要なリソースを宣言:サーバー、データベース、ネットワークなど。
  2. Plan(計画)terraform plan を実行。Terraform が現在の状態と目標状態を比較し、「実行計画」を生成——作成、変更、削除するリソースを表示。実際に実行する前に変更を確認できるセーフティネット。
  3. Apply(適用):計画が正しいことを確認した後、terraform apply を実行。Terraform が計画に従ってリソースを作成または変更。実行完了後、現在の状態が状態ファイル(terraform.tfstate)に保存される。
  4. Destroy(破棄):不要になったら、terraform destroy を実行してすべてのリソースをクリーンアップし、不要なコストを回避。
コマンド目的インフラを変更するか使用場面
terraform initプロジェクトの初期化、プロバイダーのダウンロードいいえ初回使用または新しいプロバイダーの追加時
terraform plan変更のプレビュー、実行計画の生成いいえ毎回の変更前に必ず実行
terraform apply変更の実行、リソースの作成/変更はいplan を確認後に実行
terraform destroyすべてのリソースの破棄はいテスト環境のクリーンアップ、サービスの廃止
terraform state状態ファイルの表示/管理操作による状態の移行、リソースのインポート

3. ツール比較:あなたに合った IaC ツールの選択

IaC 分野には複数のツールがあり、それぞれ異なる重点を持っています。ツールの選択時には、チームの技術スタック、クラウドプラットフォーム、プロジェクトの規模などを考慮する必要があります。「最高」のツールはなく、あなたのシナリオに最適なツールだけがあります。

交互演示 ── 主流 IaC 工具对比
选择要对比的工具(至少选 2 个):
特性🟣Terraform🟠CloudFormation
厂商HashiCorpAWS
配置语言HCLYAML / JSON
声明式/命令式声明式声明式
多云支持原生多云仅 AWS
状态管理State 文件AWS 托管
学习曲线中等中等偏高
社区生态非常活跃AWS 生态
最佳场景多云/混合云纯 AWS 环境
点击下方工具名称查看详细介绍和代码示例
ツール言語クラウドサポート学習曲線使用ケース
TerraformHCLマルチクラウド(AWS/Azure/GCP)中程度マルチクラウド環境、チームコラボレーション
PulumiPython/TS/Goマルチクラウド低い(馴染みのあるプログラミング言語)開発者フレンドリー、複雑なロジック
AWS CloudFormationJSON/YAMLAWS のみ中程度純粋な AWS 環境
AWS CDKPython/TS/JavaAWS のみ低いAWS + プログラミング言語の好み
AnsibleYAMLマルチクラウド + ベアメタル低い設定管理、ハイブリッド環境

どう選ぶ?

  • スタートアップ / 単一クラウド:CloudFormation(AWS)または対応するクラウドプラットフォームのネイティブツールが最適なエコシステム統合を提供
  • マルチクラウド / 中〜大規模チーム:Terraform —— 最大のコミュニティ、最も豊富なプロバイダー、採用が最も容易
  • 開発者主導のチーム:Pulumi または CDK —— 馴染みのあるプログラミング言語でインフラを記述、IDE サポートが良好
  • 設定管理が必要:Ansible —— サーバー内部の設定(ソフトウェアのインストール、設定ファイルの変更)に優れている

4. 設定ドリフト:サイレントな時限爆弾

設定ドリフト(Configuration Drift)は IaC プラクティスにおける最も隠れた敵です。これは実際のインフラ状態とコード定義の状態の間に徐々にずれが生じることを指します。

このずれは通常どのように発生するのでしょうか?ある人が「迅速な修正」のために、コンソールに直接ログインしてセキュリティグループルールを手動で変更した。ある人がデバッグのために、あるサーバーの設定を一時的に増やしたが、元に戻すのを忘れた。これらの「小さな変更」が蓄積し、最終的にコードと実際の環境が大きく乖離します。

交互演示 ── 配置漂移:无声的定时炸弹
初始部署
手动修改
又一次修改
漂移加剧
IaC 检测
期望状态(代码定义)
🖥️
Server-A
Nginx 1.24 | 443 | 2GB
🖥️
Server-B
Nginx 1.24 | 443 | 2GB
🖥️
Server-C
Nginx 1.24 | 443 | 2GB
状态一致
实际状态(线上环境)
🖥️
Server-A
Nginx 1.24 | 443 | 2GB
🖥️
Server-B
Nginx 1.24 | 443 | 2GB
🖥️
Server-C
Nginx 1.24 | 443 | 2GB
第 0 步:通过 IaC 初始部署

团队使用 Terraform 部署了 3 台 Web 服务器,配置完全一致:Nginx 1.24、端口 443、2GB 内存。代码和实际状态完美匹配。

关键教训
🚫禁止手动修改线上环境,所有变更必须通过代码
🔍定期运行 terraform plan 检测漂移
🔒限制生产环境的 SSH 权限,减少人为干预
📋建立变更审批流程(PR → Review → Merge → Apply)

設定ドリフトの危険性

  1. 再現不可能:コードが記述する環境と実際の環境が一致せず、新しい環境を作成する際に問題が発生
  2. ロールバックの失敗:前のバージョンにロールバックすれば復旧できると思っても、実際の環境は手動で変更されている
  3. セキュリティリスク:手動で開かれたポート、緩和された権限が忘れられ、攻撃の入口になる可能性
  4. 監査の失敗:コンプライアンス監査はコードに基づいているが、コードが実際の状態を反映していない
予防措置説明
手動変更の禁止IAM ポリシーでコンソール操作権限を制限
定期的なドリフト検出定期的に terraform plan を実行して差異を確認
自動修復ドリフトを検出したら自動的に apply を実行して整合性を回復
変更監査CloudTrail などの監査ログを有効にし、すべての変更ソースを追跡

5. ベストプラクティス:IaC プロジェクトを持続可能にする

IaC コードもアプリケーションコードと同様に、良いエンジニアリングプラクティスによって保守性を確保する必要があります。インフラの規模が拡大するにつれて、秩序のない IaC コードは別の形の「技術的負債」になります。

交互演示 ── IaC 最佳实践
📂
实践一:基础设施代码纳入版本控制
像管理应用代码一样管理基础设施代码
✅ 推荐做法
所有 .tf 文件提交到 Git 仓库
使用分支策略(main / dev / feature)
通过 Pull Request 进行代码审查
在 CI 中自动运行 terraform plan
❌ 反面模式
在本地执行 apply 后不提交代码
直接在 main 分支上修改
将 .tfstate 文件提交到 Git
跳过 Code Review 直接部署
.gitignore 示例
# 忽略本地状态文件
*.tfstate
*.tfstate.backup
.terraform/

# 忽略敏感变量文件
*.tfvars
!example.tfvars
实践成熟度
入门
基础
进阶
成熟
卓越

6つのコアベストプラクティス

  1. モジュール化:再利用可能なインフラをモジュール(VPC モジュール、データベースモジュールなど)として抽象化し、コピー&ペーストを避ける。関数を書くように——一箇所で定義、複数箇所で呼び出し。
  2. 環境の分離:開発、テスト、本番は独立した状態ファイルと変数ファイルを使用し、workspace またはディレクトリ構造で分離。
  3. リモート状態管理:状態ファイル(tfstate)をリモートバックエンド(S3 + DynamoDB)に保存し、チームコラボレーションと状態ロックをサポートし、並行競合を防止。
  4. 機密情報の管理:パスワード、鍵などの機密情報はコードに書き込まない。Vault、AWS Secrets Manager などのツールで管理。
  5. CI/CD 統合:terraform plan を PR プロセスに統合し、apply はパイプラインを通じて自動実行し、ローカルの手動操作を排除。
  6. コードレビュー:インフラの変更はアプリケーションコードと同様に Code Review が必要。特にセキュリティグループや IAM ポリシーに関わる変更について。

まとめ

Infrastructure as Code はモダンなクラウドネイティブ運用の基盤です。「記述不可能な手動操作」を「バージョン管理可能なコード」に変え、インフラ管理を「芸術」から「エンジニアリング」へと転換させます。

この章の重要ポイントを振り返ります:

  1. IaC の本質:コードでインフラの望ましい状態を宣言し、ツールに自動的に実現させる
  2. Terraform ワークフロー:Write → Plan → Apply の3ステップ、Plan がセーフティネット
  3. ツール選定:マルチクラウドなら Terraform、単一クラウドならネイティブツール、開発者チームなら Pulumi
  4. 設定ドリフト:最も隠れたリスク、プロセスとツールの両面からの防護が必要
  5. エンジニアリング管理:モジュール化、環境分離、リモート状態、CI/CD 統合がすべて不可欠

参考文献