【IaCシリーズ3】プロジェクトに最適な IaC ツール比較
Infrastructure as Code (IaC)について取り上げるブログシリーズ、IaCツールの紹介と比較を行います。取り上げるツールは、Terraform、AWS CloudFormation、AWS CDK、Azure Resource Manager、Google Cloud Deployment Manager、Puppet、Ansible、Pulumiです。プロジェクトのツール選択の参考になればと思います。
目次[非表示]
- 1.広く使われてきているIaC
- 1.1.IaCへのアプローチ
- 2.IaCツールの紹介
- 2.1.Terraform
- 2.2.AWS CloudFormation
- 2.3.AWS Cloud Development Kit (AWS CDK)
- 2.4.Azure Resource Manager
- 2.5.Google Cloud Deployment Manager
- 2.6.Puppet
- 2.7.Ansible
- 2.8.Pulumi
- 3.IaC ツールの比較
- 4.おわりに
広く使われてきているIaC
IaCが広まってきて、インフラストラクチャのプロビジョニングと管理に使用できるIaC ツールもいろいろと出てきました。しかし、その一方でプロジェクトに適したものを比較検討するのは、少し難しい作業になってくるかもしません。プロジェクト要件や、導入を想定してるプラットフォーム(AWS、Azure、オンプレミスなど)、チーム内で利用可能なスキルセット(開発用に知られている言語を含む)など、考慮して選ばなければなりません。
IaCへのアプローチ
こちらの記事でご紹介したように、インフラストラクチャをコードとして記述する方法は 2 つあります。
命令型
- 宣言型
これらのアプローチは、 IaC ツールを決める上で重要な要素となります。今回ご紹介するツールのうち、Ansibleのみ「命令型」で、その他は「宣言型」です。
IaCツールの紹介
ここから、有名なIaC製品の概要を一つずつ見ていきたいと思います。
Terraform
Terraformは、HashiCorp社が提供するインフラストラクチャ自動化のためのオープンソースのツールで、主要なクラウドプロバイダーやKubernetes、Herokuなどをサポートし、マルチクラウドやオンプレミスのインフラ構築にも対応します。HCLという独自言語で構成を記述し、CLIで事前に構成のチェックが可能で、状態の管理や全体の削除も簡単に行えます。また、チームでの利用に適したSaaS版「Terraformクラウド」も提供されています。
また、2020年にはAWSの協力で「CDK for Terraform」(CDKTF)も導入され、複数のプログラミング言語で構成が作成可能になりました。Terraform 用の CDK は、AWS CDK のライブラリを使用して Terraform 構成を生成します。TypeScript、Python、Java、C#、Go (実験的) などの汎用プログラミング言語を使用して Terraform 構成を生成できるため、HCL を学習しなくとも利用できます。
詳細は下記をご覧ください。
AWS CloudFormation
AWS CloudFormation(CFn)は、AWSのクラウドプラットフォーム専用のIaCツールで、AWSリソースのプロビジョニング、デプロイ、管理を行います。テンプレートはYAMLまたはJSON形式で記述され、他のAWSリソースとの統合機能が強力で普及しています。スタックという単位で関連リソースを一括管理し、変更セットで提案変更の確認が可能です。また、ロールバック機能でスタックを以前の状態に復元することもできます。
AWS Cloud Development Kit (AWS CDK)
AWS CDK(Cloud Development Kit)は、クラウドインフラをコードとして定義するためのオープンソースフレームワークで、TypeScript、JavaScript、Python、Java、C#/.Net、Goでの記述が可能です。CDKは、再利用可能なクラウドコンポーネント「Constructs」を定義し、コードをCloudFormationテンプレートに変換してAWSにデプロイします。
フローは次のようになります:
TypeScript、Python などで CDK コードを作成 →CDK が CloudFormation テンプレートを生成→CDK が AWS リソースをデプロイおよび管理
プログラミング言語の柔軟性を活かし、インフラの信頼性や堅牢性を高めるため、開発者にとって、使いやすさと信頼感のある、有力なIaCツールといえると思います。
Azure Resource Manager
Microsoft Azureの「Azure Resource Manager」(ARM)は、インフラ展開と管理を自動化するIaCツールで、リソースのデプロイ、管理、監視が可能です。ARMはJSON形式のARMテンプレートでリソースや依存関係を管理し、使いやすさから広く利用されています。RBAC(ロールベースのアクセス制御)をデフォルトでサポートし、管理グループ、サブスクリプション、およびリソース グループといったアクセス権限のきめ細かい制御が可能です。また、リソースにタグを付けて整理やコスト管理ができます。ARMにより、インフラを一貫した状態で迅速に複数回デプロイすることが可能です。
Google Cloud Deployment Manager
Googleの「Google Cloud Deployment Manager」は、Google Cloud上でリソースの作成、デプロイ、管理を自動化するサービスです。PythonまたはYAMLでリソースを定義し、変更のプレビューや進行状況の確認が可能です。多くのリソースを同時にデプロイでき、コード化された構成がインフラの一貫性を保つ信頼できる情報源として活用されます。
Puppet
Puppetは、インフラストラクチャの望ましい状態を定義・維持するための構成管理ツールで、Rubyベースの独自のドメイン固有言語(DSL)「Puppetコード」を使用します。Puppetのシステムは「Puppet Primary Server」と「Puppet Agent」で構成されており、プライマリサーバーが望ましい状態のコードを保持し、エージェントがそのコードを各システム上で実行して構成を整える「Puppet run」を行います。ユーザーインターフェースはシンプルで、インフラ全体の監視や管理がリアルタイムで可能です。また、AWS、Azure、GCP、VMwareなどほぼすべての主要クラウドプラットフォームにも対応しており、多様なインフラ環境での自動化を実現します。
Ansible
Ansibleは、インフラ構成とプロビジョニングの自動化に特化したオーケストレーションおよび構成管理ツールです。命令型のアプローチを採用し、YAML形式で記述される「Ansible Playbook」を用いて、管理ノードで繰り返し実行するタスクをリストとして保持します。Ansibleはエージェントレスで、SSHやWinRMを介して一時的に接続し、タスクを実行します。インフラとアプリケーションの構成管理を簡単に行えるツールとされ、独自モジュールやプラグインで機能を拡張可能です。また、オンプレミス環境とクラウド環境の両方に対応しています。
Pulumi
Pulumiは、開発者に優しい設計と高い柔軟性を備えた最新のIaCツールで、クラウドインフラの作成、展開、管理に利用されます。コンテナやKubernetesクラスタ、サーバーレス機能もサポートし、Go、C#、Java、Python、TypeScript、JavaScriptなどの一般的なプログラミング言語でコードを記述可能です。Pulumi CLI、ランタイム、ライブラリ、ホスト型サービスが連携して、クラウドインフラのプロビジョニングや更新、管理を効率的に行い、DevOpsのベストプラクティスも取り入れやすくしています。
IaC ツールの比較
ご紹介してきた8つのツールを、比較表で見ていきます。より詳細な比較表は、画像のほうをご覧ください。
ツール名 |
対象インフラストラクチャ |
ライフサイクル/状態管理 |
モジュールサポート |
メリット |
---|---|---|---|---|
Terraform |
主要なクラウドおよびオンプレミスインフラストラクチャ |
ライフサイクルを意識し、デプロイメントの状態を S3、DynamoDB、ローカルなどに保存可能 |
インフラストラクチャはモジュールを利用して再構築可能 |
・複数のクラウドプロバイダーにわたって動作可能 ・複数のクラウドサービスと外部機能を統合可能 ・提案された変更をテストするための「Plan」フェーズ機能 |
AWS CloudFormation |
AWSインフラストラクチャ |
AWS 内の状態をスタックの形式で自動的に維持 |
スタック間の参照およびスタックのネストを許可 |
・他の AWS サービスと密接に統合可能 ・導入失敗の自動ロールバック ・AWS コンソールによる管理機能 |
AWS CDK |
AWS インフラストラクチャ(汎用プログラミング言語を使用) |
AWS CloudFormation を通じて内部で自動的に状態を維持 |
複数のスタック、ネストされたスタックをすべて 1 つのプロジェクトで作成し、内部で参照可能 |
・あらゆるプログラミング言語を使用可能な柔軟性 ・コードと環境の間のドリフトを検出可能 |
Azure Resource Manager |
Azure インフラストラクチャ |
Azure の状態をテンプレートとして自動的に維持 |
異なるパラメータを持つテンプレートを使用して複数の環境をデプロイ可能 |
・他の Azure サービスと緊密に統合可能 ・Azureコンソールから管理可能 |
Google Cloud Deployment Manager |
Google Cloud インフラストラクチャ |
Google Cloud の状態を自動的に維持 |
テンプレートはさまざまな導入環境で再利用可能 |
・他の Google Cloud サービスと緊密に統合可能 ・Python を使用してテンプレート内でカスタム ロジックを実行可能 ・Kubernetes の状態管理にも役立つ |
Puppet |
主要なクラウドおよびオンプレミスのインフラストラクチャ |
望ましい状態を、Puppet プライマリ サーバーによって管理および維持 |
モジュールはコードの再利用と共有可能 |
・Web UI コンソールで管理が簡単・ 非常に堅牢で、ネイティブのシェル構築機能 ・活発なパペットコミュニティを備えた安定した成熟したシステム |
Ansible |
既存のシステムを構成し、ネットワーク デバイスの自動化をサポート |
インフラストラクチャの状態を追跡しない |
Playbookが再利用可能 |
・エージェントレス操作 ・マルチベンダー環境に対応 ・オープンソースとベンダーコミュニティのサポート |
Pulumi |
汎用プログラミング言語を使用した、主要なクラウドおよびオンプレミスのインフラストラクチャ |
状態はローカル、S3、または Pulumi サービス バックエンドに保存可能 |
インフラは再現可能 |
・クラス最高の Kubernetes サポート ・組み込みのシークレット管理 ・あらゆるプログラミング言語を柔軟に使用可能 |
クリックで拡大表示
おわりに
Infrastructure as Code (IaC) は、クラウドやオンプレミス環境のインフラ管理を自動化・効率化するための必須のアプローチで、あらゆるソフトウェア開発ライフサイクルにおいて重要な役割を果たしています。IaCにより、インフラのコード化による一貫性の確保、エラーの削減、バージョン管理が可能になり、迅速で信頼性の高い環境構築が実現します。
プロジェクトで最適なIaCツールを選択することは、要件や制約、コスト、チームスキルセットなどを踏まえた上での重要な決定事項です。IaCツールを適切に選ぶことで、インフラの構築や管理が容易になり、チームの協力体制も強化されます。
これまでに紹介してきたIaC関連の記事もぜひ参考にしながら、IaCを取り入れる検討を進める一助となればと思います。
こちらは、クラウドトータルサービス「Kyrios」の関連サービスです。IaCを、構築と運用の二軸でサポートします。詳細は下記をご覧ください。
本記事は、JTP Technology Portの英文記事を翻訳・再編集したものです。原文は下記をご覧ください。