クマの手も借りたい
馬とテニスとリラックマが好きな IT 系のエンジニアです。
AWS

AmazonLinuxでEC2起動時にスワップ領域の割り当てに失敗

EC2 のインスタンスを再起動した際に、スワップ領域の割り当てに失敗していたので調査してみました。

起動時に自動で割り当て

EC2 起動時のスワップ領域割り当てですが、これまでは以下の記事を参考に、/etc/rc.local を使って行っていました。

しかし、最近になって、EC2 インスタンス起動時にスワップ領域が割り当てられなくなっていたので原因を調べてみました。

これまでは、問題なく動作していたので、AmazonLinux の OS イメージファイルの違いや、カーネルのバージョンによる影響なのかなっと疑っています。

スクリプトの実行確認

実際に、メモリ計算部分を単独で実行してみると、どうやら、メモリ計算式の演算部分でエラーが出ているようです。t2.micro のインスタンスで確認しています。

$ vi mem.sh

#!/bin/sh

MEMSIZE=`cat /proc/meminfo | grep MemTotal | awk '{print $2}'`

echo ${MEMSIZE}

if [ $MEMSIZE -lt 2097152 ]; then
  SIZE=${((MEMSIZE * 2))}k
fi

echo ${SIZE}

これを実行してみると。

$ sh mem.sh

1017368
mem.sh: line 8: ${((MEMSIZE * 2))}k: bad substitution

スクリプトエラーの原因調査

ちなみに、現在のカーネルのバージョンは以下の通り。

$ uname -a                                                                                                  

Linux ip-xxx-xx-xx--xxx 4.9.43-17.38.amzn1.x86_64 #1 SMP Thu Aug 17 00:20:39 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

う~ん、変数展開の部分で怒られているようですが、パっと解決策が思いつかなかったので、純粋に演算させることにしました。

if [ $MEMSIZE -lt 2097152 ]; then
  SIZE=`expr ${MEMSIZE} \* 2`k
elif [ $MEMSIZE -lt 8388608 ]; then
  SIZE=${MEMSIZE}k
elif [ $MEMSIZE -lt 67108864 ]; then
  SIZE=`expr ${MEMSIZE} / 2`k
else
  SIZE=4194304k
fi

まだまだ、シェルの勉強不足です・・・。

Web API The Good Parts

オライリーの「Web API」に特化した本です。最近の多くの Web サービスは API が活用されていますが、その技術はこれまでの Web サイトとそれほど大きく変わりません。

今後、マイクロサービス化が進む中で知っておいて損はない内容が詰め込まれており、現場のエンジニアやこれから Web 系のエンジニアを目指す人にもオススメの一冊です。

created by Rinker
¥2,376
(2018/09/21 11:58:20時点 Amazon調べ-詳細)

あなたにオススメ