AWS Amplify ビルドをデプロイすると、"Out of memory" エラーが表示されます。
概要
Amplify コンソールにビルドをデプロイすると、Amplify は 4 つの仮想 CPU (vCPU) と 8 GB の RAM を備えた一時的なコンピューティングコンテナを作成します。ビルドがデフォルトの 8 GB よりも多くのメモリを必要とする場合、以下のメモリ不足エラーのいずれかが表示されることがあります。
"JavaScript heap out of memory"
"FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed"
"SIGKILL directive"
メモリ消費量は、パッケージマネージャー、ビルドツール、フレームワーク、プロジェクト全体の複雑さによって異なります。
解決策
メモリ要件を特定する
アプリケーションのメモリ使用量を確認し、ビルドのメモリ消費量を測定するには、次の手順を実行します。
- プロジェクトディレクトリで Windows ターミナルまたは PowerShell を開きます。
- ピーク時のメモリ使用量を特定するには、オペレーティングシステム (OS) に基づいて次のコマンドを実行します。
Linux または macOS:
/usr/bin/time -l npm run build
Windows:
path = (Get-Location).Path; job = Start-Job -ScriptBlock { Set-Location -Path Using:path; npm run build }; maxMemory = 0; while (job.State -eq 'Running') { currentMemory = (Get-Process -Name 'node' -ErrorAction SilentlyContinue | Measure-Object -Property WorkingSet64 -Sum).Sum; if (currentMemory -gt maxMemory) { maxMemory = currentMemory }; Start-Sleep -Seconds 1 }; Wait-Job job; Receive-Job job; Write-Host "Peak Memory Usage: ([math]::Round(maxMemory / 1MB, 2)) MB"; Remove-Job job
Node.js を使用してボトルネックを特定し、メモリを大量に消費する操作を特定するには、次の手順を実行します。
-
プロジェクトディレクトリのコマンドプロンプトを開きます。
-
次のコマンドを実行して、フレームワークのプロファイリングコマンドを取得します。
React (CRA): node --prof node_modules/react-scripts/scripts/build.js Vite : node --prof node_modules/vite/bin/vite.js build
Next.js : node --prof node_modules/next/dist/bin/next build
Vue CLI : node --prof node_modules/@vue/cli-service/bin/vue-cli-service.js build
-
次のコマンドを実行して分析レポートを生成します。
node --prof-process isolate-0x*.log > profile_report.txt
注**:** 分析レポートには、ビルドの関数呼び出しとメモリ割り当てに関する時間関連の情報が表示されます。この情報を使用して、リソースを最も多く使用し、最適化できる操作を特定します。
Amplify の設定を更新する
注: GitHub リポジトリで amplify.yml ファイルを使用する場合は、Amplify コンソールではなく、リポジトリでファイルを直接更新する必要があります。
メモリ最適化環境変数の設定
大規模アプリケーションのビルドプロセス中のメモリ使用量を最適化するには、ビルドにメモリ最適化環境変数を追加します。ビルド仕様を編集し、アプリケーションのタイプに基づいて、次の環境変数を YAML 設定ファイルの PreBuild セクションに追加します。
- React アプリケーション:
frontend:
phases:
preBuild:
commands:
- npm install
- export NODE_OPTIONS=--max-old-space-size=5632
- export GENERATE_SOURCEMAP=false
- export INLINE_RUNTIME_CHUNK=false
注: NODE_Options=--max-old-space-size=5632 は Node.js ヒープメモリクォータを 5.5 GB に増やし、大規模なビルド中のメモリ不足エラーを防ぎます。GENERATE_SourceMap=False はソースマップの生成を無効にし、メモリ消費とビルド時間を削減します。INLINE_RUNTIME_CHUNK=false は、バンドル中のメモリオーバーヘッドを軽減します。
- React 以外のアプリケーション:
frontend:
phases:
preBuild:
commands:
- npm install
- export NODE_OPTIONS=--max-old-space-size=5632
注:INLINE_RUNTIME_CHUNK=false は、バンドル中のメモリオーバーヘッドを軽減します。GENERATE_SOURCEMAPとINLINE_RUNTIME_CHUNKは React アプリケーション固有のものです。
キャッシュを一時的に無効にする
ビルド作成プロセス中のメモリ使用量を減らすには、次の手順を実行してキャッシュを一時的に無効にします。
-
Amplify コンソールを開きます。
-
該当するアプリケーションを選択します。
-
[ホスティング] を選択します。
-
[ビルドの設定] を選択します。
-
[アプリケーション構築の仕様] で [編集] を選択します。
-
[キャッシュ] セクションに # (シャープ記号) を追加します。設定例:
#cache:
#paths:
#- node_modules/**/*
#- .next/cache/**/*
#- .npm/**/*
-
[保存] を選択します。
注: キャッシュを無効にすると、メモリ使用量は減少しますが、ビルド時間は長くなります。
-
ビルドが完了したら、[キャッシュ] セクションから # (シャープ記号) を削除してキャッシュを再度有効にします。設定例:
cache:
paths:
- node_modules/**/*
- .next/cache/**/*
- .npm/**/*
ビルドコンテナのサイズをアップグレードする
アプリケーションが 8 GB を超える RAM を必要とする場合は、次の手順を実行してビルドインスタンスのサイズを増やします。
-
Amplify コンソールを開きます。
-
該当するアプリケーションを選択します。
-
[ホスティング] を選択します。
-
[ビルドの設定] を選択し、[詳細設定] を選択します。
-
[編集] を選択します。
-
ビルドインスタンスタイプを選択します。
-
[保存] を選択します。
-
[アプリケーション構築の仕様] で [編集] を選択します。
-
インスタンスタイプに基づいて max-old-space-size パラメーターを更新します。
ラージ (16 ギガバイト):
--max-old-space-size=14000
ラージ (32 ギガバイト):
--max-old-space-size=28000
-
[保存] を選択します。
-
ナビゲーションペインで [概要] を選択します。
-
該当するアプリケーションブランチを選択します。
-
最新のデプロイを選択し、[このバージョンを再デプロイ] を選択します。
注: ビルドの失敗を防ぐため、1 GB のメモリをシステムプロセス用に確保してください。ビルドインスタンスの料金については、「AWS Amplify 料金表」を参照してください。