開発ノウハウ開発ノウハウ / インフラ運用

Amplifyのタイムアウトとサイズ制限の整理 | 413, 504の切り分け


AWS Amplify Hostingで動かしているアプリケーションで、ある日突然413や504が返り始めることがあります。原因の多くは「Amplify本体」ではなく、その裏で使われているCloudFrontやLambdaの上限に当たっていることです。本記事では、Amplify Hosting・CloudFront・Lambda@Edgeのそれぞれが持つタイムアウトとサイズ制限を、設計時に陥りやすい落とし穴の形で整理します。

公開2026.05.20
最終更新2026.05.20
読了 10 分 / 約4,400字
この記事をシェアポスト
開発ノウハウエラーは「Amplify」ではなく「裏側の層」から返ってくることが多い

Amplifyの制限値の整理
413, 504の切り分け

AWS Amplify Hostingで動かしているフロントエンドが、ある日突然413 Request Entity Too Large・502 Bad Gateway・504 Gateway Timeoutを返し始めることがあります。原因の多くは「Amplify本体」ではなく、Amplifyが内部で使うAmazon CloudFrontや、その奥にいるLambda(SSR Compute)の上限に当たっていることです。

本記事は、実際のサービス開発で本番のAPIが413・504を返した事例をもとに、原因の切り分けと回避設計を整理した実務メモです。Amplify Hosting・CloudFront・Lambda@Edgeのそれぞれが持つタイムアウトとサイズ制限と、エラーから層を切り分ける順序を整理します。

C
本記事の結論を先に
Amplify Hosting で当たりやすい上限は、この 5 つ
  • SSR レスポンスは 5.72MB まで。超えると 504 が返り、ボディは空になります。
  • SSR の API タイムアウトは 30 秒。延ばす手段はありません(Next.js/Nuxt 等を問わず)。
  • CloudFront のオリジン応答タイムアウトは既定 30 秒・標準で 1〜120 秒(120 秒を超えて延ばす場合は AWS にクォータ引き上げ申請が必要)。Amplify からは設定変更できません。
  • Lambda@Edge の応答は Viewer 40KB/Origin 1MB。超過で 502 が返ります。
  • 413/504 を見たら、まず Amplify のデフォルトドメイン(amplifyapp.com)で再現するかを確認。再現するなら原因は Amplify 内部 です。

01.事例:CloudFront + Amplify + Next.js + Laravel で 413 と 504 の両方が出た話

本記事は、次の構成で動かしているサービスで、運用中に 413 Content Too Large と 504 Gateway Timeout の両方に遭遇し、原因の切り分けと回避設計を整理した実務メモです。

層使っているもの当たりやすい上限
CDNAmazon CloudFront(カスタムドメイン用に前段で利用)オリジン応答タイムアウト
フロントエンドホスティングAWS Amplify Hosting(SSR Compute)レスポンス 5.72MB/処理 30 秒
フロントエンドNext.js(App Router)Server Actions・API Route 経由でバックエンドを呼ぶ
バックエンドAPILaravel(別ホスト)重い集計・検索ロジックを担当

事象1:検索系APIで413(レスポンスサイズ超過)

先に発生したのは 413 でした。検索系の API で取得件数を増やしたり、レコードあたりのサイズが大きいデータを含む条件を指定したりすると、レスポンスが大きくなり 413 Content Too Large が返るようになりました。

切り分けで効いたのは、Amplify のデフォルトドメイン(amplifyapp.com)に直接 curl を打って同じ症状を再現できるかを確認した点です。再現したため、前段のカスタム CloudFront ではなく Amplify 内部のレイヤー(内部 CloudFront)が 413 を返しているとわかりました。limit パラメータを変えながら計測すると、サイズと結果の対応関係はおおむね次のとおりでした。

limit実測レスポンスサイズ結果
30約 2.3MB200 OK
50約 3.7MB200 OK
70約 4.5MB200 OK
100約 6MB 前後413
i
数値が公式ドキュメントと食い違う点
本事例の 413 は、公式の「5.72MB → 504」とは別の層から返っていた可能性が高い

