Introduction
技術業界では新しい流行語が突然生まれ、ニュースや雑談、FAQに次々と登場するのをご存知かもしれません。DevOps という言葉を耳にしたなら、一過性の話だと思われがちですが、この手法は小規模な開発チームから大規模プロジェクトにまで広がり、2008 年に Patrick Debois 氏によって提唱されて以来、ますます受け入れられています。では、DevOps とは何か、そして開発の未来にどのような影響を与えるのでしょうか。
まず、DevOps の本質とその仕組みを理解することが重要です。そもそも、DevOps は開発と運用の融合であるには理由があります。
多くの熟練技術者が明確な定義を示そうと努力してきましたが、実現は容易ではありません。様々な要素が絡み合いながら、基盤は Agile や Lean 手法、そして Agile マニフェストにあります。
Agile の考え方は、迅速にアプリやサービスを届けながら、継続的に向上することを目指します。基本的に、Agile 手法は開発と QA が協力し、常に改良、反復、計画、テストを行うライフサイクルを持ちます。
Lean 開発は製造業で始まり、その後プログラミングの世界に広がりました。Lean の原則は、不要な機能やタスク切替などの無駄を排除し、迅速な提供、チームの自律促進、学びの文化を育むことに重きを置いています。DevOps と Agile は、品質と提供速度の向上という Lean の考え方を支えています。
しかし、DevOps は Agile や Lean 開発とはいくつかの点で異なります。多くの企業では、開発と運用のチームが分断され、独立して働き、あまり交流がありません。このような断絶は、同じプロジェクトに関わるチーム間で問題や対立を生み、生産性を低下させる恐れがあります。DevOps はこれらのチーム(QA や場合によってはセキュリティも)を一つにまとめ、チームや顧客のニーズを中心に据えた協働の文化を促します。
熟練の手法は主にソフトウェア開発の改善に注力しますが、DevOps は運用チームが抱える問題を、開発との統合によって解消します。
最終的に、この考え方は文化の変革、優れた事例、そして迅速なアプリやサービスの開発に特化した各種ツールを組み合わせたものです。それでは、仕組みを見ていきましょう。
企業が競争の激しい市場で前進し、決められた期間内に優れた機能を顧客に届けるにはどうすればよいでしょうか。DevOps の実践により、企業が享受できる利点は以下のとおりです。
更新や機能を迅速かつ継続的に届けることで、顧客の満足度が上がるだけでなく、企業が競争市場で確かな地位を築く手助けとなります。
新機能や修正、更新のリリースに伴うプレッシャーが職場の安定性を損ない、生産性を低下させることがあります。DevOps の実践で、均一なワークフローにより職場環境を整えられます。
開発と運用のチームが連携し、顧客のフィードバックを継続的に収集することで、製品の品質が大幅に向上します。
DevOps は従来手法に比べ、問題を迅速かつ効率的に特定・解決できるため、自動化されたプロセスで不具合が検出され、チームが革新的なアイデアに注力する時間を確保できます。
企業を柔軟にすることで、競争相手に先んじることができます。DevOps によって、企業変革に必要な俊敏性を手に入れやすくなります。
DevOps では全チームが安定の維持と新機能の提供に責任を持つため、従来の手法よりも速く、途切れることなくソフトウェアが届けられます。
ソフトウェア開発における技術的な問題に対して、速やかで確実な対応が可能な点は、DevOps の大きな利点です。
サイロを排除し協力体制を強化することで、チーム内のコミュニケーションが円滑になり、各自の専門分野に専念できます。その結果、DevOps の導入で従業員の生産性や効率が向上しています。
適切な連携により、保守や新機能の更新が一元管理され、ソフトウェア開発のコスト削減につながります。
大局的に見ると、各関係者は異なるビジネス目標を持っています。また、それぞれの目標により、DevOps の利点を捉える視点も変わります。CIO の視点は、CEO や IT マネージャーなど他の関係者と異なり、この違いは著名な IT ディレクター、David Linwood 氏によって『フォーカスポイント』と称され議論されました。
IT責任者にとって、プロセスや技術指標の改善は重要です。そのため、DevOps の利点は IT 部門の視点から以下のように整理されます。
さらに、企業の CTO/CIO は、人を基準とした指標を含む主要な優先事項に注力しています。CIO の視点から、DevOps は以下の利点を提供します。
CEO にとって、DevOps の利点は開発コストの削減や収益の拡大など、ビジネス成果に直結します。CEO の視点から、DevOps の利点は以下のとおりです。
DevOpsライフサイクルの主要フェーズは、計画とコーディングが行われる段階です。計画では、プロジェクトのビジョンを理解し、その洞察に基づいてアプリの設計を行います。
計画段階では特別なツールは必要ありませんが、コードの管理には様々なツールが用いられます。アプリのソースコード開発は、各種プログラミング言語の検討から始まります。DevOps では、JavaScript、C/C++、Ruby、Python などがよく用いられます。
コード管理はソースコード管理(SCM)と呼ばれ、GIT、TFS、GitLab、Subversion、Mercurial などのバージョン管理ツールが使用されます。
SCMサイクルでは、GIT が広く利用され、適正なバージョン管理を可能にします。分散型の非線形ワークフローを通じてデータ検証が行われ、大規模プロジェクトでは、多数の関係者が参加する中で、コミットメッセージを介しチーム間の連携が強化されます。
バージョン管理ツールのおかげで、アプリコードの安定したバージョンが継続的開発の基盤となります。開発者は Garden、Maven などのツールを用いて、コードを .exe(実行可能)ファイルにまとめることもできます。
通常、定常的な計画段階は連続監視の前に実施されます。しかし DevOps ライフサイクルでは、アプリ公開後や高トラフィック発生時でもこのフェーズは活発に維持されます。
この段階では、完成したアプリコードが本番サーバに配信されます。構成管理は重要な工程で、全サーバにおけるコードの適切な展開を保証します。アプリのパフォーマンスや運用状態の一貫性が保たれ、コードはサーバに届けられ、更新が全サーバで計画され、一貫して管理されます。Ansible、Puppet、Chef などが、迅速かつ継続的な新コードの展開に使われる DevOps ツールです。
DevOpsライフサイクルの最終フェーズは、最も短くシンプルな段階です。継続運用の目的は、アプリとその更新の自動提供を実現することです。運用における開発サイクルは短く、開発者は市場投入までの時間を常に短縮できます。
最初の違いは、DevOpsが開発、運用、アプリ提供の統合であるのに対し、DevSecOpsはこれらすべてにセキュリティを加える点にあります。
DevOpsは、開発者と運用チームが共通の目標を達成するための技術や手法に注力します。一方、DevSecOpsは、既存の DevOps パイプラインにセキュリティ対策を組み込む実践に焦点を当てています。
DevOps チームでは、開発者がマイクロサービスアーキテクチャを用いて、個別の機能を持つ独立したサービスとしてソフトウェアを構築することが一般的です。これらのマイクロサービスは、コンテナや仮想マシン(VM)上で自律的に動作でき、大規模で複雑なシステムと比べ、個々のマイクロサービスやコンテナで問題を特定・解決しやすくなります。
Infrastructure as Code (IaC)
Infrastructure as Code は、ホスト、仮想マシン、コンテナなどの計算資源をコードで管理・自動化する手法です。開発者は IaC を用いて IT 運用を自動化し、インフラ作業における人的支援を不要にします。運用担当者も、必要に応じた環境の立ち上げや、開発者向けのセルフサービス機能の提供に IaC を活用できます。
Policy as Code (PaC)
Policy as Code は、特定技術の採用、セキュリティ基準、IT 手法などの組織方針をコードで管理する方法です。方針がコード形式で提供されるため、開発の各段階で自動的に組織全体に適用できます。
Shifting security left
「Shifting left」とは、プロジェクトを開発サイクルの早い段階に移行することです。セキュリティを早期に取り入れることで、コードベースが初めて作成された時点からセキュリティ基準を満たすようにします。開発タスクは機能要件が達成されるだけでなく、セキュリティ上の欠陥がないことも検証されると完了とみなされます。
Continuous feedback loop
継続的フィードバックループは、全てのチームメンバーが開発や保守の改善に努めるよう促します。自動化プロセスにより、セキュリティの脆弱性を常に監視し、問題が開発パイプラインに加わった際、即時に開発者やセキュリティ専門家へ通知して、全チームで共同して速やかに対応できます。
Security automation
自動化は、開発ライフサイクル全体でDevSecOps の基準と実践を満たすための重要な要素です。自動化により、DevSecOps チームはコード解析、コンプライアンス監視、脅威調査など、より多くのセキュリティ業務を迅速に担うことが可能となります。
DevOps のツールスタックには、信頼性の高いビルドツールが必要です。長らく Apache Ant や Maven が自動ビルドツール市場を支配していましたが、2009 年に Gradle が登場して以来、その人気は増しています。Gradle は非常に柔軟で、Java、C++、Python など様々な言語でコードを書くことができ、Netbeans、Eclipse、IntelliJ IDEA などの主要 IDE もサポートしています。さらに、Google が Android Studio の公式ビルドツールとして採用している点も注目すべきです。
Git は、技術業界全体で広く利用されている最も一般的な DevOps ツールの一つです。分散型のソースコード管理(SCM)ツールであり、リモートチームやオープンソースの支持者に好まれています。Git を用いれば、開発作業の進捗を追跡でき、コードの各バージョンを保存し、必要に応じて過去の状態に戻すことが可能です。また、別ブランチの作成や、新機能の統合も容易です。
Jenkins は、多くのソフトウェア開発チームで利用される主要な DevOps 自動化ツールです。オープンソースの CI/CD サーバ として、デリバリーパイプラインの各段階を自動化できます。その人気の理由は、1,000 以上のプラグインを誇る巨大なエコシステムにあります。これにより、Docker から Puppet まで、ほぼすべての DevOps ツールと連携が可能です。
Bamboo は Atlassian が提供する CI/CD サーバで、Jenkins と似た機能を持つ人気の DevOps ツールです。タスクからデプロイまで、デリバリーパイプラインを自動化できますが、Jenkins がオープンソースであるのに対し、Bamboo は有償です。無料の代替手段がある中で有償の選択をするかどうかは、予算や目的次第です。
Docker は 2013 年のリリース以来、主要なコンテナプラットフォームとして進化し続け、最も人気のある DevOps ツールとされています。Docker はコンテナ技術を普及させ、分散開発を可能にし、アプリのデプロイを自動化します。アプリを独立したコンテナに分離することで、移植性と安全性が向上し、OS やプラットフォームに依存しない運用が可能となります。VirtualBox のような仮想マシンの代わりに、Docker コンテナを利用することができます。
DevOps 手法は、ソフトウェア開発ライフサイクル(SDLC)全体で開発と運用チームが協力するための一連の実践です。Agile 手法を融合し、チーム間のサイロを排除し、手作業の自動化と継続的フィードバックによる効率向上を目指します。
DevOps チームを活用する際、企業は複数の実践やツールを併用することが多いです。例えば、
Continuous Integration and Continuous Delivery (CI/CD)
自動化を活用し、ソフトウェア開発ライフサイクルにおける効率、品質、速度を向上させる一連のプロセスです。CI は、コードベースに対して継続的かつ小さな変更を加え、早期にテストと統合を行います。Continuous Delivery は、手作業のデプロイや修正を必要とせず、新コードを本番環境へ頻繁に届けます。
Cloud-based pipelines
パイプラインは、CI/CD などのプロセスを実行するためのツールチェーンです。通常、クラウド上のサービスやリソースで構成され、クラウドネイティブな流れや分散チームへのサポートが強化されています。
Microservices
クラウドネイティブなアプリで採用されるアーキテクチャで、柔軟性、可用性、拡張性を向上させます。マイクロサービスにより、各コンポーネントが疎結合となり、変更や更新が容易なアプリやパイプラインの構築が可能です。
Foundation as code (IaaC)
スクリプトやテンプレートを用いて、インフラの計画、構築、管理を行うプロセスです。この手法により、多数のインフラタスクが自動化され、追加のチームリソースを大幅に増やさずに大規模な展開が可能となります。
DevOpsライフサイクルの最終段階は、全体の評価に重点を置きます。監視の目的は、サイクル内の脆弱な部分を特定し、チームや顧客からのフィードバックを分析して現行の不具合を報告し、製品の性能向上につなげることです。
自動テストを通過したコードは、サーバ上の共有リポジトリに保管されます。以降のコードコミットにより、各ブランチとメインラインとの齟齬が大きくなる『統合地獄』を防ぎます。
継続的デリバリーは、開発、テスト、構成作業を自動化によって一元化し、効率的なプロセスを実現する手法です。この段階は、本番環境へのコード更新を計画的に行います。
従来のプロジェクト管理手法と異なり、Agile 計画では短いスプリントで作業を進め、多数のリリースを実現します。チームは大枠の目標のみ設定し、詳細な計画は 2 スプリント先まで見通すため、初回リリース後に柔軟に対応できます。詳しくは当社の Agile インフォグラフィックスを参照ください。
従来の不完全なプロジェクト管理手法に別れを告げ、新たなサイクルにより、コードを通じたインフラの適切な管理と展開が保証されます。更新を効率よく管理するための DevOps ツールも存在します。
Infrastructure as code(IaC)は、継続的デリバリーと DevOps を実現するためのインフラ管理手法です。ネットワーク、仮想マシンなどの環境を、現状にかかわらず望ましい状態に自動的に構成します。
IaC がなければ、開発、テスト、本番それぞれの環境を個別に管理する必要があり、非常に煩雑な作業となります。
環境がコードとして定義されることで、
スケールが必要になった場合、コードにより必要な数の環境が同時に構築可能です。
DevOps の導入により、手作業でのサーバ構成管理の負担が解消され、運用と構成の両方がコードで一元管理されます。
最新情報を購読