サーバ管理なしでWebサービス公開 -Firebase(Authentication, Hosting, Firestore) + GAEで『LogCrow(ログ情報共有サービス)』開発-

![LogCrow_top.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45851/4166d3d3-2bb5-8c73-0f39-51f1912d9680.png)


FirebaseとGoogle App Engineを中心に活用し、Webサービスをローンチしたのでそのアーキテクチャ & サービス概要を紹介します。

[LogCrow(ログ情報共有サービス)](https://logcrow.firebaseapp.com/)

# 背景・動機

- 私は日頃業務で、システムの保守・運用の効率化・改善について検討しており、いろんな運用者の知見が共有できている状態が作れると運用者が幸せになれるのではないかと考えています。
- そんな中で、特に保守・運用時にキーポイントとなるログ情報についてフォーカスし、こういうログが出たときには「原因」として何が考えられ、どういった「対処」が必要となるのかといった情報が幅広く共有されると良いのではないかと思っています。
- Google検索はもちろん優秀で、発生したログ文面をキーワードに検索すればある程度情報にたどり着くことはできますが、公開できない情報やログに特化した検索といったことはできないのでそれなりに検索結果を更に精査していく必要が出てきます。

# チャレンジ

- そこで、以下のような機能要件で手軽に利用できるサービス提供ができないかと思うようになりました。
    - ログのメッセージ内容を軸に、そのログの原因や対処方法を記録して管理できる
    - その記録はPublicに公開するものと非公開なものを管理できる
    - 登録されたログに対して検索できる(その際、非公開のものも効率よく検索できる)
    - 検索結果の中から特に自身に必要なログに対してお気に入り登録することができる
    - API経由で検索をできるようにし、監視ツール等で検知した後にその関連情報を自動連携できる
    - 保守・運用は組織で実施されることを想定し、非公開情報については個人・グループで権限分けできる
- その他の要件としては、個人で開発することもあり、極力スモールスタートにしたいという要件もあります。
    - 必要としてくれる人がいるかどうかもわからないので極力費用をかかずにスタートを切りたい。
        - 開発工数も最小限に
        - 環境費用も最小限に

# LogCrow(ログ情報共有サービス)の2020/1時点のできること

ドキュメントは[こちら](https://ike-dai.github.io/logcrow-doc/)に公開しています。
初回のリリース時点では今の所以下の機能が実装できています。

- ログの登録/編集/削除機能
- ログの検索機能
    - ログの対象ソフトウェア、バージョンによる絞り込み検索機能
- お気に入り追加機能
- 公開ログ/非公開ログの管理機能
- パスワード認証によるユーザ登録機能

# LogCrowのアーキテクチャ

上記の要件を満たすため、以下のようなアーキテクチャを採用しています。
(あまり細かく比較検討できているわけではないのでベストな選択かどうかはわからないので参考までに。)

|項目|採用製品・SW|コメント|
|:---|:----------|:-------|
|backend APIのサービス基盤|Google App Engineスタンダード環境|GoogleのPaaS基盤。全部function化も可能かと思うけど、APIがある程度種類あるので基本的に呼び出して実行されるものはPaaS基盤で動かすことにした。|
|backend APIの開発言語|Golang|Pythonでも良かったけど、型の定義とか厳密にできて実装しやすく管理しやすそうなので。Golang好きなので。|
|frontendの開発言語|Vue.js + Vuex|仕事ではReact使っているのでその対比のためにVue.jsも使ってみたかった。学習コストも低そうなので。|
|frontendのデザインフレームワーク|Vue Bootstrap|仕事ではMaterial UI使っているので、少し古いかもしれないがBootstrapベースも試してみたかった。|
|frontendのホスティング先|Firebase Hosting|認証系をFirebaseにしたので、ホスティングもそのままFirebaseで。単純なホスティングだけじゃなくモニタリング系も充実しているので。|
|バッチ的な処理実行|Cloud Functions for firebase|基本的にはFirebase GAEにあわせて利用。初回ユーザ登録時にバックエンドで初期登録処理とか走らせる用途で利用。
|全文検索エンジン|Algolia|Cloud Firestoreの検索は簡易なことしかできなさそうで、[GAEの公式ブログ](https://firebase.google.com/docs/firestore/solutions/search?hl=ja)でもおすすめされていたので。|
|認証基盤|Firebase Authentication|非常に手軽に実装できて無償で使い始められたので。|
|データ管理基盤|Firestore|GAEからもFirebaseからも呼び出しがかんたんなので。|
|ドキュメント管理、Issue管理|GitHub + GitHub Pages|Markdownでドキュメント内容が管理できて、Gitのリポジトリで差分管理できるので。|
|パフォーマンス監視|Firebase Performance monitoring|HostingしているVue.jsの中にSDKを組み込むことで応答速度等簡易に監視ができる。通知とかはなさそうだが、Firebase上のダッシュボードで適度に確認できるので。|


各サービス無償枠などあるので、初期費用は特にかからずスタート可能になっています。

図で示すと以下のような感じになっています。

![LogCrow全体構成図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45851/e7cfbfcb-6d6e-ea44-4b01-f30566f33a34.png)


## 処理の流れ

基本的にはロジック系は全てバックエンドのGAE側のGo実装のAPIが担っています。
フロントエンドはFirebase Authenticationとのやり取りによる認証処理と、バックエンドのAPIとのやり取りを通してあくまでViewの機能のみを持ちます。

例えば、認証～ログ検索の流れは以下となります。

![LogCrow-認証～ログ検索フロー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45851/2a7ad6c1-7ec8-a1d7-8fb8-8f49b9568662.png)


## Algoliaの活用によるログの検索機能

Algoliaは非常に優れた全文検索のSaaSです。APIを通してデータ登録することで簡単にGoogle検索のようなデータ検索機能が実現できます。
どのような順序でフィルタをかけるかとか、スペル誤りを考慮した曖昧検索など色々と使い勝手が良いです。FirebaseとGAEは基本的にGoogle内で完結しているのですが、Algoliaは別サービスの利用ということになるので、こちらは別管理となる点は少し手間がかかります。このサービスでは以下のようにログの登録の際、Firestoreへのデータ登録と同時にAlgoliaへもデータをPOSTし、Firestoreへの登録ログデータのID情報と紐付けてAlgoliaでインデックス管理するようなアーキテクチャを採用しています。

![Algolia登録.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/45851/f3bb4598-268d-8b45-3b4a-b3ebb6de4750.png)


# 今後の計画

まだほんの一部機能のみが実現できたという感じになっています。今後は以下のような追加機能開発も予定しています。
とはいえ、実際に使ってみて、こんな機能があった方が良いなとか、要望をいただければそれを優先的に作りたいと思っています。
ぜひ、要望はメールorGitHubのIssueに追加お願いします。

[Issueの管理ページ](https://github.com/ike-dai/logcrow-doc/issues)

- グループ管理の機能
- 各ログへのコメント投稿機能
- Google認証への対応等、他のOAuth認証対応
- API機能提供
    - 監視ツール等他ツールからの呼び出しによる効果的利用促進
- ログデータの登録簡略化機能
    - 生ログデータに対するログカテゴライズ機能提供 (こちらについては一部CLIでログクラスタリングできるツールをOSSで開発中。[log-cluseter](https://github.com/ike-dai/log-cluster))

などなど

# まとめ

このサービスは皆さんからのログがたくさん蓄積されていることでより効果が発揮されるものになっていますが、冒頭でも書いた通り、非公開ログを個人管理するユースケースにも対応しているのでひとまず個人メモとして記録するだけでも活用してみてください。

このサービスを作るに際し、得られた技術的な情報の詳細については別途まとめる予定です。ゼロからWebサービス開発するチュートリアル的な資料とする予定なのでお楽しみに。