概要
Serverless Frameworkでパッケージングやデプロイを行う際に、メモリ不足で失敗することがあります。その場合の対象方法です。
現象
先日、業務で開発したサーバーレスSPAをServerless Frameworkでデプロイしようとしたら、パッケージング時に下記エラーが発生し、デプロイできませんでした。
Ineffective mark-compacts near heap limit Allocation failed - Javascript heap out of memory
アプリやServerless Frameworkの設定を見直したり、「VS Codeが原因かな?」と思い下記記事の内容を色々試しましたが、現象改善しませんでした。
その後、コマンドプロンプトでも同様の現象が発生したので、単純にエラーメッセージの通り、Node.jsのメモリが足りないのが原因と分かりました。
※PCのメモリは十分な容量があったので、そちらはではないと考えました。(てか、そっちならほぼ詰みだった)
対応方法
対応方法ですが、Node.jsのメモリを増やしてあげれば解決します。
下記の通り、環境変数「NODE_OPTIONS」の「max_old_space_size」パラメータにメモリサイズ(MB)を指定することで、Node.jsのメモリを設定可能です。
# Node.jsのメモリサイズを指定する。(MBで) # 下記だと、メモリサイズを4GBにする。 > set NODE_OPTIONS=--max_old_space_size=4096
なお「node」コマンドならば「max_old_space_size」パラメータの値をコマンド毎に指定できますが、Serverless Frameworkの「serverless(sls/slss)」コマンドではダメでした。(少なくとも僕の環境では)
(余談ですが、「serverless」コマンドのエイリアス、「sls」以外に「slss」でもOKなんですね。最近知りました。これでPowerShellでもエイリアスが使えます。(「Select-String」のエイリアス「sls」とかぶるから、「sls」はPowerShellでは使えない))
- Node.jsのデフォルトのメモリサイズは1GBです。
- あまり増やすと、今度は別アプリの動作などに影響がある場合があるので、注意してください。
上記コマンドを実施した後、先述のサーバーレスSPAをServerless Frameworkでデプロイしたところ、問題なくデプロイできました。
なお、実際のNode.jsのメモリサイズを確認する方法については、下記動画で詳しく説明されています。
まとめ
以上、Serverless Frameworkでメモリ不足が発生した場合の対象方法でした。
もちろん、この方法では対処出来ない場合もあるので、その場合はアプリ構成を考えたり(肥大化が原因の可能性がある)、場合によってはPC環境のスペックアップも考える必要があると思います。
ただ、暫定的な対応には使えると思うので、一度試すのもありかと思います。
告知
4/7(火)にオンラインで行われた「VS Code Meetup #4」にて、「開発チーム管理で役立ったVSCode拡張機能」という内容でオンライン登壇をさせて頂きました。
また、その時の登壇資料も公開していますので、よろしければご参照ください。
www.slideshare.net
その他、4/24(金)に同じくオンラインで開催される「Infra Study Meetup #1 ~Infrastructure as Code~」にも「Infrastructure as Codeを導入して良かった点」という内容でオンライン登壇させて頂くことになりましたので、よろしくお願いいたします。(てか4/12(日)時点で、参加者1400人超えてる...)
それでは、今回はこのへんで。