はじめに
awsには多様なサービスが存在し、Next.jsをデプロイするだけでも無数の方法があるので個人的に良さそうと思った2つを紹介します。
どちらもawsが触ったことがないひとでも使うことができ、安価に始められ、本番投入できるということを基準にしています。
動作させるソースコードについて
デプロイするソースコードは2パターンどちらも以下になります。
https://github.com/hal256/next-hosting-test/tree/main
以下コマンドでプロジェクトを作成し、ssr用のページを作成しただけのプロジェクトです。
yarn create next-app --typescript
パターン1 AppRunner
ECS(Fargate)を少ない設定で動かせるようにしたサービス
Github等と連携してpush to deploy or ECRから自動pullしてデプロイが可能で使い心地としてはherokuに近い
FargateはVPCやELB作成したりとやることがかなり多い。参考→(https://aws.amazon.com/jp/cdp/ec-container/)
さらに上記図に加えてCodepipeLineを使ってCodebuildでソースコードからDockerイメージの作成、CodeDeployを使ってECSサービスにデプロイをするCIを作成する必要がある。
AppRunnerではURLの図にある
- VPC
- Subnet
- ELB
- ECSクラスター
- Cloudwatch
あたりを自動で作成し、デプロイしてくれる。
Codepipelineで行っていた、ソースコードからDockerイメージの作成、Fargateへデプロイも可能
pros
- 結局Dockerのマネージド・サービスを使いやすく、わかりやすくしただけなので何がどう動いているか明確
- 死活監視、cpu使用率を元にしたオートスケールまで簡単に設定可能
cons
- 常時デーモンを起動しリクエストを待ち受けるので最低利用金額が後述amplifyより高め(とはいえ、Fargate使うよりは安い)
- cdnは自分で設定しないといけないのでアセットファイルはcdnから、配信したい場合は少し手間
パターン2 amplify
Next.js、Nuxt.js等のフロントエンドウェブアプリケーションを構築するための開発プラットフォーム。
デプロイ部分だけ抜き出すとvercelに近い?
AppRunner基本的にはソースコードのビルド、デプロイしかできない一方、amplifyはデプロイだけでなくcontentfulのようなheadless cms系の管理画面が数クリックで作れたり、認証系のサービスとつなぎこみがしやすくなっていたりとNext.jsを使ったWebサービスを作りやすくする機能が盛りだくさんなのが特徴的
デプロイ部分だけをみても、AppRunnerと同じようにGUIから設定するだけで動くので提供される管理画面を使わなくても選択肢としては良さそう
pros
- リクエスト回数、デプロイ回数を元に利用料が計算されるので、最低利用金額は$0に近い状態で始められる。
- デプロイするだけでcdnが使用されているので速い(はず)
cons
- たまに遅い?AppRunnerのほうが安定した速度が出ている。
- 裏側でlambdaが動いている関係上RDSを使うのはアンチパターンになるのでmysqlが基本的には使えない。(RDS Proxyを使えば一応可能だが設定は若干手間)
結局どっちが良いのか?
どちらも設定がかなり簡単で、アクセス数を元にしたスケールが容易であることには変わりはないのでアプリケーション自体の設計をクラウドネイティブに寄せるかどうかで変わりそう。
クラウドネイティブアーキテクチャにする場合はやはりamplifyにするのが良さそう。
amplifyでホスティングと管理画面作成、coginitoで認証して....等などするには向いている。
lambda?なにそれ?というメンバーが多い場合、管理画面もソースコードで管理してテストカバレッジ100%です!というプロジェクトがすでに完成している場合はAppRunnerのほうが向いている。
DokcerコンテナにしてしまえばGCPやAzureに移行も可能なので、ベンダーロックインが嫌という場合はAppRunnerにするしかなさそう。