do7be.exports

寿司の話かエンジニアリングの話

WEBサービス運用費を1/12に削減した

2,3年ほど前に作った LGTM-HUB というしょぼいサービスをふと振り返ったら毎月$12ほどかかっていることに気づきました。さすがに月数百PVほどのサービスにここまでかけるのもどうかなと思い、インフラ構成を変えて運用費を削減しようかなと思いました。ついでにデザインも新しくしました。

f:id:do7be:20180819161131p:plain

どれくらい安くなったのか

毎月約$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まで削減することができました。

  • Heroku(カスタムドメインhttpsで利用したかったのでHobby)
  • Route53
  • Redis(Heroku add-on)

アプリケーション構成は以下のようになりました。

  • express
  • typescript
  • React.js
  • Redux
  • clipboard.js(ZeroClipboardはFLASH使ってた)
  • webpack
  • 開発環境をDocker化

プルリクはこんな感じ。ほぼ2年ほど構成を変えていなかったので直す箇所が大量にあってしんどかった。

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はなくとも使ってくださるユーザーのために運営し続けたくはなるのですが、長期間となると運営費がバカにならないので安く抑えられるならできるだけ工夫して安くしたほうがいいかなと思いました。