こんにちは。ディベロップメントテクノロジーセンターの青山です。
DevOpsがどういうものか知らない方々へのDevOps紹介記事です。
前回はDevOpsが必要な時代背景およびDevOpsの概要・普及状況について述べました。
今回はDevOpsを具体的に実践するためのプラクティス(技術的な取り組み)およびDevOpsのプラットフォームを紹介したいと思います。
前回でも述べた通りDevOpsに明確な定義はないため、これやったらDevOpsであるとは一概に言えないのですが、私が代表的と考えているプラクティスを紹介します。
- 構成管理
- 継続的インテグレーション(CI)
- 継続的デリバリー/デプロイメント(CD)
- テスト自動化
順番に説明していきます。
「構成管理(Configuration Management:CM)」は、
「Git」「Subversion」などの「バージョン管理システム」を利用して、ソースコードの管理、環境毎の差異、システム全体のライフサイクルやバージョンなど管理します。
「継続的インテグレーション(Continuous Integration:CI)」は、開発者がバージョン管理システムにソースコードをコミットしたタイミングで、自動的にソースコードのビルドと自動テストを実行し、バグを早期に検出するソフトウェア開発手法です。
「継続的デリバリー(Continuous Delivery:CD)」は、コード変更が発生すると、自動的に実稼働環境(テスト環境や本番環境など)へのリリース準備・リリースが実行されるソフトウェア開発手法です。
似た名前を持つ「継続的デプロイ(Continuous Deploy:CD)」は、「継続的デリバリー」の自動化をさらに推し進め、明示的な承認を行わず自動的に本番環境へのリリースを実現します。
前述の「継続的デリバリー」と「継続的デプロイ」については、あまり厳密に区別されずにひとまとめで「CD」と呼ばれることが多く、さらに「継続的インテグレーション(CI)」とセットで「CI/CD」と呼ばれます。
「テスト自動化」は動的テスト(テスト対象を実際に動作させて検証)を手動ではなく、ツール・プログラムを活用して自動で行うプラクティスです。
迅速な/小さな単位のリリースを繰り返すDevOpsでは、回帰(リグレッション)テストも高速化する必要があり、自動化が必須です。単体・結合テストから始まり、ユーザーが利用するUIからのUIテストの自動化も目指していきますが、初めから全てを実施するのは難しいため、UTから始めて段階的に進めて行きます。
これら「構成管理」「CI/CD」「テスト自動化」の効果は以下の通りです。
- バグの早期検知が可能(開発・テスト効率の向上が実現でき、手戻り時間・コストを削減)
- ソフトウェアを常にリリース可能な状態で維持(リリース前準備が不要となり、リリース作業効率化・スピード向上)
- リリース自動化によるリリースコスト低減・品質向上(短期間での繰り返しリリースが可能になる)
上記の効果からDevOpsにとって欠かせないプラクティスであることがわかるかと思います。
また、その他にも以下のプラクティスがありますので、自分たちのプロセス・開発環境を鑑み、必要に応じて選択します。
- アジャイル開発(迅速かつ適応的にソフトウェア開発をする手法)
- Infrastructure as Code(インフラ構築やプロビジョニングをコードにより自動化する)
- コンテナ化(アプリケーションを「コンテナ」と呼ばれる環境にパッケージ化・動かす仮想化技術)
- マイクロサービス(複数の小さな機能・サービスをAPIによって連携させる分散型アーキテクチャ)
- モニタリング・ロギング(メトリクス・ログを使いアプリケーション・インフラの状態をモニタリングする)
- リリース手法(カナリヤリリース/BlueGreenDeployなど無停止・障害時にロールバックしやすいリリース)
DevOpsはオンプレミス環境でもクラウドでも実践できるため、DevOpsのプラットフォームに特に制限はありません。
しかし、オンプレミス環境でもクラウドいずれでもOKな場合にはクラウドの利用がお勧めです。
理由は以下の通りとなります。
- クラウドのリソース伸縮自在の仕組みがDevOpsの各種プラクティスと相性が良い
- クラウド各社ではDevOpsマネージドサービスを提供しており、DevOps導入・維持コストを下げられる
クラウド各社が提供しているDevOpsマネージドサービスですが、AWSでは一連のサービス(参考外部サイト:DevOps と AWS)として提供されています。
- AWS CodeCommit(プライベートGitリポジトリ)
- AWS CodePipeline(CI/CDを実現)
- AWS CodeBuild(アプリをビルド)
- AWS CodeDeploy(アプリをデプロイ)
Azure では「Azure Devops(参考外部サイト:Azure Devops)」としてまとめて提供されています。
- Azure Repos(プライベートGitリポジトリ)
- Azure Pipelines(CI/CDを実現/アプリをビルド/アプリをデプロイ)
上記以外にもAWS/Azure共に多くのサービスが提供されており、どのクラウドを選択してもDevOpsを実施する上でのサービスは充足しています。
それぞれ一長一短あり、どれが一番優れているということはありませんので、利用するにあたって一番敷居が低いサービス(既に契約済みのクラウドのサービスなど)を選択していただくとよいかと思います。
また、DevOpsプラットフォームにクラウドを選択した場合は「コンテナ化」のプラクティスの導入も検討します。
「コンテナ化」は多くのメリットがあり、クラウド各社が提供するDevOpsマネージドサービスはここ最近「コンテナ化」を前提とした設計がなされるようになってきています。
具体的な「コンテナ化」のメリットは以下の通りです。
- コード/ミドルウェア/OS等をまとめているため、ローカル環境で動かしたイメージをそのままクラウド環境でも動かすことができる
- 高速で起動でき、同一のイメージで複数のコンテナを起動できることにより、スケールアウト/スケールインが簡単・高速に行える
- 従来の仮想化に比べて少ないリソースでの実行が可能
DevOpsマネージドサービスが提供する機能をフル活用するためには是非「コンテナ化」も取り組んでみてください。
今回はDevOpsを具体的に実践するためのプラクティスおよびDevOpsのプラットフォームを述べました。
特に代表的なプラクティスは「構成管理」「CI/CD」「テスト自動化」です。DevOpsを始めようとしているのであれば、これらのプラクティスから取り掛かっていきます。
その際のプラットフォームについては特に制限がなければ、導入が容易なクラウド・プラットフォームを利用することがお勧めです。
今回紹介したプラクティスはDevOpsを実践していくための最初の取っ掛かりです。
まずはプラクティスを実践していくことが必要ですが、一方で、このプラクティスだけをやっていればDevOpsの最終的なゴールである「開発サイクルを迅速に・小さく・繰り返していく」が実現できるわけではありません。
開発と運用など各チームがサイロ化を解消して協業を進める「組織・チームとしての取り組み(文化)」の導入も併せて必要です。前回紹介しました「CALMS」を念頭に置いて継続的な改善を進め、ようやくDevOpsの最終的なゴールを実現できるので注意ください。
次回はDevOpsと似た取り組みである「アジャイル開発」とDevOpsの関連性について紹介します。