TeamKittenというインターネット上のサークルのリーダーをやっているTinyKittenです。
最近goa(v1だったかな)で書いていたメンバー管理用APIをNode.js(NestJS)で書き直したことと、エコシステムについて書いていきます。
晩酌中に書いてるので普段以上に文が意味不明になってるかと思いますがご容赦ください。
そもそもなぜ移行したか?
いままでgoaというGolangで書いたDSLをよしなにSwaggerと実装テンプレートに落とし込んでくれるすぐれものを使っていました。が、
突然のアップデートでgo getすらできなくなる
という事態が発生ししばらく安定して動くコードで騙し騙しで動かしていました。
しかし、APIにバグが見つかりどうにも現行コードベースでは修正できないと判断し移行した次第です。
goaをアップグレードすればよかったのでは?
それもそうなのですが、goa自体にそれほど固執がなかったのと、チーム内にGolangを書けるメンバーがいなかったのでNode.jsを使ったNestJSフレームワークに白羽の矢が立ったわけです。
それにデザインから書くのが割と面倒だったので。デザインから書くことで助かったことも割と多かったですが、うちのAPIはそこまでクリティカルなものではないので。
NestJSとは?
NestJSとは、AngularにインスパイアされたサーバーサイドNode.jsフレームワークです。
Angularにインスパイアされたということで、書き方もほぼAngularです。
仕事でAngularを長年(というほどでもない)使っているので、割とすんなり書ける感じでそこも選ぶ要因の一つでした。
スタックはどのように変わった?
goaを使っていたときはGCPを使っていました。なんとなくGoogleに揃えたかったのと、AWSのコンソールが複雑怪奇だと当時思ってたからです。
上記の図の通り、シンプルにすべてのTeamKitten内部サービスからGAEのAPIにアクセスし、バックではデータベースにCloudSQL(MySQL)、オブジェクトストレージにCloudStorageを用いていました。
今はどう変わったかというと、単純にAWSになりました。(ALBとかRoute53も増えてますが...)
このような図はあまり書いたことがなく見づらくて恐縮です。
ポータル、公式サイト、すごいBOT等のエコシステムにAPIをつないでいます。(後述)
費用に関しては、個人的な機械学習に使ったEC2も混じっているのではっきりとは言えませんが、今の時点で$100程度請求されています。(多分$30くらいが機械学習)
GCPのときは$50しませんでした。費用削減の余地はありそう。
良かった点は?
仕事ではTypeScript・Angularを扱っているのでスムーズに書ける点でした。
NestJSのドキュメントは割と充実しているので英語さえ多少読めればすぐに扱えます。
テストコードもだいたいAngularっぽいです。(JasmineがJestになってますが)
苦労した点は?
仕事柄、GoよりもJavaScript(ここではTypeScript)を扱うことの方が慣れているので、割とサクサク書くことができました。
が、強いて言うならTSLintを怒らせたくないがためにレスポンスのスネークケースをキャメルケースに置き換えたり、最初からデザインから書くわけではないのでSwaggerがまだ整備できていない点でしょうか。(多分クライアントを作るのは自分だけなのでそれほど必要はないですが)
エコシステムのポータルとは?
メンバーの方々がログインして、自己紹介・アイコン・スクリーンネーム(ログイン用に使える名前)・カバーイメージなどを自主的に変更できるチーム内サービスです。
EXCメンバー(一般メンバーより偉いメンバー)は他の人のパスワード、担当を変更できたりします。
リーダー権限のメンバー(自分だけ)は、メンバー削除、権限降格・昇格などが可能にしてます。
また、監査という機能を新APIには実装して、誰が誰の情報をいじったかを可視化できるようにしました。これで権限を使って勝手なことをするメンバーがいたとしても、すぐに検出できます。(この機能は上位メンバーのみ見れます)
このサービスは今まではNuxt.jsで書かれていましたが、自分の個人的な趣向とまともなUIフレームワークを欲していたのでIonic 4にしました。
新APIに対応させるために改装中です。
エコシステムのすごいBOTとは?
これに関してはチーム内の機密情報なのですが、DiscordのBOTです。まあおもちゃみたいな存在とだけ言います。あとはメンバーの照会ができます。
まとめ
適当に取り留めもなく書いてしまいましたが、Node.js化して正解でした。
メンバーもNode.jsならできるという方もいますし、個人的にもTypeScriptが一番しっくり来るので良かったです。