Nuxt2+SSR構成で作った個人サイトの運用費用を、月額4200円から70円まで削減したお話です。
このサイトの目標はこんな感じです。
- Contenfulでコンテンツ管理
- Nuxt2で構築、いい感じでデプロイする
- SSRでTwitterCardやSEO対応したい
初期構成 - ECS時代
図の通りですが、Nuxtアプリをビルドした上でDockerコンテナ化し、ECRへpush。そのイメージを利用してFargateをECSのサービスとして常時起動してCloudfront => ELBで待ち受ける構成です。
この構成で、目的は達成され、レスポンスも問題ありませんでした。しかしながら、大きな問題がありました。
運用費用が高すぎる
さてこの構成での月額の運用費用を計算します。
- 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を使っていたので、そのままの構成変更ですみそうです。
というところで、このような形にしてみました。
大変よさそうです。
変更後は、
- 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にデプロイするという形です。こうすることで、運用費用がほぼタダになるのではという期待を込めて、以下の形に仕上げました。
いろんなリソースを組み立てる都合上、面倒なのでデプロイは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円 もの節約になりました。知識は力なり、ですね。