AWS AmplifyからCloudflare Pagesへの移行 — Next.js APIサーバーの月額$23→$0化

Next.js製のAPIサーバーをAWS Amplify(+WAF)からCloudflare Pagesに移行し、月額約$23のコストを$0にした手順を記録します。

cloudflareawsamplifynextjsmigration

台本(フルテキスト)

動画の掛け合いを書き起こしたものです。音声を再生しづらい場合はこちらをお読みください。

オープニング

  • AWS Amplify から Cloudflare Pages に移行
  • 月額 $23 → $0 のコスト削減を実現
つむぎ
今日はNext.js製のAPIサーバーをAWS AmplifyからCloudflare Pagesに移行して、月額コストを$23から$0にした手順を紹介します。
そら
AWS Amplifyのコスト内訳はどうでしたか?
つむぎ
AmplifyのSSRホスティングが$15、自動作成されたWAFが$8で合計約$23/月でした。無料枠が12ヶ月で切れた後の維持費ですね。
そら
Cloudflare Pagesを選んだ理由は何ですか?
つむぎ
SSRが無料、チーム利用も無料、帯域が無制限という点が決め手でした。Vercelはチーム利用が$20/ユーザー/月かかりますが、Cloudflare Pagesは無料プランで対応できます。
そら
具体的な移行手順を教えてください。

@opennextjs/cloudflareのセットアップ

  • @opennextjs/cloudflare で Next.js を Cloudflare 上で動かす
  • wrangler.jsonc の nodejs_compat フラグが重要
そら
まず何をインストールするのですか?
つむぎ
@opennextjs/cloudflareとwranglerをインストールします。これがCloudflareでNext.jsを動かすための核心ですね。
そら
wrangler.jsoncの設定で重要なのは何ですか?
つむぎ
nodejs_compatフラグが重要です。これによってNode.jsの組み込みモジュールがCloudflare Workers上で使えるようになります。compatibility_dateは2024-09-23以降が必要です。
そら
next.config.jsの変更点はありますか?
つむぎ
output: 'standalone'はCloudflare向けでは不要なので削除します。それ以外の変更は最小限です。

Elasticsearchクライアントのfetch化

  • @elastic/elasticsearch は ALPNProtocols 未実装でエラー
  • fetch ベースに書き換えることで解決
そら
一番大変だったハマりポイントは何ですか?
つむぎ
@elastic/elasticsearchパッケージはNode.jsのhttpsモジュールを使うのですが、Cloudflare WorkersのALPNProtocolsが未実装でエラーになりました。
そら
どう解決したのですか?
つむぎ
Elasticsearchクライアントをfetchベースで自前実装しました。esClient.search()のインターフェースだけ維持すれば、APIルート側の変更はほぼ不要でした。
そら
fetchなら動くのですね。
つむぎ
Cloudflare WorkersはWebのfetch APIに対応しているので、TCPを直接使わない限り多くのことができます。

Workers vs Pages のカスタムドメイン

  • Workers のカスタムドメインは Cloudflare DNS ゾーンが必須
  • Pages なら外部 DNS の CNAME 設定だけで OK
そら
WorkersとPagesの違いについて教えてください。
つむぎ
カスタムドメインの扱いが大きく違います。WorkersはCloudflare DNSゾーンが必須ですが、PagesはCNAME設定だけで外部DNS(Route 53やさくら等)を使い続けられます。
そら
最初にWorkersでやろうとしたのですか?
つむぎ
そうです。最初はWorkersにデプロイしましたが、カスタムドメインにCloudflareゾーンが必要とわかってPagesに切り替えました。
そら
既存のDNS環境をそのまま使いたい場合はPagesが便利なのですね。
つむぎ
その通りです。Route 53などで管理したままCloudflare PagesのカスタムドメインをCNAMEで追加するだけでSSL証明書も自動発行されます。

移行後の効果と移行できないケース

  • コスト $23 → $0、エッジ実行で応答速度も改善
  • Next.js 16 の proxy.ts には未対応(2026 年 4 月時点)
そら
移行後の効果はどうでしたか?
つむぎ
コストは$23から$0になりました。速度も改善されて、/api/healthでTTFBが約40ミリ秒、検索APIでも240〜300ミリ秒程度です。
そら
なぜ速くなったのですか?
つむぎ
AmplifyのSSRはAWSの特定リージョンで実行されますが、Cloudflare Pagesは東京を含む世界中のエッジで実行されるので、ユーザーに近い場所でSSRが走るためです。
そら
移行できないケースもあるのですか?
つむぎ
Next.js 16でmiddleware.tsがproxy.tsにリネームされた場合、@opennextjs/cloudflareが未対応でエラーになります。2026年4月時点での既知の問題です。

まとめ

  • @opennextjs/cloudflare + Pages で月額 $0 の Next.js 運用
  • TCP ベースのライブラリは fetch への書き換えが必要
つむぎ
まとめると、@opennextjs/cloudflareを使えばNext.jsアプリをCloudflare上で動かせます。
そら
@elastic/elasticsearchのようなTCPベースのライブラリは書き換えが必要なのですね。
つむぎ
fetchベースに書き換えることで対応できます。sharpなどのネイティブモジュールはWorkers環境では動かないので注意が必要です。
そら
外部DNSを維持したい場合はPagesを選ぶのが正解ですね。
つむぎ
Amplifyの無料枠が切れた個人・小規模プロジェクトには、Cloudflare Pagesが有力な移行先です。
そら
ありがとうございました。