AWS EBのEC2への突然のデプロイ失敗
開発用の環境を AWS ElasticBeanstalkでEC2(t2.micro)でやってたのですが、ある時からデプロイが失敗続きになってしまってました。
原因を探る
EBへのデプロイ時の挙動は、 /var/log/eb-activity.log
で確認します。
失敗してるところを探しましょう。
[2016-07-02T03:22:47.996Z] INFO [9470] - [Application /AppDeployStage0/AppDeployPreHook/06_npm_install.sh] : Activity execution failed, because: ++ /opt/elasticbeanstalk/bin/get-config container -k app_staging_dir
(略)
> node-sass@3.8.0 install /var/app/ondeck/node_modules/node-sass
> node scripts/install.js
(Executor::NonZeroExitStatus)
[2016-07-02T03:22:48.000Z] INFO [9470] - [Application /AppDeployStage0/AppDeployPreHook/06_npm_install.sh] : Activity failed.
こんな感じのログが出ます。
これはnpm install用の自作のデプロイフックの処理です。
NonZeroExitStatusと書いてあるので、ここで何らかの異常処理が行われてるっぽいという事は分かります。
このエラー内容だと何が原因かいまいち分からないのですが、OOM Killer(メモリ不足)な疑いが。
スワップ領域の確保
t2.microなのでメモリが1Gしかありません。
スワップ領域を1G増やしてみます。
まず現状の確認
$ grep Mem /proc/meminfo
MemTotal: 1019336 kB
MemFree: 568256 kB
MemAvailable: 598736 kB
$ grep Swap /proc/meminfo
SwapCached: 0 kB
SwapTotal: 0 kB
SwapFree: 0 kB
$ free
total used free shared buffers cached
Mem: 1019336 451064 568272 80 23544 95392
-/+ buffers/cache: 332128 687208
Swap: 0 0 0
$ df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
/dev/xvda1 7.8G 4.0G 3.7G 52% /
devtmpfs 490M 56K 490M 1% /dev
tmpfs 498M 0 498M 0% /dev/shm
スワップ領域確保
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=1024
1024+0 レコード入力
1024+0 レコード出力
1073741824 バイト (1.1 GB) コピーされました、 14.0276 秒、 76.5 MB/秒
$ sudo mkswap /swapfile
スワップ空間バージョン1を設定します、サイズ = 1048572 KiB
ラベルはありません, UUID=274ae598-42ab-41e0-b229-bb0a2ccb6c09
$ sudo swapon /swapfile
swapon: /swapfile: 安全でない権限 0644 を持ちます。 0600 がお勧めです。
$ sudo chmod 600 /swapfile
$ ls -l /swapfile
-rw------- 1 root root 1073741824 7月 2 03:36 /swapfile
確認
$ grep Swap /proc/meminfo
SwapCached: 0 kB
SwapTotal: 1048572 kB
SwapFree: 1048572 kB
$ free
total used free shared buffers cached
Mem: 1019336 956532 62804 80 20928 602920
-/+ buffers/cache: 332684 686652
Swap: 1048572 0 1048572
$ df -h
ファイルシス サイズ 使用 残り 使用% マウント位置
/dev/xvda1 7.8G 5.0G 2.7G 65% /
devtmpfs 490M 56K 490M 1% /dev
tmpfs 498M 0 498M 0% /dev/shm
スワップ領域の確保は色んな所にやり方が載ってますので、詳しくはググッてみてください。
デプロイ成功
これでスワップ領域を確保してからデプロイしたら、うまく行きました。
Railsのasset precompileが同様にメモリ不足になるのは何度も経験あるんですが、npm installもメモリ食うんですね。
良かったら試してみてください。