AWS 公式の Amplify SSR Compute の応答上限は 5.72MB で、超過時は 504(空ボディ)と明記されています(このあとの章で引用します)。一方で本事例では、応答サイズが 5MB 前後を超えたあたりから 413 が返り始めました。これは Amplify 内部の CloudFront 層(あるいはその手前の payload 経路)で SSR Compute の上限に達する前に 413 が返っていたと読むのが整合的です(amplifyapp.com でも同じ症状が再現したため、前段のカスタム CloudFront ではなく Amplify 内部のレイヤーが返したと判断しました)。

つまり、Amplify SSR では 「サイズ 5.72MB → 504」が起こる以前に、内部 CloudFront 由来の 413 が先に出る挙動になることがある、と捉えるのが安全です。回避方針(レスポンスを軽くする)は同じですが、ステータスコードから素直に「5.72MB を超えた→504」と推定すると診断を誤る場合があります。

Amplify 内部の設定はユーザー側で変更できないため、回避はレスポンスを軽くする方向で対処することになります。具体的には、limit の最大値を実用的な水準に絞る/データ種別ごとに 1 件あたりサイズが偏ることを前提に動的に件数を制御する/一覧 API と詳細 API を分けて応答そのものを軽くする、といった打ち手の組み合わせで、上限に当たらないラインに収めました。

事象2:集計系APIで504(30秒タイムアウト)

もう一つ出たのが 504 です。別フローの集計系 API では、Next.js の Server Actions から Laravel の重い集計処理を呼ぶと、504 Gateway Timeout が返るケースがありました。Laravel 側のログでは処理は完走しているのに、リクエストが消えてしまったように見える、という症状です。

切り分けの結果、原因は Amplify SSR Compute(Lambda)の 30 秒タイムアウトでした。Laravel 側で 30 秒を超えた時点で、Amplify が SSR Lambda の接続を切ってクライアントには 504 だけが届いていたわけです。Amplify SSR の 30 秒は、後述するとおりユーザー側で延長できません。そのため、本処理を 30 秒以内に収める方向には組み直さず、「受付」と「結果取得」の 2 段階に分けたポーリング型に再設計しました。

図:30 秒の壁に当たる同期型と、それを分解したポーリング型

上段は本番で 504 が出ていた同期型。下段は受付・非同期処理・ポーリングの 3 段階に分けた回避設計。SSR Compute は短時間の受付・結果取得だけを担う構造に変わります。

Before:同期型で30秒超のリクエストが504になるClientNext.jsCloudFrontカスタムドメインAmplify SSRServer ActionsLaravel API重い集計処理⛔ SSR Compute の 30 秒タイムアウトで接続が切られるLaravel 側は完走しても、クライアントは 504 しか受け取れないAfter:受付・非同期処理・ポーリングの 3 段階に分解① 受付フェーズ(〜1秒):受付IDだけ返すClientCloudFrontAmplify SSRLaravel /start-async受付IDを発行・Queueに積む受付ID→ Client② 非同期処理フェーズ(時間制限なし):Worker が本処理Laravel QueueWorker(重い処理)DB(結果保存)③ ポーリングフェーズ(10秒間隔・各リクエストは1秒以内)ClientCloudFrontAmplify SSRLaravel /status受付IDで状態確認DB(結果取得)完了するまで 10 秒間隔で繰り返す

実装の流れは次の 3 ステップです。

  1. 受付フェーズ:クライアントは Next.js の Server Actions を叩き、SSR は Laravel の /start-async エンドポイントを即座に呼んで 受付ID だけ返す。SSR 側の処理時間は数百ミリ秒で、30 秒の壁に当たりません。
  2. 非同期処理フェーズ:Laravel は受付IDを Queue ジョブに積み、Worker が本処理(集計・検索など)を実行。結果は DB に 受付ID をキーに保存します。Amplify SSR は介在しないため、処理時間の上限は Worker 側の設定次第(Lambda なら 15 分、サーバなら任意)に伸ばせます。
  3. ポーリングフェーズ:クライアントは受付IDを使って Next.js の /polling 経由で Laravel の /status を 10 秒間隔で叩き、状態が完了になったら結果を取得します。各リクエストは 1 秒以内で返るため、30 秒の壁にはぶつかりません。

