はじめに#
Terraformの勉強のために「詳解Terraform」を購入。 すこしずつ内容をTILとしてアウトプットして知識を定着させます。 今回のテーマは「IaC(Infrastructure as Code)の5つの分類」 ※IaCとは、インフラなどの環境をコードで記述できるようにしたツール全般を指す。
書籍情報#
- 詳解 Terraform 第3版 ―Infrastructure as Codeを実現する
- 著者:Yevgeniy Brikman
- 訳者:松浦 隼人
- 出版社:オライリージャパン
- 出版年:2023年
5つの分類#
IaCツールは以下の5つのカテゴリに分類されます。これらは対立するものではなく、それぞれ異なる役割を持ち、実際の開発現場では組み合わせて使用することが一般的です。
- アドホックなスクリプト
- 設定管理ツール
- サーバテンプレーティングツール
- オーケストレーションツール
- プロビジョニングツール
アドホックなスクリプト#
作業や処理をpythonやshファイルとして作成して実行するスクリプト
最もシンプルな自動化の方法 単純な処理を実装するなら向いているが、サーバ設定からデプロイまで処理するような複雑な 処理を実装する場合は、一から自力でコードを書く必要があるため、労力がかかる。
設定管理ツール#
既存のサーバ上にソフトウェアなどをインストールするためのツール
- 例:Chef・Puppet・Ansible
- コーディング規約によりファイル内容に一貫性を持たせることが可能
- 冪等性がある
- 1回限りの処理であればアドホックなスクリプトでも十分だが、何度実行しても同じ結果をもたらす冪等性が必要な場合は、Ansibleなどの設定管理ツールのほうが向いている
- Ansibleのモジュールには冪等性が組み込まれているため
- 1回限りの処理であればアドホックなスクリプトでも十分だが、何度実行しても同じ結果をもたらす冪等性が必要な場合は、Ansibleなどの設定管理ツールのほうが向いている
- 配布
- コードの配布により、ローリングデプロイなど複数のリモートサーバをまとめて管理することが可能。
サーバテンプレーティングツール#
OSやソフトウェアをパッケージ化したイメージを作成し、そのイメージから環境を構築するツール
- 例:Docker・Packer・Vagrant
- 「スナップショット」と呼ばれるOSやソフトウェアなどを含んだイメージを作成して、このスナップショットを使ってサーバ環境を構築する
イメージを扱うツールには大別すると2つのカテゴリがある。
仮想マシン
- ハードウェアを含むコンピュータシステム全体をエミュレートする仕組み
- 例:VMware・VirtualBox
- ハイパーバイザを動かしてCPUやメモリなどを仮想化する
- これによりハイパーバイザ上で動かす仮想マシンイメージからは仮想化されてハードウェアのみ見えるようになる。
- 仮想環境とホストマシンを分離することが可能
- 仮想マシンイメージはPackerやVagrantなどのツールで定義可能
コンテナ
- OSのユーザスペースをエミュレートする仕組み
- プロセスやメモリなどを分離するためにDockerなどのコンテナエンジンを動作させる必要がある
- コンテナはユーザスペースのみ見えるようになる。
仮想マシンとコンテナの違い
- 仮想マシン:ハードウェアレベルで仮想化・高度な分離性があり、セキュリティやコンプライアンス面で有利
- コンテナ:OSレベルで仮想化・メモリ消費が少ない
イミュータブルインフラ 一度構築・デプロイされたインフラ環境(サーバやコンテナなど)を変更せず、更新が必要な場合は新しい環境を丸ごと作り直して既存環境と入れ替える運用思想
- サーバテンプレーティングツールにおいて重要な考え
- プロビジョニングツール(Terraformなど)と組み合わせることで、インフラ全体のイミュータブル化も実現可能
オーケストレーションツール#
複数のシステムやサービス、アプリケーション間で行われる多数のタスクや ワークフローを自動的に統合・管理し、効率的に実行するためのソフトウェア
- 例:Kubernetes
プロビジョニングツール#
サーバ自体を作成するようなツール
- インフラに関係しているたいていのものを作成できる(サーバ、データベース、ネットワーク構成、ロードバランサーなど)
- 例:Terraform・CloudFormation
まとめ:IaCの概要#
IaCとは、インフラ環境をコードで記述・管理できるツール全般を指す。大別すると5つのカテゴリがある。
各ツールの特徴と使い分け#
| ツール分類 | 主な用途 | 代表例 | 向いている場面 |
|---|---|---|---|
| アドホックなスクリプト | シンプルな自動化 | Bash, Python | 1回限りの処理、単純な作業の自動化 |
| 設定管理ツール | 既存サーバの設定・ソフトウェアインストール | Ansible, Chef, Puppet | 複数サーバへのソフトウェアデプロイ、冪等性が必要な設定作業 |
| サーバテンプレーティングツール | イメージからサーバ環境を構築 | Docker, Packer, Vagrant | 環境の再現性確保、イミュータブルインフラの実現 |
| オーケストレーションツール | 複数システム・サービスの統合管理 | Kubernetes | コンテナの起動・停止・スケーリング、マイクロサービス管理 |
| プロビジョニングツール | インフラ全体の作成・管理 | Terraform, CloudFormation | サーバ・ネットワーク・DB等のインフラリソース作成 |
ツール選択の基本方針#
- シンプルな自動化:アドホックなスクリプト
- 既存環境の設定変更:設定管理ツール
- 環境の再現性重視:サーバテンプレーティングツール
- コンテナ管理:オーケストレーションツール
- インフラ全体の構築:プロビジョニングツール(Terraform等)
実際の開発現場では、これらのツールを組み合わせて使用することが多い。 例:Terraformでインフラを構築 → Ansibleでソフトウェアをインストール → Dockerでアプリケーションを動かす → Kubernetesで管理