システムのインフラ基盤を手動でセットアップするのではなくコードで定義、管理するIaC(Infrastructure as Code)というアプローチがあります。インフラストラクチャーの構成や設定をコード化することで環境の再現や変更管理、自動化などが容易に実現でき、近年ではIaCの導入が主流となっています。
この記事では DX化が進む現代のシステム構築において欠かせないIaC(Infrastructure as Code)について紹介します。IaCとは何かという基礎的な内容から、IaCツールの種類とそれぞれの特徴などについても紹介します。IaCについて一から知りたい方、どのIaCツールを使えばよいか知りたい方など多くの方の参考になれば幸いです。

IaC (Infrastructure as Code) とは?

冒頭でも紹介しましたが、 IaC(Infrastructure as Code)とはインフラストラクチャーをコードで定義、管理するアプローチのことです。
従来のシステムインフラはGUI (画面上での操作)から手動でサーバやデータベース、ネットワークなどのインフラリソースを構築、管理していましたが、IaCではこれらのインフラリソースの設定値などをコードで定義し、そのコードをデプロイすることでシステムインフラを構築、管理します。
IaCによってシステムインフラをコード化することによってこれまでのインフラ構築、管理の課題解決やさまざまなメリットを享受することができます。

IaCのメリットとデメリット 

では、システムインフラの管理にIaCを導入することでどのようなメリットがあるのか、導入する際のデメリットは何なのかを紹介します。 

メリット①自動化 

IaCを導入することでインフラストラクチャーの構築や管理の作業を自動化することができます。コードの作成やデプロイは自身で行う必要がありますが、コードをデプロイするとコードに記述された内容に沿ってリソースが自動で作成されるためGUIで一つ一つ設定値を入力する作業を省力化できます。自動化によって複数リソースの作成も効率的に行えますし、手動の作業を最小限に抑えることができるので、人為的なミスの削減にもつながります。 

メリット②冪等性(べきとうせい) 

IaCを導入するメリットの一つとして冪等性(特定の操作を何度繰り返しても同じ結果になるという性質)があります。
IaCでは作成したコードに冪等性があるためコードの再利用が可能です。
例えば本番環境と似た検証環境を用意したい場合に、本番環境の作成に使用したコードを複製して検証環境用のコードを作成することで本番環境と同等の検証環境を簡単に作成することができます。こうすることで環境の一貫性を高められ、環境間の差異を気にせず検証を行うことができるようになります。
また同じ設定のサーバを複数用意する必要がある場合にも、コードを複製してデプロイするだけで同じ設定のサーバを複数作成できます。
このようにコードの冪等性によってインフラリソースや環境全体の再現が容易になり一貫したシステム構成を保つことができます。

メリット③コードをドキュメントとしても利用できる

コードのバージョン管理を行うことで過去の変更履歴やコードの編集内容を確認できるようになります。変更管理が容易になるだけでなく、コードをドキュメントとしても利用できるようになります。
コード化作業時に過去のコードの修正内容を参考にすることでスムーズにコード化が行えることがあります。
私自身、コード化業務を始めた頃はコードの記述方法も分からない状態でしたが、既存のコードや修正内容を参考に作業を行うなかで知識や記述方法などを身につけることができました。
コードをドキュメントとしても利用でき、ノウハウの蓄積になる点もIaC導入のメリットと言えるでしょう。

デメリット①コード化に時間がかかる

コードを作成する際にはプログラミング言語の習得、記述方法の調査や検証が必要になります。そのため、コード化作業に膨大な時間がかかります。一度コードを作成してしまえば2回目以降はそのコードを再利用できて便利ですが、あまり再利用する機会がない作業は手動で作成した方が工数を削減できます。
IaCを導入する際はコード化に時間がかかることを念頭に置き、本当にコード化する必要があるか吟味するようにしましょう。

デメリット②複雑性

大規模なシステムや複雑な構成のインフラストラクチャーを扱う場合、IaCコードが複雑になり管理の難易度が上がります。コード化にかかる時間が増え、設計漏れなども生じやすくなる点がデメリットとして挙げられます。
そのため最初はなるべく小規模なシステムから導入することが重要です。既存の大規模なシステムに導入する場合はシステムの一部分だけIaCでコード化し、問題なければ徐々にコード化する範囲を拡大するなどして導入の難易度を下げると良いでしょう。

デメリット③手動変更によって整合性が取れなくなる

