困ったこと
SWAP領域はLinuxのメモリ管理に重要な役割を果たしています。
一方で、AWSの公式AMIではSWAP領域を用意していません。
よくある解決策はEBS(OS上領域)にSWAPファイルを作成してSWAPとして使用するというやり方です。
ただし、EBS上のIOアクセスは課金されてしまうため、気を付けないと予算をオーバーしてしまう危険性があります。
解決方法
m3などのインスタンスタイプに用意されているIOアクセスが課金されない「インスタンスストア」に注目しました。
しかし、「インスタンスストア」はインスタンス再起動時インスタンスストアのデータはすべて削除され、自動的にext3に再フォーマットされてしまいます。
これらの特性を踏まえて以下の案を考えました。
1. ボリューム追加
AWSインスタンス作成時「ストレージの追加」のステップで、インスタンスストア0
を/dev/sdb
としてボリューム追加します。
2. インスタンス起動後設定
/etc/fstab
を以下のように修正します。
...
↓ 従来設定をコメント
# /dev/xvdb /media/ephemeral0 auto defaults,nofail,comment=cloudconfig 0 2
/dev/xvdb swap swap defaults 0 0
3. SWAP領域作成スクリプト準備
/var/lib/cloud/scripts/per-boot
直下に、実行権があるmakeswap.sh
ファイルを作成します。
makswap.sh
中身は以下です。
#!/bin/bash
SWAPDEVNAME=/dev/xvdb
if [ -b $SWAPDEVNAME ]; then
/sbin/swapoff -a
/sbin/mkswap $SWAPDEVNAME > /dev/null
/sbin/swapon -a -e
fi
4. 確認作業
OS再起動後、swapon -s
でSWAP領域が作成されたことを確認できます。
参考情報
インスタンスストアを利用できないAWSインスタンスタイプの場合は、こちらを参考にしてください。
http://dev.classmethod.jp/cloud/ec2linux-swap-bestpractice/