共通の学び:Amplify SSR には「サイズ」と「時間」の二重の上限がある

この 2 つの事象から見えてきた整理は、Amplify SSR Compute にはレスポンスサイズ(5.72MB)と処理時間(30 秒)の二重の上限があり、どちらもユーザー側で延長・変更ができないということです。413 はレスポンスを軽くする方向、504 は非同期+ポーリングへの再設計、というように、それぞれの上限ごとに回避の型は別物です。切り分けでは、Amplify のデフォルトドメインで再現するかを最初に確認するのが共通の手順として効きます。再現するなら原因は Amplify 内部の層なので、前段のカスタム CloudFront や WAF を疑う前に Amplify 側の上限を当たる、という順序になります。

以降の章では、ここで触れた Amplify SSR の上限を含めて、各層の上限値と切り分けの順序を整理します。

02.結論:制限値は層ごとに別物なので、まず層を見る

413・504 が返ったときに最初に確かめたいのは、そのエラーがどの層から返ってきているかです。Amplify Hosting は外側から見ると1つのサービスに見えますが、実際にはリクエストは複数の層を通っており、それぞれが独立した上限を持っています。

とくに見落としやすいのが、Amplify の入口と SSR Lambda の間にも CloudFront が入っている点です。アプリ側で前段に CDN を別途立てていなくても、ここの上限はかかります。アプリ自体に変更を加えていないのに 413 が出始めた、ステージングでは再現しないのに本番では出る、といった現象の多くは、この内部 CloudFront か SSR Compute の上限に当たっていることが原因です。

図:Amplify Hostingでリクエストが通る4つの層と、層ごとの制限値

Amplifyで413・502・504が返るとき、原因はL2のCloudFront、L3のSSR Compute(Lambda)、L4のオリジンAPIのいずれかで起きています。エラーコードと層を対応づけることが切り分けの出発点です。

L1クライアントブラウザ・curl・モバイルアプリHTTPSリクエストL2Amplify配下のCloudFrontAmplifyの入口にいるCDN層(内部CloudFront)※カスタムドメイン用のCloudFrontを置いている場合は、その層も前段に加わりますL2 の上限・オリジン応答 30〜120秒・Lambda@Edge 応答40KB/1MBCloudFront → SSR LambdaL3Amplify SSR Compute(Lambda)Next.js/Nuxt などのサーバー側処理※「Web Compute」とも呼ばれる、Amplifyが管理するLambdaL3 の上限・APIタイムアウト 30秒・レスポンス 5.72MB・Lambda payload 6MBサーバー側から外部API呼び出しL4オリジンAPI / バックエンド別ホストのAPI・DBL4 の上限各バックエンド固有のタイムアウト・サイズ制限応答(逆順に各層を通って返る)よくある原因の対応:413L2 / L3 のサイズ系502L2(Lambda@Edge応答超過)504L3 の時間/5.72MB 超、L4 の遅延

※ L2のCloudFrontは「Amplifyが内部で使っているCDN」です。アプリ側で別途CloudFrontを前段に置いている場合は、その層もL2の手前に加わります。

Amplify ホスティングは AWS 公式ドキュメント にも書かれているとおり、内部で CloudFront を使う構成です。デフォルトでは次の図のような構成になっており、カスタムドメインを使っていなくても Amplify の中に CloudFront が居る状態が標準です。

図:Amplify Hosting のデフォルト構成と、カスタム CloudFront を前段に置いた構成

Amplify は外から見ると 1 つの箱ですが、中には CloudFront と SSR Compute(Lambda)が同梱されています。前段にカスタム CloudFront を別途立てていなくても、Amplify 由来の CloudFront は必ず通過します。