先ほども述べたようにコード化には時間がかかり、少しの設定変更なら手動で変更したほうが早いこともあります。緊急を要する変更などで手動で設定を変更してしまうと、実際の設定とコードの内容との間で整合性が取れなくなってしまいます。
IaCを導入する際はコンソールから変更作業ができないように権限設定をするか、手動変更した際はコードも修正するよう徹底しましょう。

このようにIaCの導入にはさまざまなメリット・デメリットがあります。これらを踏まえた上でIaCを導入する際に必要となるIaCツールを以下に詳しく紹介します。

主要なIaCツール 

次に主要なIaCツールをツールごとの特徴も含めて紹介します。 

Terraform

Terraformは、HCL(HashiCorp Configuration Language)を使用したtfファイルでインフラストラクチャーの構成を定義、管理するIaCツールで、多くのクラウドサービスやオンプレミスのインフラストラクチャーをサポートしています。 
通常、リソースの作成時にはリソースの依存関係を考慮する必要がありますが、Terraformではリソースの依存関係を自動で解決してくれます。依存関係を気にすることなくリソースの設定や構成に集中できるので非常に便利です。また、コードの記述方法などのドキュメントがインターネット上に豊富にあるため初めてコード化する内容でもコードの記述がしやすいかと思います。 

Ansible

Ansibleはyaml形式のPraybookで構成を定義するIaCツールです。多くのオペレーティングシステムやクラウドサービスをサポートしている点やエージェントレスのためインストールや設定などが簡単な点がメリットとして挙げられます。また、OSやミドルウェア層の構成管理に優れているという特徴もあります。
AnsibleのPlaybookの書き方などについてはこちらの記事で紹介しているので是非ご覧ください。 

Chef

ChefはRuby言語を使用したレシピでサーバの状態を定義するIaCツールです。インフラストラクチャーの管理や自動化だけではなくミドルウェアの管理やアプリケーションのデプロイなどもサポートしている点が特徴です。
また、エージェントベースのアーキテクチャなのでリアルタイムの状態管理ができる、Rubyで高度なカスタマイズもできるなどのメリットがあります。 

Puppet

PuppetはRuby言語をベースとする DSL(Domain Specific Language)を使用して構成を定義するエージェントベースの構成管理ツールです。エージェントベースのためリアルタイムの状態管理が可能で大規模な環境でのスケーラビリティとパフォーマンスが優れています。また、カスタマイズ性が高くニーズに柔軟に対応できる点もメリットの一つです。 

Pulumi

PulumiはPython、JavaScript、Goなどの既存のプログラミング言語を使用してインフラストラクチャーを定義できる構成管理ツールです。AWS, Google Cloud,Azureなどの主要なクラウドサービスをサポートしています。
使用できるプログラミング言語が多いため、使ったことのある言語や比較的難易度の低い言語を選択することで学習コストを抑えることができます。ただし、比較的新しいツールのためサポートやドキュメントなどが他のツールに比べて少ない場合があります。 

CloudFormation

CloudFormationはAWS(Amazon Web Service)というクラウドサービスで利用できるIaCツールです。CloudFormationテンプレートにjsonまたはyaml形式でコードを定義することでAWS内の全てのリソースを自動で作成、変更、削除することができます。
またCloudFormationはコードの記述例を紹介しているサイトが多くあるので、初学者でも習得しやすいと思います。

Cloud Development Manager

Cloud Development ManagerはGoogle Cloud (GCP)内のリソースを構成ファイルに定義することで作成、変更、削除を自動で行うことができます。構成ファイルはjinjaまたはpythonを使用してyaml形式で記述します。yaml形式の記述に慣れている場合はjinjaでテンプレートを記述する方法が、pythonに慣れている場合にはpythonライブラリを使用してテンプレート定義をフォーマット化する方法が簡単に記述できます。 

Azure Resource Manager

Azure Resource ManagerはAzureのリソースをデプロイ、管理するサービスです。Azure Resource Manager テンプレート (ARMテンプレート)を使ってAzureアカウント内のリソースの作成、変更、削除を自動で行うことができます。ARMテンプレートはjson形式で記述します。また、ARMテンプレートと同じ機能で構文がより使いやすいBicepファイルというものもあります。Bicepという言語を用いたBicepファイルをデプロイすると自動でARMテンプレートに変換される仕組みになっています。
Azure Resource Manageでは、リソースグループを使用して複数のリソースを一括で変更、管理することができます。

どのIaCツールを選ぶべきか?

