echo("備忘録");

IT技術やプログラミング関連など、技術系の事を備忘録的にまとめています。

【Serverless Framework】メモリ不足でデプロイができない場合の対処方法

概要

Serverless Frameworkでパッケージングやデプロイを行う際に、メモリ不足で失敗することがあります。その場合の対象方法です。

serverless.com

現象

先日、業務で開発したサーバーレス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拡張機能」という内容でオンライン登壇をさせて頂きました。
また、その時の登壇資料も公開していますので、よろしければご参照ください。

vscode.connpass.com

www.slideshare.net

その他、4/24(金)に同じくオンラインで開催される「Infra Study Meetup #1 ~Infrastructure as Code~」にも「Infrastructure as Codeを導入して良かった点」という内容でオンライン登壇させて頂くことになりましたので、よろしくお願いいたします。(てか4/12(日)時点で、参加者1400人超えてる...)

forkwell.connpass.com

それでは、今回はこのへんで。