① デフォルト構成(カスタム CloudFront なし)Clientブラウザ・curlAWS Amplify Hosting内部 CloudFrontユーザー設定不可SSR Compute(Lambda)Next.js / Nuxt 等Backend API別ホストの API・DBAmplify は外から 1 つに見えるが、内部に CloudFront を同梱している② カスタム CloudFront を前段に置いた構成Clientカスタム CloudFront利用者が自前で構築AWS Amplify Hosting内部 CloudFrontユーザー設定不可SSR ComputeNext.js / Nuxt 等Backend前段にカスタム CloudFront を立てても、Amplify 内部の CloudFront はそのまま残るAmplify が管理する層(ユーザー設定不可)利用者が構築・設定できる層SSR Compute(Amplifyが管理する Lambda)

したがって 413 や 504 を見たときの最初の判断は、「Amplify の何かが壊れた」と一括りにすることではなく、どの層が返したエラーかを絞り込むことです。L3 の Lambda が直接返したのか、L2 の CloudFront が返したのか、L4 のオリジン API 由来かで、当てるべき上限が変わります。

03.AWS Amplify Hosting(SSR Compute)の制限値

まずAmplify Hosting自体が公式に明記している制限値を押さえます。Next.js 12以降など、Amplifyが「Web Compute」と呼ぶSSR実行環境に乗っているアプリが対象です。

レスポンスサイズの上限は5.72MB

Amplifyの SSRトラブルシューティングのドキュメント は、Web Compute(Next.js 12以降)でサポートされるレスポンスサイズの上限を5.72MBと明記しています。これを超えると、Amplifyは504を返し、ボディは空になります。

!
ここで間違えやすい
公式の挙動は「5.72MB → 504」だが、実運用では 413 が先に出ることもある

AWS 公式は、Amplify SSR Compute の応答が 5.72MB を超えると 504(空ボディ)を返すと明記しています(下の引用)。ただし本記事の冒頭の事例で扱ったとおり、実運用ではこのしきい値に達する前に Amplify 内部 CloudFront 層が 413 を返すケースもあります。サイズ系のエラーは 504 と 413 のどちらでも出うると覚えておくと、ステータスコードだけで誤って切り分けずに済みます。

The maximum response size that Amplify supports for Next.js 12 and later apps using the Web Compute platform is 5.72 MB. Responses over that limit return 504 errors with no content to clients.

AWS Amplify Hosting User Guide, Troubleshooting server-side rendered applications(太字は引用者)

実務的には、1リクエストで数MBの配列を返すSSRページや、検索結果を一括で返すAPI Routeでこの上限に当たります。例えばリストのlimitパラメータを大きく取った瞬間に504が出始めるなら、まず疑うべき層はここです。

SSR Compute のAPIタイムアウトは30秒

AmplifyのSSR Compute(Web Compute)には、リクエスト処理の30秒タイムアウトがかかります。Next.jsの node server に限らず、Amplify SSR Compute 上で動くサーバー側処理(Next.js・Nuxt など)に共通で適用される、Amplify側の制限です。リクエスト処理が30秒を超えると Amplify 側で接続が切られ、クライアントには504が返ります。

出典の注意点として、この30秒という値は Amplify SSR features や Troubleshooting SSR のような Amplify 公式ドキュメントには明示されていません(5.72MB の応答上限は明示されていますが、30秒側は別物です)。実態としては、 aws-amplify/amplify-hosting #3223 など複数の issue で AWS 側回答も含めて 30 秒制限が繰り返し確認されており、ユーザー側で延長する手段は提供されていない、というのが実装上の挙動です。Lambda 本体の上限(最大 15 分)よりはるかに短く設定されている層であることに注意してください。

実装側で対処する方向は、長時間処理を非同期化するか、結果をストリーミングするか、そもそも別のホスティングを選ぶかです。Amplifyに乗せたまま30秒超のリクエストを扱うのは、現状では難しいと割り切ったほうが運用は安定します。

ビルド出力・Lambdaパッケージの上限

ランタイムの上限とは別に、ビルド時にも上限があります。Amplify SSRがサポートするビルド出力サイズは220MB、内部で生成されるLambdaのデプロイパッケージは50MBまでです。ビルド中に「出力が大きすぎてデプロイできない」というエラーで気づく類の制限で、稼働中の413/504とは別物として扱います。

