2,3年ほど前に作った LGTM-HUB というしょぼいサービスをふと振り返ったら毎月$12ほどかかっていることに気づきました。さすがに月数百PVほどのサービスにここまでかけるのもどうかなと思い、インフラ構成を変えて運用費を削減しようかなと思いました。ついでにデザインも新しくしました。
どれくらい安くなったのか
毎月約$12かかっていたサービス運用費が毎月約$1になりました。
移行の内容
当初の構成
当初のインフラ構成はこんな感じでした
- EC2(t2.micro)
- サーバ費用削減のためフロントのnginxでサブドメインのNodeサーバにproxyする構成だったが、当時は1サービスにしかproxyしてなかったので意味なかった
- 履歴のデータはオンメモリで持ってた
- Route53
アプリケーションはこんな感じ
- express
- jQuery
- React.js
- socket.io
- ZeroClipboard
- gulp
AWS→Heroku
とりあえずEC2は金かかるなと思い、Herokuに移行することにしました。ついでにhttps化と古いライブラリの廃止と全体的なリファクタリングを行いました。
その結果、月$7まで削減することができました。
アプリケーション構成は以下のようになりました。
- express
- typescript
- React.js
- Redux
- clipboard.js(ZeroClipboardはFLASH使ってた)
- webpack
- 開発環境をDocker化
プルリクはこんな感じ。ほぼ2年ほど構成を変えていなかったので直す箇所が大量にあってしんどかった。
- gulp to Webpack v4
- ZeroClipboard to clipboard.js
- GAいれた
- jQuery to React
- body内をReactで管理するようにした
- refactoring webpack
- react/redux
- httpで接続したりherokuのドメインで接続したりしてきたらhttpsにしちゃう
- http :right: https
- webpackでmode使うようにした
- スタイルをCSS Modulesで再実装した
- オンメモリで履歴管理してたところをRedisに置き換えた
- Redisのデータ管理をオブジェクトからstringにした
- :tada: デザインリニューアル :tada:
- 縦横比がおかしくなったりボーダーがずれたりするバグを修正
- historyを逆に並び替えた
- サービスの説明を行う吹き出しを追加
- bindをclass propertyに変更
- loading barを追加
- contributorsの追加
- 寄付用リンクを置いた
- typescriptを導入
- typescript化その2(主にreduxまわり)
- typescript化その3(主にjsx)
- Copy addressボタンの表示を修正
- thread-loaderとcache-loaderを使うようにした
- webpackリファクタリング&typescript化
- socket.io廃止
AWS Lambda化
月$7でもちょっと高く感じたので、さらに費用削減するべくAWSのLambdaに移行することにしました。SPAをLambdaで動かす事例はちょいちょい見かけていたので。
とはいえ、Expressで書かれたアプリケーションを移行するのめんどいなと思っていたら AWS Serverless Expressという便利そうなものを発見。
aws-serverless-expressでlambda化
若干面倒だった箇所として、JSなどの静的ファイルとかはアップロードしたLambdaのzipファイルを基に配信するため、Expressで専用のパスを作ってあげて1回受けるようにしました。このへん
アプリケーション構成としてはHerokuのときとほとんど変わりませんでしたが、インフラ的には大きく変わりました。
- Lambda
- ApiGateway
- Route53
- DynamoDB
RedisのままだとElastiCacheとかでアホみたいに金かかる感じだったのでDynamoDBを利用することに。開発環境ではDynamoDBのDockerイメージを用いました。
費用内訳
- Route53: 約$1
- その他: $0〜$0.5
感想
インフラだけでなくアプリケーションコードも大幅リニューアルできたのですが、フロントのクオリティアップやバックエンドのリファクタリングなど、まだまだやりたいことがたくさんあってやりきった感はまだないです。
毎月そんなにPVはなくとも使ってくださるユーザーのために運営し続けたくはなるのですが、長期間となると運営費がバカにならないので安く抑えられるならできるだけ工夫して安くしたほうがいいかなと思いました。