AWS EC2の無料枠t2.micro上に構築したLaravel環境で、開発サーバを起動するために「npm run dev」を実行した際、ビルド処理が途中でストップしてしまう問題が発生しました。
その原因と対応方法について調べた内容を備忘録として記載しておこうと思います。
環境
- Amazon EC2 t2.micro (AMI: Amazon Linux 2023)
- Laravel 10.16.1 (ビルドツール: Laravel Vite)
- Node 18.13.0
- npm 9.2.0
【問題】 ビルド処理が終わらない
上記の環境にて、Laravelの開発環境を構築するために「npm run dev」を実行してビルド処理を行った際、ビルド処理が終わらず開発サーバが起動しない問題が発生しました。
ちなみに、ローカル環境では問題なく実行できたので、AWS環境が原因だと考えられます。
$ npm run dev
> dev
> vite
# この状況でストップする
【原因】 メモリ容量が不足していた
使用していたインスタンスタイプは無料枠のt2microで、メモリ容量が1GiBと非常に少ないタイプのものでした。
恐らくビルド処理に必要なメモリ容量が不足しているのが原因で、処理が止まってしまったと考えられます。
【対応】 スワップ領域を確保する
インスタンスメモリを増やすためにスペックの高いインスタンスタイプに変更するのも手ですが、なるべく料金をかけずに無料枠のままで対処したいという気持ちもあったので、今回はスワップ領域を確保するという方法で対処します。
スワップ領域は、仮想メモリとして使用されるディスク上のメモリのことです。スワップ領域を確保することで、物理的なメモリが不足した際でも実際のメモリよりも大きなメモリがあるように動作させることができます。
以下を実行して、現在のメモリ容量を確認します。
$ free -h
total used free shared buff/cache available
Mem: 949Mi 634Mi 67Mi 5.0Mi 247Mi 167Mi
Swap: 0B 0B 0B
AWS EC2のデフォルトではスワップ容量は0Bなのでスワップ領域を確保します。
スワップ領域の計算
一般的に推奨されているスワップ領域は物理メモリの容量に応じてある程度決まっているので、そちらを参考にします。
物理メモリ容量(RAM) | 推奨されるスワップ容量 |
---|---|
RAM <= 2GB | RAM × 2 |
2GB <= RAM <= 8GB | RAM × 1 |
8GB <= RAM <= 64GB | 4GB |
今回は物理メモリが1GBなので、推奨スワップ容量は2倍の2GBとなります。
スワップファイルを作成
スワップ領域を確保するために、スワップ領域をファイルとして保管する方法を用います。
以下を実行してスワップファイルを作成します。
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
ddコマンドを用いて、「/dev/zero」を入力ファイルとして「/swapfile」ファイルに出力します。
「de/zero」は特殊ファイルで全て0で埋まったファイルを読み出します。
bsオプションはブロックサイズを表し、countオプションでブロックサイズの個数を指定します。
つまり、今回の例では、1MB × 2048 = 2048MB(2GB)のサイズの0埋めされたファイルを/swapfileファイルとして出力するというコマンドになります。
スワップファイルの権限を変更
作成したスワップファイルはroot権限でのみ読み書きできるように変更しておきます。
sudo chmod 600 /swapfile
スワップ領域として設定 & 有効化
今のままだとスワップファイルはただの0埋めされたファイルなので、スワップ領域のファイルとして設定し、使用を開始します。
# スワップ領域のファイルとして設定
sudo mkswap /swapfile
# スワップ領域の有効化(使用開始)
sudo swapon /swapfile
# スワップ領域の確認
sudo swapon /swapfile
自動割り当て設定
今のままだと、インスタンス再起動時に、作成したスワップファイルがただのファイルに戻ってしまいます。
スワップの自動起動を設定するために「/etc/fstab」に以下の内容を追記しておきます。
/swapfile swap swap defaults 0 0 # 末尾に追記
スワップ領域を設定しても動かない場合
スワップ領域の設定後もビルド処理で止まってしまう場合は、ビルド処理に必要なメモリ容量が不足しているのでインスタンスタイプ変更を検討する必要があります。
ただし、AWSの無料枠から外れてしまい、料金が発生するので注意が必要です。
参考サイト
AWS EC2のLaravel環境でnpm run devが終わらない
AWSのt2micro上でnpm run build ができない【備忘録】
Linuxでのスワップ領域の確保