項目制限値超過時の挙動・備考
Web Compute レスポンス本文5.72MB超過時は504が返り、ボディは空。Next.js 12以降の公式値
SSR Compute のAPIタイムアウト30秒Next.js/Nuxt 等を問わず適用される。ユーザー側で延長する手段は提供されていない
同期Lambdaのpayload6MB(req/resp 両方)AWS Lambda共通の上限。413が返るときの最大候補
SSRビルド出力220MBビルド時のエラーで気づく。ランタイムには影響しない
Lambdaデプロイパッケージ50MBAmplify SSRが内部生成するLambdaの上限

Lambdaの同期payloadの6MBは、 Lambda公式のクォータ に基づく値です。Amplify特有の5.72MBはこの6MBより少し小さく、間にCloudFrontの処理ぶんが乗っているためと整理できます。

04.Amazon CloudFront(Amplifyが内部で使うCDN)の制限値

次に、Amplifyの裏側にいるCloudFront側の上限です。Amplify側を一切いじっていなくても、ここでブロックされることがあります。

オリジン応答タイムアウト:既定30秒・標準で1〜120秒

CloudFrontには「オリジンが応答を返し始めるまでの待ち時間」の上限があります。 公式ドキュメント によれば、既定は30秒、設定で指定できるのは標準で1〜120秒です。120秒を超えて延ばす場合は、AWSへのクォータ引き上げ申請が必要になります。

Amplify HostingではこのCloudFront側の値を直接いじれないため、SSRやAPI Routeで時間がかかる処理を投げると、L3(SSR Compute)の30秒の手前で、L2(CloudFront)側のタイムアウトに当たることもあります。「30秒で504が返るのが必ずSSR側」とは限らない点に注意します。

Lambda@Edge:Viewer 40KB/Origin 1MB

CloudFrontの前段にLambda@Edgeが噛んでいる構成では、レスポンスサイズの上限がさらに厳しくなります。 公式の制限 によれば、Viewer triggerのレスポンスは40KB、Origin triggerのレスポンスは1MBまでです。これを超えるとLambda@Edgeが応答を返せず、CloudFrontはクライアントに502を返します。

Amplifyを素で使っているだけならLambda@Edgeを書く機会は少ないものの、認証・リダイレクト・ヘッダー書き換えのために独自に挟むケースでは、ここが原因で502が出ることがあります。SSR ComputeのLambdaとは別物なので、混同しないようにします。

項目制限値超過時の挙動・備考
オリジン応答タイムアウト(既定)30秒応答ヘッダーが返り始めるまでの時間。超過で504
オリジン応答タイムアウト(最大)120秒(標準)/120秒超は要クォータ申請Amplify側からは直接設定できない
Lambda@Edge Viewer triggerの応答40KB超過で502。認証・リダイレクト用途で当たりやすい
Lambda@Edge Origin triggerの応答1MB超過で502。SSR Lambdaの応答とは別物

05.ステータスコードから層を切り分ける

実際の障害対応では、上限の表を覚えるよりも、「いま見ているステータスコードがどの層から返ってきているか」を最初に絞ることが効きます。

図:ステータスコードと、原因になりやすい層の対応

同じステータスでも複数の層が原因になりうるため、まず層を絞り込んでから個別の上限を当てます。

ステータス原因になりやすい層よく当たる上限
413L2 CloudFront、または L3 SSR ComputeLambda@Edgeの応答サイズ、Lambdaの同期payload 6MB、CloudFrontのリクエスト上限
502L3 SSR Compute、または L2 Lambda@EdgeLambda@Edgeのレスポンス上限超過、SSR Lambdaの無効応答、コールドスタート失敗
504L3 SSR Compute、または L4 オリジンAPIAmplify SSRのレスポンス5.72MB超、SSRの30秒タイムアウト、オリジン応答30〜120秒タイムアウト

