ものレボのバックエンド系の実装について

仕事

はじめまして、ものレボの橋本です。
趣味はアニメ消化(※鑑賞ではないので感想は求めないで下さい)とスノーボード?です。

普段であればこの時期は、有給をいっぱい使わせてもらって雪山に行っているのですが、ものレボのブログが始まり、記事が少なくて寂しいということで、これからサービスのユーザであったり、メンバーとしてものレボにJoinしたいと考えてもらえている開発者の人に、ものレボに興味を持ってもらうために執筆することになりました。

今回は、色々書ける題材はあったのですが、もしこれから開発者としてものレボにJoinする人がいれば気になるであろう、ものレボの提供しているサービスのバックエンド系の実装や実際の開発作業ついて解説していきたいと思います。

下記に上げるバックエンドの構成は、複数あるマイクロサービスのうちの一つの例であり、全てのサービスが同様というわけではありませんが、その中でもわかりやすく見栄えがいいものを選んで記載させてもらおうと思います。

開発で使用しているサービス

  • Slack: コミュニケーションやデプロイ通知など
  • Github: ソースコード管理とタスク管理
  • AWS:
    • Lambda: 実行系
    • API Gateway: Lambdaへの繋ぎ
    • Cognito: ユーザ認証
    • RDS: MySQLを利用
    • ElastiCache: Redisでのインメモリデータストア
    • S3: ストレージ
  • CircleCI: テスト・デプロイ
  • Sentry: エラー監視

実装に使用しているフレームワークやツールなど

  • Poetry: パッケージ管理ツール
  • FastAPI: 今(個人的に)一押しのフレームワーク
  • flake8, autoflake, isort, black, mypy: Linter & Formatter (新しいプロジェクト&コードでは、タイプアノテーションまで義務化してます!)
  • SQLAlchemy: ORM
  • Alembic: SQLAlchemyと連携したDBスキーマのマイグレーション管理ツール
  • npm: パッケージ管理&タスクランナー
  • Serverless Framework: デプロイメントツール
  • Docker: ローカル開発環境構築

細かく上げていけばもっとあるのですが、とりあえず大きな部分で何を使ってるか分かる程度に列挙してみましたが、上記のように箇条書されても分かりにくいと思うので、実際のサービス構成を図に書き出します。

ものレボバックエンド構成

開発環境について

上記のように様々なサービスやツールを利用して「バックエンド」と一言で済ませてしまうものを構築していますが、実際に開発者がローカルで開発をする際の開発環境についても触れたいと思います。

ぼくのかんがえたさいきょうのかいはつかんきょう」は、最近はどこもそうだと思いますが、Docker以外基本的には依存せずにOS問わず開発できるようになっています。
開発者は煩わしい環境構築に時間をかけず、アプリケーションで使用している主要なライブラリ(パッケージ、フレームワーク)の使用方法を学べば、すぐにロジックの実装に入ることができるはずです。

作業としては、テスト駆動開発の流れに近く、割り当てられたタスク(Issue)に対してどうAPIが振る舞うべきか(関数単位ではなく、APIとしてのE2Eをテスト対象にしています)というテストを書き、そのテストが通るようにLinter & Formatterを通しながら実装を行い、PRを作成し、怖いおじさんがレビューするという流れになります。

テストやLinter & Formatterは、Docker上で動かせるようになっているかつ、CircleCI上でも行いPRでのチェックも行っているため、壊れているものがデプロイされにくい仕組みづくりをしています。

もちろん、自身の開発環境に直接(もしくはpyenvなどを使い)開発環境を構築し、好きなエディタ(僕はNeovimとVisual Studio Codeを併用しています)を使って開発してもらうこともできるようになっているため、あなたが何を信仰していても、信仰の自由が保証されています。
もし、信仰を妨げるものがあったとすれば、それは意図したものではないので他の信仰の自由を壊さず仲良く働けるように、よりDX(Developer Experienceの方)を高めていければ良いなと思っています。

最後に

語ろうと思えば、まだまだ上記の環境づくりの際の苦労話や詰まったポイントなど色々かけることはありますが、ふわっと書いてとっつきやすい雰囲気にしたほうが良いと思うので、とりあえずはここで締めさせてもらいます。

次の機会には、(許可が出れば)上記の構成のボイラープレート(Github的にはTemplate Repository)を公開したり、フロントエンド側についても同じように執筆できればと思っています。

資料