先ほど主要なIaCツールをいくつか紹介しましたが、実際のシステムにIaCを導入する場合はどれかを選ぶ必要があるかと思います。状況や用途に応じて適したIaCツールを選択しないと自動化や再現性などのメリットを享受できず、管理しづらくなってしまいます。
そこでIaCツール選択のポイントを紹介します。IaCの導入を検討している方はぜひ参考にしていただければと思います。

IaCツール選択のポイント

エージェントベース/エージェントレス

IaCツールの中にはエージェントベースのものとエージェントレスのものがあります。エージェントベースのツールはクライアントデバイスにエージェントをインストールすることでエージェントがローカルで実行、サーバーとの通信を行います。一方、エージェントレスのツールはエージェントのインストールを必要とせず、SSHやWinRMなどでリモート接続を行います。
エージェントベースはローカルで動作するため、リアルタイムでの状態管理が可能になる、通信の問題が少ないという特徴があります。
オンプレミス環境や仮想化環境などエージェントのインストールが可能で、リアルタイムの状態管理が必要な場合やセキュリティーが厳しい環境ではエージェントベースのIaCツールを選択しましょう。
エージェントレスはエージェントのインストールが不要なためツールの導入と管理が容易になります。一方で、リアルタイムでの状態管理が制限される場合や通信の問題が発生する可能性があります。
エージェントのインストールが難しい場合や、リアルタイムでの状態管理が必要ない場合や通信の問題をある程度許容できる場合にエージェントレスのIaCツールを選択しましょう。

宣言型/命令型

IaCツールはコードでインフラストラクチャーの定義、管理を行いますが、その定義の型には宣言型と命令型があります。
宣言型はインフラストラクチャーのあるべき姿(望ましい状態)を定義します。命令型はインフラストラクチャーを構築するまでの手順や実行するコマンドなどを定義します。
宣言型のIaCツールは構築の手順をツール側で決定するため手順を抽象化でき、変更が頻繁に発生する場合や大規模なインフラストラクチャーを管理する場合に使用します。
命令型のIaCツールはシステムを構築する手順を細かく成業でき、実行する操作や手順が定められている場合や特定の手順、プロセスを実行する必要がある場合に使用します。
コードに定義する内容が異なるためどちらの型で定義するのかというのもIaCツールを選択する際のポイントの一つとなります。 

IaCを導入する規模

プロジェクトやシステムの規模がどれくらい大きいのかもIaCツールを導入する際に考慮する必要があります。IaCツールによってはプロジェクトなどの規模が大きくなりすぎると本来の良さを発揮できなくなることもあります。どれくらいの規模のプロジェクトやシステムなのか、その規模に対応できるツールなのかも吟味して導入するIaCツールを選択しましょう。大規模なシステムやプロジェクトにはTerraformやChef、Puppetが向いています。

チームメンバーのスキル

チームメンバーが習得しているプログラミング言語に対応しているIaCツールを選択することも一つのポイントです。IaCツールを用いてインフラストラクチャーの構成を定義するためにはプログラミング言語の習得が必要になります。そのため学習コストがかかることがIaC導入のデメリットになることもあります。しかし、チームメンバーが得意なプログラミング言語でIaCツールが使用できれば学習コストが抑えられ、スムーズにコード化の作業が実施できます。

まとめ

今回はIaCの概要とIaCツールの特徴や選択のポイントなどを紹介しました。
IaCは導入することでシステムインフラの管理業務を自動化できる、環境の再現性を高められるなどのメリットがあります。自動化による業務改善や環境の一貫性、再現性を高めることは重要であり、IaCの導入は必要不可欠です。
また、IaCを導入するためにはシステムや環境に応じて適切なIaCツールを選択する必要があります。ツールごとの長所や短所、コードの記述方法や使用するプログラミング言語、システムの規模などを考慮してIaCツールを選択できるようにしましょう。導入する際はなるべく小規模スタートになるようにし、設計漏れや記述ミスなどが起きないようにしましょう。
IaCの導入にはIaCツールに関する知識、技術の習得が不可欠ですが、独学ですべてを身につけるのは非常にハードルが高いかと思います。弊社が運営しているBFT道場では、TerraformやAnsibleの研修を実施しており、ハンズオン形式でコードの記述方法を学習することができます。これからTerraformやAnsibleのスキルを身につけたいと考えている方におすすめの研修内容となっているので是非こちらも活用していただければと思います。