※ Amplifyのドキュメントは「Web Compute(Next.js 12以降)のレスポンスが5.72MBを超えると504で空ボディを返す」と明記しています。ただし実運用では、SSR Compute の上限に達する前に Amplify 内部 CloudFront 層が 413 を返すケースもあります(本記事の冒頭で触れた経緯のとおりです)。サイズ系のエラーは 504 と 413 のどちらでも出うる、と押さえておくと診断を誤りません。

実務で効く切り分けの順序は次のとおりです。

  • L4(オリジンAPI)に直接curlして同じ結果になるかを確認します。200が返るなら、L4は無罪です。
  • Amplifyのデフォルトドメイン(amplifyapp.com)でも同じ症状になるかを確認します。カスタムドメイン用にユーザーが追加したCloudFrontがあるなら、その切り分けになります。
  • レスポンス本文のサイズと、処理にかかった時間を計測します。Amplifyの5.72MB/30秒に近い数値が出ていれば、L3を疑います。
  • Amplifyのデフォルトドメインでも再現するなら、L2の上限はAmplify内部のCloudFrontです。ユーザー側からは設定変更できないため、上限を超えない設計に戻す方向に切り替えます。
  • どの層からのレスポンスかを、応答ヘッダとログで確認します。x-amz-cf-id・via・x-cache など CloudFront 経由のヘッダが付いていればその層を、Amplify/Lambda 側のログにリクエスト ID が残っていなければ SSR Compute に到達していない、といった切り分けができます。
i
再現と計測
curl の計測フラグで「サイズ」「時間」「経由層」を一度に取る

切り分けに使う curl は、-w で計測項目を一緒に取ると再現性が上がります。最低限、次の 3 つを揃えておくと「サイズで切れたのか/時間で切れたのか/どの層を経由したか」が一度に追えます。

  • 時間:time_starttransfer(最初のバイトまで)と time_total(応答完了まで)。30 秒近辺で time_total が打ち切られていれば L3 の 30 秒タイムアウト、time_starttransfer で詰まっていれば CloudFront のオリジン応答タイムアウトを疑います。
  • サイズ:応答ヘッダの Content-Length(無いときは -w '%{size_download}' や wc -c で実測バイト数)。Amplify の 5.72MB 近辺かどうかを判定する材料になります。
  • 経由層:x-amz-cf-id・via・x-cache・x-amzn-trace-id など。CloudFront を経由していれば x-amz-cf-id が付き、SSR Lambda が応答していれば x-amzn-trace-id が付くことが多いので、「どの層が応答を生成したか」のヒントになります。
i
現場でやりがちな切り分けの順序
まず「サイズが原因か、時間が原因か」を分ける

現場の体感では、413・502・504のうち、413/502はサイズ系、504は時間系に強く偏ります。Amplifyでは応答サイズが 5.72MB 近辺になると、公式の「5.72MB→504」だけでなく、内部 CloudFront 由来の 413 として出ることもあります。それ以外のおおまかな当たりは「サイズ系か時間系か」で十分なので、ここを最初に分けてから個別の上限に当てると、再現条件を作りやすくなります。

06.設計段階で上限に当たらないためのチェック

本番で出てからの対処は手数がかかります。設計段階・初期実装段階で、次のチェックを通しておくと、後から「特定条件で413/504」に当たる確率を大きく下げられます。

Amplify / CloudFront で当たりやすい上限のチェック
  • ✓ 1リクエストで返す最大レスポンスサイズが Amplify SSR の 5.72MB を超えないか試算する(特に検索・一覧系API)
  • ✓ limit・page_size の最大値に、サイズ上限から逆算した実用的なキャップを入れる
  • ✓ SSR・API Routeの1リクエスト処理時間が、Amplify 30秒・CloudFront 30〜120秒に収まるか確認する
  • ✓ Lambda@Edgeを噛ませる予定があれば、Viewer 40KB / Origin 1MB の応答上限に応答ヘッダー込みで収まるかを確認する
  • ✓ 本番とSTGで CDN・WAF・カスタムドメインの構成差がないかを設定単位で揃える
  • ✓ Sentry・APM など計測系を経由して取得しているリクエストの量も含めて、本番のレスポンスサイズを実測する

