DevOps観点で見たHerokuの機能群
前出の通りHerokuは単純にアプリケーションをホスティングするためだけのプラットフォームではなく、The Twelve-Factor Appのコンセプトのもとさまざまなツールや機能を提供し、開発と運用を効率的に行えるようにデザインしています。Herokuの機能群はここで紹介するものだけに留まりませんが、DevOpsの祖である「10+ Deploys Per Day」におけるツールのプラクティスに沿っていくつかをご紹介しておきます。
自動化されたインフラストラクチャ - Heroku Runtime
自動化されたインフラストラクチャを実現するHerokuの機能は「Heroku Runtime」です。
HerokuではDynoと呼ばれるDockerに似たコンテナベースのアプリケーション実行環境と、Slug Compilerと呼ばれるビルドシステムが提供されており、アプリケーションのビルド及びデプロイ、ルーティング、スケーリングといった部分は完全に自動化されています。もちろんHerokuでは同じようなコンテナベースのテクノロジであるDocker Imageをそのままデプロイすることも可能ですが、Slug Compiler/Dyno を利用することでHerokuの持つより高い生産性を発揮できます。
例えばNode.jsのアプリケーションであれば、OSやV8などのランタイム環境及びNode.js自体、そして依存するnpmパッケージをデプロイする必要もありません。Slug CompilerにはBuildPacksという仕組みがあり、業界標準のベストプラクティスに沿って、プログラミング言語ごとに最適な形でアプリケーションが自動的にビルドされます。
具体的には、package.jsonがリポジトリ内にあればNode.jsのアプリケーションと判断して、その内容を元にランタイム環境の用意、npm依存パッケージの取得およびビルド・デプロイを全てHerokuが自動で行います。
Dynoおよび主要なプログラミング言語のBuildPacksはHerokuが常にメンテナンスを行っているため、開発者はバージョン管理やセキュリティパッチ当てなどの作業から解放され、アプリケーションコードの開発に集中できますし、インフラ構築は全て自動化されているため運用担当の負荷はかなり低減されます。
バージョン管理システムの共有 - Git/GitHub Integration
バージョン管理システムの共有を実現するHerokuの機能は「Git / GitHub Integration」です。
Herokuのアプリケーションデプロイに特別なツールは必要なく、オープンソースの分散バージョン管理システムであるGitをベースにしています。Heroku自体がGitリポジトリを持っており、デプロイ時にはremote pushでアプリケーションコードをHerokuへ送り、Herokuがそれビルドします。これは過去の全てのリリース時のコードベースをHerokuで保持していることを意味します。
そのため万が一リリース後にバグが発覚し過去のバージョンへロールバックを行いたい場合にも、Herokuであれば簡単に、すぐに行うことができます。
またGitのリポジトリとしてはデファクトスタンダードであるGitHubとのインテグレーションも可能となっており、GitHub側の特定のブランチが更新された際に自動的にコードを取得アプリをビルドするといった、Auto Buildの機能なども用意されています。
これは開発者にとっては特別なデプロイ手順を覚える必要がないためすぐに扱いやすいのと、DevOpsの観点見た場合には、本番環境へDeployされるコードも含めて全てGitへCommitされていることが前提となるため、開発・運用チームが同一のリポジトリを使うことを促し、リリースされるコードが明確になります。
ワンステップによるビルドとデプロイ - Heroku PipeLines
ワンステップによるビルドとデプロイを実現するHerokuの機能は「Heroku Pipelines」です。
前出の通りHerokuはGitコマンドを利用することでビルド及びデプロイはワンステップで簡単かつ自動的に行えます。これに加えて、Pipelinesと呼ばれるアプリケーションライフサイクルを管理する機能を使えば、Continues Delivery(継続的デリバリー)も容易に実現できます。PipelinesではアプリケーションをReview Apps(レビュー中)、Staging(ステージング)、Production(本番)の3つのフェーズに分けて管理し、フェーズごとに最適な機能を提供しています。
例えばReview Appのフェーズには、GitHubリポジトリ上に開発チームメンバーより送られたプルリクエストのコードを元にアプリケーションを別環境でビルドできます。これによりテスト担当者は、マージ前にアプリケーションをステージングや本番環境に影響を与えずに、動作を確認してからマージすることができます。
また、まだベータではありますが、Heroku CIというテストの実行とビルドを管理するサービスも提供が開始されており、Continues Integration(継続的インテグレーション)の実現もより簡単にできるようになりました。
当然Productionへのリリース時に有効な機能も用意されています。アプリケーションにPrebootの機能を有効にすると、デプロイがあったタイミングで別のインスタンスを立ち上げてビルド及びデプロイが行われ、正常にデプロイができたことを確認してからルーティングを切り替える、いわゆるブルーグリーンデプロイをHerokuが自動的に行ってくれます。
デプロイ時のダウンタイムが実質ほぼゼロとなるため、ユーザ体験を損なわずに、好きな時間にこまめにリリースを行うことができるようになります。
このPipeLinesやPreboot、CIに加えて前出のAutoBuildなどを組み合わせることで、テスト担当者やリリース担当者が行わなければならない環境構築作業やビルド・デプロイ作業を全て自動化できるため、開発ライフルサイクルの大幅な高速化を実現できます。
機能フラグ - Config Vars
機能フラグを実現するHerokuの機能は「Config Vars」です。
Feature Flags(機能フラグと)は、ある時期にのみ提供する期間限定機能や、特定の顧客だけに提供するプライベートベータ機能などの実装において、コード内にそれを埋め込むのではなく外部にある設定によってオン/オフを切り替えるものです。
機能フラグ自体をアプリケーション内に組み込むには追加開発しなければなりませんが、HerokuではConfig Varsと呼ばれる環境ごとに独立した設定情報を持つことができるようになっています。
例えばデータベース接続URLや連携システムのエンドポイント、秘密鍵のようなものから、アプリケーション内の特定処理を実施するかどうかのフラグ(= 機能フラグ)を設定情報に持たせることが可能です。もちろん複雑かつ大規模なものに関してはデータベースで保持するなど、別の方法が必要になってきますが、同じコードベースを利用しながらもステージングでBeta機能をテストしたいが本番環境にはまだ有効にしたくないなど、環境ごとに柔軟に切り替えることが可能です。
メトリクスの共有 - Heroku Dashboard
メトリクスの共有を実現するHerokuの機能は「Heroku Dashboard」です。
Herokuの開発生産性が高いことはよく知られていますが、実は運用面におけるサポート機能も非常に充実しています。DevOpsでは開発チームと運用チームでメトリクスの共有が重要であるとされていますが、HerokuではDashboardと呼ばれる管理コンソール内のMetricsビューから、アプリケーションの状況や、エラー発生率からメモリ使用量、平均レスポンス時間やスループットなど各種情報がグラフィカルに閲覧できるようになっています。
また誰ががいつ何をしたかといったイベント情報、例えばデプロイや設定の変更、DynoのスケールアップなどはActivityビューで確認することができます。
さらには「どの機能に誰がアクセスできるか?」といった権限設定も細かくコントロール可能ですので、開発チームと運用チームが同一のビュー及びメトリクスを共有しながらアプリケーションの開発及び運用を続けていくことができます。
IRCとIM Bot - Deploy Hook
IRCとIM Botを実現するHerokuの機能は「Deploy Hook」です。
現在ではIRCを利用するよりもSlackやHipChatなどのIMコミュニケーションツールが主流となっていますが、ここで重要なのはどのツールを使うかよりも、開発と運用で共通して利用するメッセージインフラを利用していること、そこにデプロイやパフォーマンス低下などの各種通知がBotによってリアルタイムに行われることが挙げられます。
Herokuでは、Deploy Hookと呼ばれるWebHook機能を提供しており、アプリケーションのDeployが行われた際に各種メッセージングサービスへ通知を送ることが可能です。
またHeroku自体は現状Emailのみでの提供ではありますが、Heroku Metricsで平均レスポンス時間の低下やエラーの発生が頻発した場合に通知する機能も搭載してるので、IFTTTなどと組み合わせればパフォーマンス劣化などが起きた場合にもリアルタイムに通知を受け取り、開発と運用チームに通知することが可能です。
HerokuとDevOpsのおいしい関係
ここでご紹介したHerokuの機能はほんの一部ですが、それでもHerokuを利用することが、DevOpsの実現(= スピーディかつ効率的な開発・運用)のための大きな力になるとお分りいただけたと思います。
次回以降ではより詳細な機能や実際のチームにおいて、どのように開発・運用を進めていくかについてご紹介します。どうぞご期待下さい。