【まもりあいJapanのコード研究】1:技術Stack確認

プログラム全般

まもりあいJapanについてはこちら

個人的に気になっている技術スタックなので、(勝手に)勉強させていたく事にしました。

今回は技術Stackを確認してみます。

APIサーバー

mamori-i-japan/mamori-i-japan-api
REST API Server for Japanese Exposure Notification App to fight against COVID-19 a.k.a. "まもりあいJAPAN". - mamori-i-japan/mamori-i-japan-api

↑から抜粋

TypeScript + NestJS

NestJS - A progressive Node.js framework
NestJS is a framework for building efficient, scalable Node.js web applications. It uses modern JavaScript, is built with TypeScript and combines elements of OO

NestJSはTypeScript製のWebフレームワークで、最近良く話を聞きます。私の今の仕事でも使い始めました。

フロント側をTypeScriptベースのvueやReactで作っている場合にサーバサイドをTypeScriptで揃えるのは、フロント/バックエンドを同じ人が開発する事が多い少人数開発ではめちゃめちゃメリットがあると感じています。

今までサーバ側はPHPだったりRubyだったりGoだったりと組合わせた事があります。が、よっぽどエッジが効いたサービスか、サービスがかなり軌道にのってかなり作り込む状況でなければ、何を使っても大差は無いというのがWebフレームワークの現状だと思っています。

NestJSも、他のWebフレームワーク(Railsとか)と比べて著しく何かがすごいというのは無いと思いますが、TypeScriptなのでフロント側と同時に作る時のスイッチングコストが発生しない、というメリットはすごく大きいです。

というわけで、NestJSにはすごく注目しています。

AWS Lambda + Firestore

いわゆるマルチクラウドな構成ですね。AmazonとGoogle、それぞれ良いとこ取りの夢のタッグ。

Lambda

AWS Lambda(イベント発生時にコードを実行)| AWS
AWS Lambda を使用すれば、サーバーのプロビジョニングや管理なしでコードを実行できます。課金は実際に使用したコンピューティング時間に対してのみ発生し、コードが実行されていないときには料金も発生しません。

Lambdaはアプリケーションの実行環境をサーバレスに提供してくれるサービスで、ソースコードをアップロードすれば動くし、負荷に応じて勝手にスケールします。すごい。

Firebase(GCP)にもFunctions(名前そのまんま)というサービスがありますが、Lambdaの方が先行している認識です。

Firestore

Cloud Firestore  |  Firebase
Google の柔軟でスケーラブルな NoSQL クラウド データベースを使用して、クライアント側開発とサーバー側開発のデータを保存、同期します。

Firestoreは、Firebaseが提供するNoSQLのデータベースです。元々、Firebaseがモバイル向けからスタートしたMBaaSという事もあり、クライアント側から直接データを操作したり、データの同期が簡単にできたり、という機能が特徴です。

また、めっちゃスケールして負荷に強かったり、制限はあるもののある程度の検索はできたりトランザクションがあるので、工夫をすればサーバサイドでも使えます。

また、Firebaseの認証サービスであるFirebase Authenticationとも密接に関係しているので、認証有りのシステムを簡単に構築できます。

AWSでも、DynamoDB/Cognito等を組み合わせ同様な事はできますが、Firebaseの方が先行している認識です。

Serverless

The Serverless Application Framework | Serverless.com
Build web, mobile and IoT applications using AWS Lambda and API Gateway, Azure Functions, Google Cloud Functions, and more.

ServerlessFrameworkは、サーバレス系のクラウドサービス(AWS Lambdaとか)の構成管理やデプロイの仕組みを提供してくれるものですね。

初めてのサーバーレスアプリケーション開発 ~Serverless Framework を使ってAWSリソースをデプロイする~ | Developers.IO
以前のエントリでは、GUIで簡単なサーバーレスアプリケーションを構築する方法を学びました。 初めてのサーバーレスアプリケーション開発 ~DynamoDBにテーブルを作成する~ 初めてのサーバーレスアプリケーション開発 ~ …