実装側の打ち手としては、レスポンスサイズが線形に伸びるパラメータ(件数・期間・関連レコード)に上限を入れるのがもっとも素直です。クライアント側のlimitを最大100で受けていたところを、メディアやデータの種類によって動的に絞る、というだけでも、サイズ起因の事故は減らせます。

加えて、本番だけで再現する事故を避けるには、ステージング・本番のインフラ構成(CDN・WAF・カスタムドメイン・SSR Computeのバージョン)を設定単位で揃えておくことです。「STGでは出ないが本番で出る」のほとんどは、ここの差で説明がつきます。

07.Amplify に乗せたまま上限に当たらずに済ませる回避パターン

要件として 5.72MB/30 秒 を本当に超えなければいけないケースは、実は限られています。多くの 504/413 は、応答の組み立て方やジョブの分離方法を変えるだけで Amplify に乗せたまま回避できます。よく使う回避パターンを整理します。

状況回避パターン回避できる上限
一覧 API の応答サイズが要件で膨らむlimit を小さく刻んでページングで取得する。一覧の最大 limit を、想定される 1 件あたりサイズ × 件数で逆算して決めるSSR 5.72MB
1 件あたりのフィールドが多くて重い一覧 API は ID・必須フィールドだけ返し、詳細フィールドは個別 API で取得する(list / detail の分離)SSR 5.72MB
巨大なバイナリ・大きな JSON を返したいオリジンで S3 などに置き、SSR Lambda は presigned URL だけ返す。ダウンロード本体は S3 → クライアント直SSR 5.72MB/Lambda 同期 payload 6MB
データ種別ごとに 1 件あたりのレコード数が偏る種別ごとに limit を動的に変える。重い種別だけ件数を絞る判定をサーバー側で行うSSR 5.72MB
関連オブジェクトをネストして返してしまっているシリアライザを整理し、関連は ID 配列のみに圧縮する。必要な側で別 API を叩くSSR 5.72MB
長時間の集計や生成処理を返したいジョブキュー(SQS/EventBridge/Step Functions など)に逃がし、結果は別 API で取りに行く非同期パターンにするSSR 30秒タイムアウト
外部 API の応答待ちが長い外部呼び出しを並列化する。結果をキャッシュする。ストリーミングで最初のバイトを早く返すSSR 30秒タイムアウト
本文すべてを揃えてから返しているNext.js の streaming SSR で段階的に返す。30秒以内に最初のバイトを返せれば、続きは流せるSSR 30秒タイムアウト
i
用途で使い分ける
検索・一覧 API は件数で、ダウンロード系は S3 で逃がす

5.72MB の上限に当たるケースは、大きく (a) 検索・一覧 API のレスポンスが膨らむ か、(b) ダウンロード・エクスポートで重いファイルを返したい かに分かれ、効く対策が違います。

  • (a) 検索・一覧 API 系:クライアントは JSON を受け取ってそのまま画面に描画したい。本体を S3 に逃がしても結局クライアントが JSON を取得して処理することになり、効果が薄い。limit を絞る/list と detail を分ける/関連オブジェクトを ID 配列に圧縮する といった「応答そのものを軽くする」打ち手のほうが効きます。
  • (b) ダウンロード・エクスポート系(CSV・PDF・画像・大きな JSON ファイル):本体を S3 に置いて、SSR Lambda は presigned URL だけ返すのが定型です。クライアントは S3 に直接アクセスするため、Amplify SSR の応答サイズ上限を経由しません。
i
30秒の壁の最初の逃げ先
本処理を Amplify Functions(別 Lambda)に分離して非同期化する

SSR Compute は 30 秒で頭打ちですが、Amplify には同じスタック内に Amplify Functions(Amplify CLI/Gen2 で管理される Lambda)や独立した Lambda を含められます。SSR は受付だけを行い、本処理は Amplify Functions 側の Lambda で実行するのが、Amplify に閉じたまま 30 秒の壁を越える定番のパターンです。クライアントは受付 ID をもらい、結果は別 API でポーリングするか、SNS/EventBridge で通知を受け取ります。Lambda 自体は最大 15 分まで設定できるため、SSR で当たりやすい 30 秒の壁を実用的な水準まで延ばせます。

