まもりあいJapanについてはこちら。
個人的に気になっている技術スタックなので、(勝手に)勉強させていたく事にしました。
今回は技術Stackを確認してみます。
APIサーバー
↑から抜粋
- TypeScript 3.8.3
- Nest 7.0.7
- Serverless Framework (to manage and deploy)
- AWS Lambda
- Firebase Authentication
- Cloud Firestore
- Cloud Storage
TypeScript + NestJS

NestJSはTypeScript製のWebフレームワークで、最近良く話を聞きます。私の今の仕事でも使い始めました。
フロント側をTypeScriptベースのvueやReactで作っている場合にサーバサイドをTypeScriptで揃えるのは、フロント/バックエンドを同じ人が開発する事が多い少人数開発ではめちゃめちゃメリットがあると感じています。
今までサーバ側はPHPだったりRubyだったりGoだったりと組合わせた事があります。が、よっぽどエッジが効いたサービスか、サービスがかなり軌道にのってかなり作り込む状況でなければ、何を使っても大差は無いというのがWebフレームワークの現状だと思っています。
NestJSも、他のWebフレームワーク(Railsとか)と比べて著しく何かがすごいというのは無いと思いますが、TypeScriptなのでフロント側と同時に作る時のスイッチングコストが発生しない、というメリットはすごく大きいです。
というわけで、NestJSにはすごく注目しています。
AWS Lambda + Firestore
いわゆるマルチクラウドな構成ですね。AmazonとGoogle、それぞれ良いとこ取りの夢のタッグ。
Lambda

Lambdaはアプリケーションの実行環境をサーバレスに提供してくれるサービスで、ソースコードをアップロードすれば動くし、負荷に応じて勝手にスケールします。すごい。
Firebase(GCP)にもFunctions(名前そのまんま)というサービスがありますが、Lambdaの方が先行している認識です。
Firestore
Firestoreは、Firebaseが提供するNoSQLのデータベースです。元々、Firebaseがモバイル向けからスタートしたMBaaSという事もあり、クライアント側から直接データを操作したり、データの同期が簡単にできたり、という機能が特徴です。
また、めっちゃスケールして負荷に強かったり、制限はあるもののある程度の検索はできたりトランザクションがあるので、工夫をすればサーバサイドでも使えます。
また、Firebaseの認証サービスであるFirebase Authenticationとも密接に関係しているので、認証有りのシステムを簡単に構築できます。
AWSでも、DynamoDB/Cognito等を組み合わせ同様な事はできますが、Firebaseの方が先行している認識です。
Serverless

ServerlessFrameworkは、サーバレス系のクラウドサービス(AWS Lambdaとか)の構成管理やデプロイの仕組みを提供してくれるものですね。
terraformとかの、サーバレスなアーキテクチャに特化したもの、と私は捉えています。(まだ詳しくないので違ってたら教えて下さい)
サーバレス系って、サーバという概念が無いので、ソースコードの管理、デプロイ等がちょっと特殊なんですよね。AWS Lambdaだと、zipファイルをアップロードするのがデプロイの基本で、複数ある場合にバージョンの整合性どうするんだ、とか。
そこを良い感じにしてくれるのがServerlessFramework。
前述の通りAWSとFirebaseのマルチクラウドなので、自分で一からやると2倍近くの手間がかかりそうですが、ServerlessFrameworkが良い感じにしてくれるのでしょう。(これから検証)
また、TypeScriptはJavaScriptにコンパイルしてうんぬん、をやらないといけないため、環境構築の面ではひと手間必要なのですが、そこも良い感じにやってくれるのだと思います。
admin-panel(管理画面)
↑(developブランチが最新です)
admin-panel(管理画面)はReact製です。
React(本体)

スマホアプリがあってAPIサーバがあって、という構成なので、管理画面をSPAで作るというのは良くある組み合わせかと思います。
API(の仕組み)はありますからね。画面だけ用意すれば良いのであればReactやvueを使った方が早く作れるし、認証周りもスマホアプリのものを流用できて楽ちんです。
Reactかvueか、という議論はよくありますが、今の所は絶対的な優位性は無いので(少なくとも日本においては。海外だとReactが主流みたいですね)、まあ作る人の好みや経験で決めちゃって良いんじゃないかと思います。管理画面ですし、楽な方で良いのでは。

余談ですが、日本語ドキュメントできてたんですね。
Reactのmiddleware色々
React関連のmiddleware(plugin?)は↓が使われています。
- react-app-polyfill
- react-dom
- react-redux
- react-router-dom
- react-router-redux
- react-scripts
- redux
- redux-actions
- redux-mock-store
- redux-saga
たくさんありますが、ポイントはReduxを使っている事でしょうか。

最近はhooksの採用事例が増えているそうですが、まあ管理画面なので慣れてるもので良いのでは無いかと思います。
firebase
firebaseは認証周りで使っているようです。
DB(firestore)への直アクセスはせず、API経由でデータを取得/更新するようです。
アプリ
アプリはFlutter等は使わずに、AndroidとiOSそれぞれでネイティブで書いています。
おそらく、接触判定で使うBluetooth周りの処理でごりごりネイティブ系の処理を書く想定だからでしょう。
Android
Androidは私が詳しくないのであまり述べられる事はないのですが、Kotlinで書かれています。
Firebaseとは認証周りと、FireStorageからのデータの取得処理が使われているようです。
iOS
iOSも私が詳しくないのであまりわからないのですが、swift製です。
対応のOSはiOS11以上なので、iPhone5sでも動くみたいです。けっこう頑張ってますね。
まとめ
というわけで、「まもりあいJapan」の各サービスの技術Stackを一通り確認してみました。
私がバックエンドに詳しいというのもありますが、APIサーバのアーキテクチャは痺れますね!
これから深堀りするのが楽しみです。
コメント