DevOpsは、アプリケーションを開発して公開し、サポートからのフィードバックを反映していく方法として主流になりつつあります。しかし、DevOpsを成功に導くには、組織面での複雑さやマシンデータの収集といった課題を克服する必要があります。
公開日:2021年7月1日
Infrastructure as Code(IaC)とは、コードやスクリプトを使用してインフラのプロビジョニングと設定を自動的に行う方法です。IaCを使用すると、必要なシステムやデバイスを手動で設定するのではなく、自動でインフラコンポーネントを生成して、環境を構築できます。
これまで、アプリケーションの実行に必要なハードウェアやソフトウェアのプロビジョニングと設定は、システム管理者が時間をかけて手作業で行ってきました。しかし、現代のソフトウェアデリバリーやソフトウェア開発ではチームは1日に何百ものアプリケーションをデプロイする必要があり、このようなやり方で支えていくことは不可能です。IaCを使用すれば、ネットワーク、データベース、仮想マシン、その他のインフラコンポーネントを自動でスピンアップして、アプリケーションのテストや実行に必要なクラウド環境を構築することができます。
IaCは、DevOpsプラクティスにとって不可欠です。自動化やアジャイルのプロセスにはコードの実行やテストのためのITインフラが必要ですが、ソフトウェアを開発、テスト、デプロイするたびに開発者が環境を設定しなければならないとなると、DevOpsプラクティスの利点である「スピード」が損なわれることになります。IaCを使用すればインフラを数分でセットアップできると同時に、すべての設定ファイルについてバージョン管理を行えるため、IT環境全体の一貫性を確保できます。
以下のセクションでは、組織にとってIaCが重要である理由と、IaCがもたらす多くのメリット、そしてIaCの導入方法について説明します。
IaCが重要である理由として、まずインフラのプロビジョニングを簡単かつ迅速に行えること、そして拡張性に優れていることが挙げられます。これを理解するために、インフラ管理の仕組みを見ていきましょう。
これまで開発者やテスト担当者などのインフラ利用者は、インフラリソースのプロビジョニングが必要になると、チケットを作成するか、メールでリクエストを送信していました。そして、IT運用チームがキュー内のチケットを確認して記録し、要求されたリソースをそれぞれ手作業で割り当てるというやり方です。確かに時間はかかるものの、ほとんどの組織では管理対象のインフラが少なかったため、このプロセスで十分でした。企業のデータセンターで何年もの間1台の仮想マシンのみが使われていたり、環境内のインフラ設定やその他の処理を手作業で行うといったことが珍しくなかったのです。
今日のインフラは、自動化ツールやAPI主導のクラウドインフラのおかげで、数カ月や数年ではなく、数日または数週間でリソースをプロビジョニングでき、以前に比べはるかに動的です。ピーク時や季節に合わせてインフラをスケールアップし、需要が通常のレベルに戻ったらそれをスケールダウンするといったこともできます。このような弾力性は、インフラを手作業で管理していたのではまず実現不可能です。必要に合わせてワークロードの容量を増減させるのに、毎日何千ものチケットを送信して、管理者がリクエストを処理するまで待たなければならないでしょう。
IaCでは、手作業による操作を自動でインフラをプロビジョニングして設定できるインターフェイスに置き換えることで、この問題を解決します。たとえば、ワークロードのピーク時にスクリプトを実行して1,000台のマシンをスピンアップし、需要が減少したらスクリプトを再実行してマシンをスピンダウンする、といったことができます。また、DevOpsチームはこのアプローチを活用して、サーバーの作成、オペレーティングシステムの導入、データストレージの設定、その他の必要なインフラコンポーネントの設定を、オンデマンドで行うこともできます。
より迅速にアプリケーションを構築して導入し、すばやく顧客に価値を提供することがますます求められる今日、IaCはほとんどの企業にとって重要なものになっています。
IaCには次のようなさまざまなメリットがあります。
Mutable(可変)とImmutable(イミュータブル/不変)は、2つの異なるタイプのインフラ環境です。「可変」とは、たとえば新しいサーバーに対応するために、プロビジョニング後にインフラを変更できることを意味します。一方、「イミュータブル/不変」はインフラを変更できません。
可変インフラの主な利点は、既存のサーバーを特定のアプリケーションや開発ニーズに合わせてカスタマイズできることです。そのため、新しいサーバーを構築することなく、各ユーザーのニーズに合ったインフラを実現することができます。
しかし、この「変更できる」という特性には、いくつかの重大な欠点があります。各サーバーがそれぞれ独自の設定を持つため、サーバーの診断や管理が困難になってしまうのです。これを「構成ドリフト」と呼びます。また、一般にサーバーへの変更は文書化されないため、バージョンの追跡ができず、技術的な問題の発見や再現が容易ではありません。
イミュータブルな環境はより厳格であり、インフラのコンポーネントは必ず特定の仕様に従わなければなりません。一旦インフラが構築されたら、必要に応じて変更するといったことはできず、サーバーを変更する必要がある場合は最新の要件に基づいて新しいインフラを構築し、古いインフラを削除する必要があります。これにより構成ドリフトの問題が実質的に解消され、技術的な問題の特定と解決が容易になり、開発から本番までのテストの一貫性も確保されます。
DevOpsチームにとって、イミュータブルなIaCはますます重要なものとなっています。イミュータブルインフラとIaCの概念を組み合わせることで、環境の整合性が保たれ、DevOpsプロセスがさらに加速するとともに、デリバリーパイプラインの遅延が低減し、チームはインフラの管理に時間を費やすことなくイノベーションに集中することができるようになります。
IaCは、HashiCorpのTerraform、Red HatのAnsibleやHelm、およびChef、Puppet、SaltStackなどのオープンソースツールによって、広くサポートされています。オープンソースのIaCツールは、ユーザーが複数のクラウドベンダー間でインフラのプロビジョニングや管理を行えるようにコーディング言語を使用しており、他のオープンソースソリューションとも互換性があります。一方、大手クラウドベンダーは、たとえばAWS Cloud用のAWS CloudFormation、Microsoft Azure用のAzure Resource Managerなどのように、クラウドコンピューティングエコシステムの一部として独自のIaCコードツールを組み込んでいます。これらのツールは、それぞれのクラウドプラットフォームに特化して設計されているという利点がありますが、クローズドアプローチであるため、ユーザーはベンダーロックインに陥る可能性があります。
IaCツールの仕組みはツールごとにそれぞれ異なりますが、どのツールもインフラの自動化には、宣言型または命令型のうちのいずれかのアプローチを採用しています。IaCツールを選ぶ際は、この2つのプログラミング言語の表現方法の違いを理解していることが重要になります。
宣言型のアプローチでは、ユーザーはリソースと必要なプロパティのリストを指定し、プロビジョニングされるインフラがどのようなものになるかを「宣言」します。その後、IaCツールによって、すべてのインフラコンポーネントがインストールされ、設定されて、コードのバージョン管理が行われます。一方、命令型のアプローチでは、ユーザーはIaCに実行させたいコマンドのリストを指定し、それによりインフラが段階的にプロビジョニングされます。簡単に言えば、宣言型プログラミングでは、ユーザーはどのようなインフラリソースを使用したいかを伝え、命令型プログラミングでは、インフラリソースをどのように作成したいかを伝えます。
どちらのアプローチを使用しても目的のインフラを作成できますが、考慮すべき違いがいくつかあります。その違いを明確にするため、「空港までタクシーで行く」という例を使って、それぞれのアプローチがどのように指示を処理するかを説明してみます。宣言型の指示では、運転手に「午前11時までに空港に連れて行ってください」と伝えます。ここでは、求める結果を述べており、時間どおりに到着するために最適なルートや速度、その他の要素はタクシーの運転手が決めます。
これに対して命令型の指示では、運転手に「午前11時までに空港に到着する方法」について明確な指示を与えます。たとえば、「午前10時15分に迎えに来て、角を左に曲がって高速道路に乗って、時速約100キロで...」といった具合です。どちらのアプローチでも必要な目的地に到着できますが、2番目のアプローチでは、道路の迂回や高速道路での交通事故など、運転手が予期せぬ障害に遭遇した場合に対応の余地があまりありません。宣言型と命令型の指示は、IaCでも同じように機能します。
宣言型のアプローチでは、目的のインフラをプロビジョニングする際のあらゆる複雑さをツールが処理します。しかし、なぜそのように行われたのかについては、ツールの管理者に相談しないとわからないでしょう。命令型のアプローチでは、インフラのプロビジョニング方法をより細かく制御できますが、開発者がより多くの作業を行う必要があります。また、指示が明確である分、いずれかのステップで障害が発生した場合は、中断して解決策を考えなければならず、大規模な管理は難しいといえるでしょう。「ベストな」選択は、記述するコードの量や、将来的にインフラを更新する可能性、クラウドサービスへ変更を加える方法をどの程度制御する必要があるかなど、複数の要因によって変わってきます。
Terraformは、人気の高いオープンソースのクラウド非依存型IaCツールです。宣言型プログラミング言語であるHCL(HashiCorp Configuration Language)と呼ばれる高レベルの構成言語を使用して、アプリケーションを実行するためのインフラを定義し、プロビジョニングを行います。
Terraformは基本的に、インフラの「最終状態」を記述したコードを読み取り、リストされたリソースとそれらの相互関係を示すグラフを作成することで機能します。そして、そのグラフとクラウド内のリソースを比較し、クラウドに行う変更とその状態に達するための順序についてまとめた計画を生成して、その計画を実行し、インフラをプロビジョニングします。
Terraformは次のような理由から開発者に人気があります。
Terraformのコアワークフローには3つのステップがあります。1人で作業する場合も、チームで協力して作業する場合も、ワークフローは同じですが、複数での作業では各ステップに追加のプラクティスが生じます。
ステップ1:記述。最初のステップは、Infrastructure as Codeの記述です。チームで共同作業する場合も、あたかも自分1人で作業しているかのように、好みのエディターでTerraformの設定を変更できます。ただし、お互いの作業を上書きしないように、各自が変更内容をバージョン管理ブランチに保存する必要があります。チームメンバーは計画を繰り返し実行して、構文エラーの特定や構成のテストを行い、フィードバックループを作成します。
ステップ2:計画。「記述」ステップのフィードバックループで実行可能な変更が生じたら、チームメンバーが互いの作業をレビューし、コードを個人の作業ブランチから共有チームブランチにマージする際に問題を引き起こす可能性のある変更が持ち込まれないようにします。また、変更をすぐにマージするか、変更によってサービスが中断する可能性がある場合はメンテナンスの時間枠が決まるまでプルリクエストのマージを遅らせるか、決めることができます。
ステップ3:適用。プルリクエストが承認されマージされた後、共有チームブランチに対して実行される最終的な計画を再確認します。チームはこの時点で、サービス中断のリスクや誰に通知する必要があるかなど、変更の適用に伴う潜在的な影響を評価します。変更の適用と同時進行で状況を注意深く監視していくことにすることもできます。
チームでの作業の場合、このコアワークフローは各変更に対して繰り返して行われ、1日または1週間に数回発生する可能性があるものです。
Terraformでのインフラのプロビジョニングには、ベストプラクティスが多数あります。そのいくつかをここでご紹介します。
今後IaCは、おそらくコンピューティングリソースのプロビジョニング、管理、オーケストレーションの標準となっていくでしょう。ハードウェアを調達してインストールし、設定を行って、構成管理ツールで新しい環境に統合するという従来のアプローチは、柔軟性や応答性に優れたインフラを必要とする企業にとって、もはや実用的とは言えません。物理的なハードウェア管理の問題はクラウドネイティブな開発や仮想化によって解消されました。次は、IaCが、開発者が必要に応じてインフラのプロビジョニングを自動化するための支援をしていく番です。IaCは市場投入までの時間を短縮し、コストを削減して、ROIを向上させることができ、すでにDevOpsに欠かせない要素として位置付けられています。
IaCを使用することで、組織のインフラのプロビジョニングプロセスとライフサイクルが高速化し、開発環境全体の一貫性が保たれます。これにより、ITチームはより価値の高い活動に注力できるようになります。IaCは、スピードと拡張性に優れたデリバリーを必要とする組織に対し、現在そして将来にわたり、そのための基盤を提供します。
DevOps 5つのプラクティス
DevOpsチームの明暗を分ける5つのプラクティスについてご紹介します。
DevOpsは、アプリケーションを開発して公開し、サポートからのフィードバックを反映していく方法として主流になりつつあります。しかし、DevOpsを成功に導くには、組織面での複雑さやマシンデータの収集といった課題を克服する必要があります。
DevOps Dozen2 Awardsで最優秀電子書籍賞を受賞しました。オブザーバビリティとは何か、単なる監視とは何が違うのかについてご紹介します。
Splunkプラットフォームは、データを行動へとつなげる際に立ちはだかる障壁を取り除いて、オブザーバビリティチーム、IT運用チーム、セキュリティチームの能力を引き出し、組織のセキュリティ、レジリエンス(回復力)、イノベーションを強化します。
Splunkは、2003年に設立され、世界の21の地域で事業を展開し、7,500人以上の従業員が働くグローバル企業です。取得した特許数は850を超え、あらゆる環境間でデータを共有できるオープンで拡張性の高いプラットフォームを提供しています。Splunkプラットフォームを使用すれば、組織内のすべてのサービス間通信やビジネスプロセスをエンドツーエンドで可視化し、コンテキスト(把握したい要素) に基づいて状況を把握できます。Splunkなら、強力なデータ基盤の構築が可能です。
日本支社を2012年2月に開設し、東京の丸の内・大手町、大阪および名古屋にオフィスを構えており、すでに多くの日本企業にもご利用いただいています。
© 2005 - 2024 Splunk LLC 無断複写・転載を禁じます。
© 2005 - 2024 Splunk LLC 無断複写・転載を禁じます。