はじめまして、今年度新卒として入社したテクノロジー開発部の長兵衛です。
現在進行しているプロジェクトのバックエンドを担当させて頂き、記事にできるような事柄がまとまったので僭越ながらブログを投稿させていただきます。
自己紹介
バイセルではインターン生として2019/07から活動しており、2020/04に入社しました。
現在は自社在庫管理システムである「AXIS」チームのバックエンドにアサインされています。
背景
実は今回、自社新システムの開発のバックエンドを任せて頂きました!そこでアーキテクチャ選定が議題に上がり、結論から申し上げると「サーバレス」という形になりました。
アーキテクチャ選定
以前に別のタスクとしてAWS lambdaは経験させていただいていたので、上長から「サーバレスでも良いんじゃない?」と言われたのがきっかけでAWS lambdaで作成するアプリケーションについて調べてみました。
メリット
- インフラ構築の工数が削減できる
- EC2インスタンスの構築など不要なので
- 自動スケーリング
- 水平にスケーリングするため、パフォーマンスを維持できる。メモリ圧迫により「サーバ落ち」が起こらない
- 従量課金制
- 小規模システムのため、システムが使用されない間は課金されない
- 耐障害性
- lambdaは各リージョンの複数のアベイラビリティーゾーンで管理されるため信頼性が高い
デメリット
- 知見が少ないため、工数の見通しがしづらい
- デフォルトだとエラーログがcloudwatch頼みになってしまう
今回利用するユーザが限定的かつ小規模なシステムのため、サーバレスの方が金額的に妥当だということで決定になりました。
Ruby on Jetsとは
lambdaによるアーキテクチャのメリットやデメリットが分かったので、次はアプリケーションのフレームワークを探してみました。
弊社ではRuby On Railsが馴染み深いため、「railsライク」なサーバレスフレームワークを探していたところ、Ruby on Jetsというフレームワークを見つけました。そこでgithubのスター数、最終更新日、トレンド性、ドキュメントの充実性を加味して決定しました。
AWS lambdaとは?
FaaS(Function as a Service)の代表格とも言えます。
責務は「イベントに応じて関数を実行する」だけなのでサーバの管理が不要なのが特徴です。
サーバレスという名前ではありますが、あくまで管理不要というだけで裏ではコンテナが立ち上がってそのコンテナ上で関数が実行されます。
lambda × RDS
アンチパターンであったRDSとの組み合わせもRDSproxyがリリースされたことで解消されました。
lambdaはリクエスト毎にコンテナを立ち上げるため、アプリケーションで直接RDSにコネクションを貼ってしまうと、例えば1000リクエスト同時に来たとすると1000コネクションを貼ることになります。
これだとdatabaseがパンクしてしまうので、RDSproxyを経由してコネクションをプーリングすることで大量アクセスによるdatabase負荷を抑えることができます。
今回はこのRDSproxyを使用しています。
Ruby on Jetsの特徴
使ってみてわかったのが本当にrailsライクで、以下のようにrailsを書いている感覚でアプリケーションが作成できます。
- routesに定義したもの→API gatewayで定義
- controllerのアクション毎に関数が作成される
- IAMロール、ポリシー、VPC、メモリ、タイムアウト時間などの設定をconfig/application.rbで管理できる
- ORMはActiveRecord
- ActiveSupportやActiveModelのメソッドを使用可能
- ローカルではjets serverコマンドでpumaを立ち上げて動作確認できる
また、嬉しかった点としてはstagingやその他のテスト環境を簡単に作成できることです。
環境を作成するというよりかは関数を複製するイメージに近いのでproductionとかなり近い環境を作成することができます。
具体的には以下のJETS_ENV
という環境変数をstagingやproductionに変えるだけで環境の作成と切り替えが可能です!
まとめ
小規模なアプリケーションにAWS lambdaはとても有効だと思います。
サーバレスアプリケーションフレームワークを探していてRuby on Railsに慣れているという方には、Ruby on Jetsがおすすめです。
そして、バイセルでは新卒でもこのような機会を与えてもらえるチャンスがあります!
バイセルテクノロジーズではエンジニアを募集しています。
ご興味のある方は是非ご応募ください。