ジョブキューで非同期にする場合は、「リクエスト即時応答(受付ID)」 → 「クライアントから結果ポーリング or 通知」の 2 段階に分けるのが定型です。SQS で受けて Amplify Functions の Lambda(SSR Compute とは別のもの)で処理し、結果は DynamoDB などに格納する形が、AWS 上で素直に組めます。30 秒の上限を超える処理は、これを前提に最初から設計に組み込んでおくと、後から上限に当たって慌てずに済みます。

08.よくある質問(FAQ)

AmplifyでAPIのレスポンスが大きくなると、413と504のどちらが返りますか?

公式は「Amplify SSR Compute の応答が5.72MBを超えると504(空ボディ)」と明記しています(Amplify公式のSSRトラブルシューティング)。一方で実運用では、SSR Compute の上限に達する前に Amplify 内部 CloudFront 層が 413 を返すケースもあります(本記事の冒頭の事例のとおりです)。サイズ系のエラーは 504 と 413 のどちらでも出うると押さえておくのがおすすめです。なお、リクエスト本文(payload)側の 413 は別物で、L2 の CloudFront か Lambda 同期 payload 6MB が原因のことが多くなります。

Amplifyで30秒以上かかる処理を扱いたい場合、どうすればよいですか?

AmplifyのSSR Computeは30秒のAPIタイムアウトを持ち、ユーザー側で延ばす手段は提供されていません。長時間処理は、キューなどへの非同期化、結果のストリーミング、別ホスティング(例えば Cloudflare Workers のPaidプランで最大5分)への分離のいずれかで切り分けるのがおすすめです。Amplifyに乗せたまま30秒の壁を破るのは、現状では難しいと割り切ったほうが運用は安定します。

AmplifyでカスタムCDNを置いていなくても、CloudFrontの制限はかかりますか?

かかります。Amplify公式のSSR機能ドキュメントにもあるとおり、Amplify Hostingは内部でCloudFrontを使う構成のため、ユーザーがCDNを別途置いていなくても、CloudFront由来の上限(オリジン応答タイムアウトなど)は適用されます。アプリ側のCDNを外しても再現するなら、Amplify内部のCloudFront側の上限を疑うのがおすすめです。

09.まとめ

413・502・504 が返ったらまずどの層から返っているかを切り分け、当たっている上限を特定します。30 秒・5.72MB に当たりそうな処理は、Amplify Functions(別 Lambda)への分離と S3 + presigned URL の組み合わせが、Amplify に閉じた素直な回避策です。それでも要件が合わない場合は Cloudflare Workers のようなエッジ実行ランタイムへの移行が選択肢になります(数値は別記事『Cloudflare Workers のタイムアウトとサイズ制限を整理する』を参照)。

本記事で扱った制限値は、各サービスの公式ドキュメントを出典としています。クォータは時期によって緩和されることもあるため、本番に乗せる前には最新の公式ドキュメントで再確認してください。

お問い合わせ

自社サービスのインフラ設計・障害対応をご相談ください

AWS Amplify・Cloudflare Workers・各種SSR環境の上限を踏まえた設計、本番障害の切り分け、品質管理を組み込んだ運用設計までを支援しています。お気軽にお問い合わせください。

お問い合わせはこちら
この記事をシェア
澤田 翔太(Shota Sawada)
この記事を書いた人

澤田 翔太

株式会社クリプタル 代表取締役

1988年生まれ、慶應義塾大学卒。創業メンバーとして関わった株式会社セールスサポートを株式会社ネオマーケティング(東証STD 4196)に売却。株式会社クリプタルでも複数の事業立ち上げと売却を経験し、2022年9月には婚活・恋愛メディア「シッテク」「婚活会議」を株式会社ベビーカレンダー(東証GRT 7363)へ売却。現在はAI業務支援事業、TANTOU事業、グロースハック支援事業、メディア事業、SEOコンサルティング事業を手がける。