terraformとかの、サーバレスなアーキテクチャに特化したもの、と私は捉えています。(まだ詳しくないので違ってたら教えて下さい)

サーバレス系って、サーバという概念が無いので、ソースコードの管理、デプロイ等がちょっと特殊なんですよね。AWS Lambdaだと、zipファイルをアップロードするのがデプロイの基本で、複数ある場合にバージョンの整合性どうするんだ、とか。

そこを良い感じにしてくれるのがServerlessFramework。

前述の通りAWSとFirebaseのマルチクラウドなので、自分で一からやると2倍近くの手間がかかりそうですが、ServerlessFrameworkが良い感じにしてくれるのでしょう。(これから検証)

また、TypeScriptはJavaScriptにコンパイルしてうんぬん、をやらないといけないため、環境構築の面ではひと手間必要なのですが、そこも良い感じにやってくれるのだと思います。

admin-panel(管理画面)

mamori-i-japan/mamori-i-japan-admin-panel
Admin Panel for Japanese Exposure Notification App to fight against COVID-19 a.k.a. "まもりあいJAPAN". - mamori-i-japan/mamori-i-japan-admin-panel

↑(developブランチが最新です)

admin-panel(管理画面)はReact製です。

React(本体)

React – ユーザインターフェース構築のための JavaScript ライブラリ
ユーザインターフェース構築のための JavaScript ライブラリ

スマホアプリがあってAPIサーバがあって、という構成なので、管理画面をSPAで作るというのは良くある組み合わせかと思います。

API(の仕組み)はありますからね。画面だけ用意すれば良いのであればReactやvueを使った方が早く作れるし、認証周りもスマホアプリのものを流用できて楽ちんです。

Reactかvueか、という議論はよくありますが、今の所は絶対的な優位性は無いので(少なくとも日本においては。海外だとReactが主流みたいですね)、まあ作る人の好みや経験で決めちゃって良いんじゃないかと思います。管理画面ですし、楽な方で良いのでは。

JSフレームワーク事情2020年始め|erukiti|note
Angularの人気低下が指摘されている記事の元ソースを見てみると、JS界隈の世界が見えてきます。 The State of JavaScript 2019: Front End FrameworksDiscover the most popular JavaScript features & te

余談ですが、日本語ドキュメントできてたんですね。

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を使っている事でしょうか。

Redux - A predictable state container for JavaScript apps. | Redux
A predictable state container for JavaScript apps.

最近はhooksの採用事例が増えているそうですが、まあ管理画面なので慣れてるもので良いのでは無いかと思います。

firebase

firebaseは認証周りで使っているようです。

Firebase Authentication

DB(firestore)への直アクセスはせず、API経由でデータを取得/更新するようです。

アプリ

アプリはFlutter等は使わずに、AndroidとiOSそれぞれでネイティブで書いています。

おそらく、接触判定で使うBluetooth周りの処理でごりごりネイティブ系の処理を書く想定だからでしょう。

Android

mamori-i-japan/mamori-i-japan-android
Android App for Japanese Exposure Notification App to fight against COVID-19 a.k.a. "まもりあいJAPAN". - mamori-i-japan/mamori-i-japan-android

Androidは私が詳しくないのであまり述べられる事はないのですが、Kotlinで書かれています。

Firebaseとは認証周りと、FireStorageからのデータの取得処理が使われているようです。

iOS

mamori-i-japan/mamori-i-japan-ios
iOS App for Japanese Exposure Notification App to fight against COVID-19 a.k.a. "まもりあいJAPAN". - mamori-i-japan/mamori-i-japan-ios

iOSも私が詳しくないのであまりわからないのですが、swift製です。

対応のOSはiOS11以上なので、iPhone5sでも動くみたいです。けっこう頑張ってますね。

iOS 11 と互換性のあるデバイス
  

まとめ

というわけで、「まもりあいJapan」の各サービスの技術Stackを一通り確認してみました。

私がバックエンドに詳しいというのもありますが、APIサーバのアーキテクチャは痺れますね!

これから深堀りするのが楽しみです。

コメント

タイトルとURLをコピーしました