DevOps(「development」と「operations」の混成語)とは、従来のソフトウェア開発プロセスに比べて、より迅速なアプリケーションやサービスのデリバリーを実現するための組織能力の向上を目指したプラクティスとツールの組み合わせです。このようなスピードを実現することで、顧客サービスと市場での競争力の向上が可能になります。
DevOpsとは端的には、従来のサイロ化された開発チームと運用チームの壁を取り除くことです。DevOpsモデルでは、開発・テストからデプロイや運用まで、ソフトウェア・アプリケーションのライフサイクル全体を通じて開発チームと運用チームが協働します。
DevOpsのセキュリティ(DevSecOpsと呼ばれる方が一般的)とは、戦略、ポリシー、プロセス、テクノロジーによりDevOps環境全体を保護する統制および実践のことを指します。DevSecOpsの原理は、方向付け、設計、構築、テスト、リリース、サポート、保守その他を含むDevOpsライフサイクル全体にセキュリティを組み込むというものです。
従来セキュリティは、システムの設計が完了した後の工程とされていたことが多く、セキュリティの欠陥の特定と修正が可能になるのはその後からリリースの前まででした。DevOpsモデルの変化により、開発サイクルの後工程で実施される従来のセキュリティ・プラクティスは反復型のソフトウェア開発の設計およびリリースには遅すぎて適さなくなっています。このように、従来のセキュリティ手法はアプリケーションおよびサービスのスピーディーなデリバリーの阻害要因になる可能性があります。
DevSecOpsでは、セキュリティはDevOpsチーム全員の注視の対象になります。DevSecOpsには、安全を損なわずにセキュリティに関する意思決定をスピーディーかつ大規模に実装するという目標があります。DevSecOpsではリリース・エンジニアとセキュリティ・チームとの継続的で柔軟な協調が必要です。「迅速なデリバリー」と「セキュアなコードの構築」という概念を1つの効率化されたプロセスに統合します。セキュリティ・テストはデリバリー・サイクルを停滞させることなく反復的に行われます。重大なセキュリティの問題は、発覚した時点で、脅威や侵害が発生する前に対処します。
適切なDevOpsツールを見つける方法
DevOpsプラクティスでは、顧客のための迅速で信頼性の高いデプロイとイノベーションを支援する効果的なツールを利用します。こうしたツールで手動タスクを自動化することにより、複雑な環境の大規模な管理を支援し、エンジニアがスピーディーなDevOpsのペースの制御を維持できるようにする必要があります。
DevOpsのワークフローは以下フェーズで構成されます。
計画。DevOpsチームが手持ちの作業の内容、現在進行中の作業、納期遅れのリスクの有無を確認するためのスケジュール計画および作業追跡ツールが必要です。Confluenceや Jiraなどのツールは、シームレスで効率的なプロジェクト管理サイクルの実現と迅速な製品デリバリーの確保に役立ちます。
構築とデリバリー。開発チームは開発およびテスト環境を迅速にデプロイする必要があり、不具合の修正を長時間待っている余裕はありません。コンテナ型ツールのDockerを利用することにより、複数の開発およびリリース・サイクル間の一貫性を確保し、反復可能な開発、構築、テスト、本番環境を実現することができます。このフェーズ向けのその他の一般的なツールには、Kubernetes、Terraform、Chef、Ansible、Puppetなどがあります。
テスト。コード品質やユーザー操作性を低下させることなく、テストにかかる時間と手間を削減できるJenkins、CircleCI、GitLab CIなどのツールを検討してもよいでしょう。
ソフトウェアの監視とロギング。ソフトウェアを本番環境に移行した後は、安定したパフォーマンスと顧客満足の向上を確保するために監視する必要があります。この工程では、パフォーマンス解析とロギング、さまざまな問題に関するスマートアラートの表示、顧客フィードバックの収集なども必要になります。これらのタスクを行うためのツールとしては、Prometheus、Grafana、Elastic (ELK) Stack、Splunk、Sumo Logicなどがあります。
DevOpsはアジャイル・ソフトウェア開発から直接派生したものであり、アジャイル手法のソフトウェア開発のスピードとスループットの向上に遅れをとらないようにする必要性から誕生しました。アジャイル開発の進歩により、ソフトウェア・デリバリー・ライフサイクルへのより総合的なアプローチの必要性に着目が集まり、その結果としてDevOpsが登場しました。
「アジャイル開発」はさまざまな反復型のソフトウェア開発手法の総称であり、その多くがDevOpsに受け継がれています。
ソフトウェア開発の管理プロセスの自動化と効率化を通じて組織のイノベーションの迅速化を支援する主要なプラクティスがいくつかあります。基本的なDevOpsプラクティスの1つとして、小規模な更新を頻繁に行うことが挙げられます。通常、この更新は従来のリリース・プラクティスで行われる更新と比べてより段階的な傾向が強くなります。DevOpsモデルでは、従来のソフトウェア開発プラクティスよりはるかに高い頻度で更新をデプロイします。
DevOpsプラクティスの根幹をなすものはコミュニケーションと協調です。ソフトウェア・デリバリー・プロセスの自動化により、開発チームと運用チームのワークフローと責任を物理的に統合することにより協調体制を確立します。開発チームと運用チーム、さらにその他のマーケティングや営業などのチーム間のコミュニケーションにより、目標とプロジェクトに関する組織全体の連携が強化されます。
継続的インテグレーション/継続的デリバリー(CI/CD)などのDevOpsプラクティスにより、迅速、安全、かつ信頼性の高いデリバリーが実現します。監視およびロギングは、問題に迅速に対応するためのアプリケーション・パフォーマンスの追跡に役立ちます。
マイクロサービス・アーキテクチャは、単一のアプリケーションを小規模なサービスの集まりとして構築する設計手法です。各サービスはそれぞれ固有のプロセスで実行され、軽量なメカニズムを用いて明確に定義されたインターフェイスにより他のサービスと通信します。マイクロサービスはそれぞれ、異なるフレームワークや言語で作成し、単独のサービスとして、あるいは複数のサービスを集めたひとまとまりのサービスとしてデプロイすることも可能です。
マイクロサービス・アーキテクチャを用いて、より柔軟性が高く、イノベーションの迅速化を可能にするアプリケーションを構築することもできます。一般に、各サービスはそのサービスに責任を負う小規模なアジャイル・チームと対になります。
CI/CDなどのDevOpsプラクティスにより、DevOpsチームは迅速、安全、かつ信頼性の高いデリバリーを実現できます。CIは、開発チームが一元管理されたリポジトリに定期的にコードの変更をマージし、その後のビルドおよびテストを自動化するソフトウェア開発プラクティスです。CIの主な目的は、バグの発見・修正の迅速化、ソフトウェア品質の向上、新しいソフトウェア更新プログラムの検証およびリリースに要する期間の短縮です。CDはCIを拡張した手法で、ビルド工程の後、コードのすべての変更をテストまたは本番環境にデプロイします。
アプリケーションによって生成されたログを収集して解析することにより、ソフトウェアの変更または更新がユーザーに与える影響を理解しやすくなります。
DevOpsやDevSecOpsへの移行はゴールではなく、過程です。DevOpsにより現在の開発と運用のしくみが根本的に変わります。DevOpsの原理に基づいてDevOpsのプラクティス、プロセス、フレームワーク、ワークフローを用いることにより、安全性を損なうことなくセキュリティをスピーディーかつ大規模にソフトウェア開発ライフサイクルに組み込み、リスクの低減、コンプライアンスの確保、相反の低減とコストの削減を実現できます。DevOpsとDevSecOpsにより、開発、運用、セキュリティ・チームはセキュリティおよびコンプライアンスと迅速なデリバリーとのバランスを調整し、SDLC全体にセキュリティを組み込むことが可能になります。