AWS EC2インスタンスストアをSwap領域に活用する


困ったこと

SWAP領域はLinuxのメモリ管理に重要な役割を果たしています。
一方で、AWSの公式AMIではSWAP領域を用意していません。

よくある解決策はEBS(OS上領域)にSWAPファイルを作成してSWAPとして使用するというやり方です。
ただし、EBS上のIOアクセスは課金されてしまうため、気を付けないと予算をオーバーしてしまう危険性があります。

解決方法

m3などのインスタンスタイプに用意されているIOアクセスが課金されない「インスタンスストア」に注目しました。

しかし、「インスタンスストア」はインスタンス再起動時インスタンスストアのデータはすべて削除され、自動的にext3に再フォーマットされてしまいます。
これらの特性を踏まえて以下の案を考えました。

1. ボリューム追加

AWSインスタンス作成時「ストレージの追加」のステップで、インスタンスストア0/dev/sdbとしてボリューム追加します。

2. インスタンス起動後設定

/etc/fstabを以下のように修正します。

/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中身は以下です。

makeswap.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/