Nuxt2+SSR構成で作った個人サイトの運用費用を、月額4200円から70円まで削減したお話です。

このサイトの目標はこんな感じです。

  • Contenfulでコンテンツ管理
  • Nuxt2で構築、いい感じでデプロイする
  • SSRでTwitterCardやSEO対応したい

初期構成 - ECS時代

図の通りですが、Nuxtアプリをビルドした上でDockerコンテナ化し、ECRへpush。そのイメージを利用してFargateをECSのサービスとして常時起動してCloudfront => ELBで待ち受ける構成です。

Screen Shot 2022-09-25 at 1.10.39

この構成で、目的は達成され、レスポンスも問題ありませんでした。しかしながら、大きな問題がありました。

運用費用が高すぎる

さてこの構成での月額の運用費用を計算します。

  • Route 53: 0.5 USD
  • ECS (Fargate 0.25CPU/0.5GB): 11.25 USD
  • ELB: 17.77 USD

計 $29 + Tax

4200円ほどです。正直大してトラフィックもないサイトにこれは高すぎです。さくらVPSなら4コア4GB/200GB SSDのVPSを借りてもお釣りが来るレベルです。手痛いのはELBで、本体よりも運用費用が高いです。ECSを使ったサービスへルーティングするにはELB(ALB)を立てないといけないため、地味に辛い固定費用です。

しかしながら、しばらくは良いアイディアが浮かばずこの形で運用していました。

AppRunner時代

さすがに危機感を覚えたので、少し構成を変えてみました。

主役は21年の5月ぐらいに発表されたAppRunnerです。

  • コンテナベースのイメージをデプロイ・ホスティングできる
  • 非アクセス時間はコールド状態に、呼び出されると一定時間アクティブになる。コールド状態の場合、非常に低額で維持できる
  • ロードバランシングをしてくれる
  • 設定に応じて自動的にスケールアウトする

というもので、アクセスがほとんどない場末のサイトにはぴったりです。また、ECRを使っていたので、そのままの構成変更ですみそうです。

というところで、このような形にしてみました。

Screen Shot 2022-09-25 at 1.31.58

大変よさそうです。

変更後は、

  • Route 53: 0.5 USD
  • AppRunner(1CPU/2GB): 12.74 USD

計 $13.24 + Tax

およそ月額1900円ぐらいになりました。月あたり2300円の削減に成功しました。年額27000円ぐらいの節約ですからなかなか大きいです。モニタリングしていたところ、起動してはいるものの数円レベルで、ほとんどCPU費用はかかっていませんでした。

Serverless時代(現在)

上記の形で1年ぐらい運用していましたが、円安でいよいよ節約の機運も高まっていたので、Nuxt2のSSRをLambda化してしまおうと思いました。

構成としては、Nuxt2をLambda@Edgeに載せて、Cloudfrontのビヘイビアで振り分け。静的アセットはS3にデプロイするという形です。こうすることで、運用費用がほぼタダになるのではという期待を込めて、以下の形に仕上げました。

Screen Shot 2022-09-25 at 1.44.50

いろんなリソースを組み立てる都合上、面倒なのでデプロイはCDKに任せることにしました。CloudFrontでパスによってS3とLambda@Edgeを切り分けし、SSRが必要なリクエストはすべてLambdaで捌く構成に変更しました。

  • Route 53: 0.5 USD
  • Lambda: 0 USD

計 $0.5 + Tax

運用していたサイトのアクセス数的に、Lambdaの無料枠で収まっていたため0円となりました!めでたい。

気になるのはGB秒がどれぐらいになるかです。1リクエストあたり、コールドスタートでおよそ1.5秒、立ち上がってる状態では20ms程度でした。コールドスタートであれば1ヶ月53万リクエストぐらいでようやく課金される塩梅です。当然そのような頻度でリクエストされればコールドスタートの頻度も減りますし、SPAとして動きますのでPVに比べてサーバ負荷も幾分低いはずです。

ということで、最終的に月70円まで節約することができました。これによって 年間49,560円 もの節約になりました。知識は力なり、ですね。