マイクロサービスやサーバーレスなどの新しいソフトウェア技術の台頭によって、開発手法に大きな変化が起きています。これに伴ってデバッグの手法もまた、ローカルからリモートへの転換期を迎えています。この記事では、この転換の背景と、現在一般的に用いられているデバッグへのアプローチを比較検討し、Rookoutの利点を明らかにします。
ご存知のように、マイクロサービスはモノリシックなアプリケーションの代わりとなるソリューションとして登場しました。この技術の核心は、「大きなアプリケーションを管理しやすい小さなパーツに分割し、開発者の作業負荷を分散させる」という原則にあります。その一方で、アプリケーションが分散されているため、バグを再現することが非常に難しくなっています。また、ログも分散化したため、その分析もより困難なものとなりました。
モノリシック vs. マイクロサービス
サーバーレスは、マイクロサービスよりもさらに分散型のアーキテクチャで、基盤となるインフラだけでなくアプリまでも機能レベルに抽象化して分散処理することを目指します。つまり、アプリケーションをさらに細かく、関数レベルに分割するということです。
こうしたクラウドネイティブな開発アプローチがもたらした新たな課題のひとつは、従来のように開発者が長年慣れ親しんだIDEやローカル環境でアプリケーションをデバッグすることが難しくなったということです。実際、2018年に開発者コミュニティに対して実施された2018 Serverless Community Surveyアンケート調査(英語)では、サーバーレスの最大の課題として掲げられたのが「デバッグ」でした。ここに「監視」、「テスト」が加わり、これらの課題を解決してくれるツールの必要性が明らかになっています。
2018年に開発者コミュニティに対して実施された「2018 Serverless Community Survey」アンケート調査結果
このようなアーキテクチャの変化によって生まれた新たな課題のひとつであるデバッグの難しさについて、開発者はどのようなアプローチを取り、どのようなツールを使って対処しているのでしょうか?以下に考えられるオプションをすべて書き出し、検討してみます。
開発者が長年慣れ親しんでいるのは、なんといってもローカル開発環境でのIDEを用いたデバッグです。しかし、マイクロサービスの場合、複数のコンテナとそれらの依存関係すべてをローカル環境にセットアップして再現しない限り、適切なローカルデバッグをおこなえません。そこで、本番環境をローカルで効率的に再現するためのさまざまなツールが登場することになりました。一般的には以下の4つのアプローチがあります。
ローカル開発環境でのデバッグを継続しようとするアプローチは、総じて開発者に追加の負担をかけることがお分かりいただけたと思います。さらに、これらの方法でマイクロサービスのデバッグ環境をローカルに構築できたとしても、個々のユーザー特有の環境や接続状況に起因するバグに関しては、その再現や修正が非常に困難です。
マイクロサービスなどのクラウドネイティブな開発手法により適しているのは、アプリが実際に稼働しているクラウド(開発やステージング)や本番環境上でデバッグをおこなうアプローチです。現在のところ、以下の5つのオプションがあります。
リモートデバッグの他のさまざまなアプローチと比較すると、Rookoutが特に優れていることがお分かりいただけたのではないでしょうか。では、リモートデバッグにおけるRookoutの使用感は、実際にはどのようなものなのでしょうか?
登録なしですぐに試せるRookoutの試用環境であるRookout Sandboxで公開しているデモ用のTo-Doアプリケーションを例にご説明します(To-Doアプリの動作はこちらでご確認ください)。このアプリケーションからフロントエンドに送信されるTo-Doリストの内容をすべて見たいなら、対応する行に「止まらないブレークポイント」を設定するだけです。これは、従来のようにローカルマシン上でブレークポイントを設定するのと何ら変わりありません。コードを改変することも、アプリを止めたり壊したりすることもなく、リモートアプリケーションからデータを取得できるのです。
止まらないブレークポイントを"homePage.js"ソース5行目の「res.render('index', data);」に設定
止まらないブレークポイントを設定した後にブラウザでアプリケーションのページをリフレッシュすると、処理がブレークポイントを通過してデータが取得できたことを示す通知が「Messages」タブに表示されます。
「Messages」タブにはブレークポイント通過の通知が、「Variables」タブにはブレークポイントで収集された変数が表示される
使い慣れたブレークポイントが、リモートで稼働中のアプリでもその動作を止めずに使えることがお分かりいただけたと思います。セットアップも非常に簡単で、お使いのプログラミング言語に対応したRookout SDKをインストールしてトークンを組み込むだけで、すぐにアプリケーションのデバッグを開始できます。
トークンを組み込むためのテンプレートコード
Java環境をはじめとしたSDKインストール例(英語)を豊富に取り揃えていますので、ぜひお役立てください。
これまで見てきたように、Rookoutを使えば本番環境で稼働中のソフトウェアをリモートデバッグできるだけでなく、設定も最小限で済むため開発者の手間が大幅に削減できます。アプリのソースのエントリーポイントに1行のコードを追加するだけで、驚きの結果が得られるのです。他に何も変更や設定をすることなく、すぐに自分のアプリをRookoutに接続することができます。
パフォーマンスへの負荷も、通常のやり方でデバッグコードを追加する場合と変わりません。また、ソースコードはブラウザ、ローカルファイルシステム、gitプロバイダの間で共有されますが、サービスとしてのRookoutがその内容を取得する必要はないため、セキュリティも完全です。すべてはフロントエンドでおこなわれ、Rookoutはブレークポイントを設定する際に必要となるファイル名と行番号のみを取得します。
さらに、Rookoutが提供するブラウザベースのデバッグ環境には、データ抽出やデータのパイプライン化などの機能も備わっているため、デバッグやロギングにかかる作業時間を80%も短縮することができます。
Rookoutでは、複数のアプリケーションインスタンスの状態を全体的に可視化して監視・コントロールすることでさらに高度なデバッグを可能にする機能「Cloud Native Debug Session」も提供しています。
「Cloud Native Debug Session」では、視覚的にデバッグ対象のインスタンスを指定可能
アプリケーションの状態、スケール、クラスタリングを可視化し、問題のあるクラスタやPodをボタン1つで切り分けたり、優先順位をつけたりできるこの機能の狙いは、クラウドのデバッグ体験をデスクトップ上のそれと同じくらい簡単かつ直感的なものにすることです。
この記事でご紹介したRookoutのデバッグプロセスをサインアップなしですぐに体験できるRookout Sandboxをご用意しています。クラウドネイティブ時代のリモートデバッグツールのメリットを実感いただけるでしょう。Rookoutに関するお問い合わせや無料版のお申し込みはこちらからお願いいたします。