DevOps

DevOpsについて解説します。

DevOpsとは

DevOpsの目的

DevOpsは迅速かつ安定的に製品をユーザーに届けることを目的に、開発チーム(Development)と運用チーム(Operation)が協働し、プロダクトのリリースサイクルを効率化する考え方の総称です。DevOpsを実現するためには、ボトルネック改善に向けた最適なツール導入とDevOpsに適した文化の形成が求められます。

開発チームと運用チームの統合

開発チームと運用チームの統合

開発チーム(Dev)と運用チーム(Ops)は、プロダクトの価値をユーザーに届けるという共通の目的を持っていますが、その手段が異なります。Devチームは「顧客ニーズにあった最新のアプリケーションやサービスを早期に提供する」ことで価値を届けるのに対し、Opsチームは「顧客に不具合などの症状が起きないようにシステムを安定稼働させる」ことで価値を届けます。実際の開発現場では、しばしばこの「手段の違い」によって、開発チーム(Dev)と運用チーム(Ops)の間に対立が生まれます。それに対してDevOpsはDevチームとOpsチームのコラボレーション(協働)を実践します。全てのメンバーがDev・Opsの視点を持つ必要性が生まれるため、従来のような対立は減少すると考えます。

ボトルネックの理解

DevOpsを実現する上では、従来の運用方法の中で何がボトルネックになっているのかについて理解する必要があります。例えば、手動での環境構築作業、手動でのデプロイ作業、部署間のコミュニケーションの欠如などが考えられます。

改善ツールの導入

迅速かつ安定的にプロダクトをユーザーに届ける上で、ボトルネックとなっている問題を、最適なツールを導入することによって改善します。手動での環境構築やデプロイ作業はCI(継続的インテグレーション)ツールやコンテナ環境による自動化を行うことで、問題の解決につなげていきます。

DevOpsの手法

迅速かつ安定的なリリースサイクルを実現するため、DevOpsでは以下のような手段を主に用います。

継続的インテグレーション

継続的インテグレーションは、開発者がコードをリポジトリにマージした事を検知し、自動でビルドとテストを行う手法です。これにはバグを減少させる、テストのための工数を減らせる、テストの工程を標準化できるなどのメリットがあります。開発者は頻繁にリポジトリにコミットする事で、コード修正の度にテスト結果を確認することができます。テストが失敗したコードをmasterブランチにマージしなければ、常に安全なコードがmasterに存在することになります。また、テスト作業を自動化することで、大幅な工数削減を実現する事ができます。

継続的デリバリー

継続的デリバリーは、継続的インテグレーションによってテストされた安全なコードを、そのままテスト環境や本番環境に自動でデプロイさせる手法です。masterブランチはテストに合格した安全なコードに保たれているという前提で、masterブランチにマージされたコードをそのままテスト環境、ステージング環境、本番環境にデプロイします。これによって、デプロイ作業を手動で行うことによる人的エラー発生のリスクを回避したり、デプロイ手順を標準化することで、作業工程の属人化を避ける事ができます。デプロイの自動化は、コードが完成してからアプリケーションがリリースされるまでの時間を短縮できるため、ユーザーに迅速かつ安定的にサービスを届けるというDevOpsの目的を達成する事に近づきます。

マイクロサービス

マイクロサービスは、1つのアプリケーションを複数の小さなサービスを合体させたものとして構築するアーキテクチャの事を言います。各サービスはそれぞれ独立しており、担う機能も明確に分けられています。httpやgRPCなどの通信によって各サービス間の連携を行います。各サービスは独立した運用を行うため、開発チームが何か変更を加えたとしてもその影響範囲は開発を行ったサービス内に留めることができます。

Infrastructure as code

infrastructure as codeはインフラストラクチャを手動で構築するのではなく、コードベースで管理する手法のことを言います。例えば、クラウドサービス上にインスタンスを立ち上げる場合、管理画面から手動で操作するのではなく、Terraformを用いてコードベースでインフラを管理します。これによって、インフラ構成がコード上で視覚化されるだけでなく、コンソール操作による人的エラーも防ぐことができます。インスタンスなどのコンピューターリソースの管理だけでなく、アプリケーションを実行するための環境構築などをDockerfileで管理するようにすれば、インスタンス上で手動の環境構築をする必要はなくなります。

infrastructure as codeを実践することによって、インフラストラクチャの管理がコードベースで可視化されるだけでなく、管理の属人化リスクを軽減し、リリースサイクルを安定的かつ高速に行えるようになります。

モニタリングとロギング

アプリケーションの稼働状況やログを常にモニタリングすることは、継続的デリバリーや infrastructure as codeによってインフラの更新頻度が上がるほど重要になります。テストに通った安全なコードがデプロイされるとしても、予期せぬエラーが発生するリスクは十分に考えられます。モニタリングとロギングを行うことで、不自然な挙動を迅速に検知し、エラーを即座に修正することができます。

コミュニケーション

継続的インテグレーション、継続的デリバリー、infrastructure as code、モニタリングとロギングを実践すると、開発チームと運用チームの境界線はなくなり、全員が開発と運用の責任を負うことになります。DevOpsを実現するためには、このような体制に適応できる文化の存在が大切になります。

DevOpsに必要な文化

DevOpsを実現するためには、従来の開発チームと運用チームが1つのまとまったチームとして動く必要があります。それを実現するためには以下のような文化が必要不可欠です。

お互いを尊敬する

相手を心から思いやる文化です。相手を一人の人間として扱い、自分とは違う能力を持ったメンバーの力を認めることで、成果や功績を正当に評価することができます。

失敗に対して健全な態度を取る

失敗によって相手を責めない文化です。「新しいことをすれば失敗が起こるのは当然である」ということを認識し、相手を責めるのではなく、問題の解決のためにニュートラルな態度をとる必要があります。

相手を非難しない

相手が悪いと断定して非難をしない文化です。相手を言い負かすために言葉で責めるのではなく、問題解決のために建設的な議論を行う事ができる必要があります。

まとめ

アジャイルやリーンなど、速さが重要視されるWebサービスのビジネスにおいて、安定したリリースサイクルは企業組織において大切にされるべきプロセスです。DevOpsにはソリューションとしてのツールや考え方が確立していますが、実際にそれが全ての組織でそのまま当てはまるわけではなく、リリースの頻度やテストの活用方針など、組織ごとにDevOpsは最適解を考える必要があります。開発組織、企業組織として求められている水準を見極め、DevOpsの適切な設計と運用を行うことが、担当者に求められます。