EBSボリュームはいくつで運用するのがよいのか

疑問~EBSはいくつが最適解?~

ディスク使用率が高くなり困っていた。
そこで、swapをswapファイルではなく、別ボリュームを作成してマウントしてそこの領域をswapにしようとした。
そうすれば/ディレクトリを2Gあけることができるし、仮に不要になれば戻すのも簡単だと考えたからだった。
しかし、どうしても運用は複雑になる。
そこで疑問に思ったのだが、swapを別ボリュームで動かすというのは理にかなっているのか?
そしてベストプラクティス的にEBSっていくつなのか、と疑問に思った。
思いつきでswapやらデータディスクを追加するのも美しくないので調べてみた。

参考サイト

意外とググっても出てこない。
そんなの自分で好きに決めろよってことなのか・・・?

下記2サイトあたりがヒントになりそう。

https://media.amazonwebservices.com/jp/csd20140909/TA-02.pdf
容量は1GB~1TB。EC2インスタンスに複数アタッチできるので、大容量が必要なら複数のEBSを使う

まぁ容量が大きくなれば複数必要だろうが・・・。

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ec2-best-practices.html
オペレーティングシステム用およびデータ用として個別に Amazon EBS ボリュームを使用します。
データのボリュームがインスタンス終了後も保持されることを確認します。
詳細については、「インスタンスの削除で Amazon EBS ボリュームを保持する」を参照してください。

暫定結論~オペレーティングシステム用+データディスクの2つ~

これかな。
データ用として個別、というのは1つでいいのだろうか。
Apache、Postgresql、Mysql と、ミドルウェアごとにデータディスク用意するとなると、ミドルウェアが増えるとディスク追加しなきゃいけなくなり面倒なので、とりあえずは1つと解釈する。

新しいEBSボリュームを作成し、/dataというディレクトリにマウントして使おう。
移動させるのはApacheのドキュメントルート、Postgresql、Mysql、Redmineのデータ(/var/libの下にあるやつ)をごっそりもってくればいいはず。

今回はいきなり本番でやるのでなく、現環境を複製してそこで試し、問題なければ本番適用する。

作業記録~データディスク追加作業、データ移行~

・AMIからインスタンス作成(省略)

・新たなEBSボリュームを作成
注意点はボリュームの暗号化くらいか。デバイスはいじらず/dev/sdfにしておく

・lsblk でデバイス名を確認
NAME        MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1     259:0    0  20G  0 disk 
└─nvme0n1p1 259:1    0  20G  0 part /
nvme1n1     259:2    0  20G  0 disk 

・ファイルシステムがあるかどうか確認
sudo file -s /dev/nvme1n1
気になったのは、EBSってパーミッション切れるのだろうか。

・ファイルシステム(xfs)を作成
sudo mkfs -t xfs /dev/nvme1n1

・ファイルシステムのマウント
sudo mkdir /data
sudo mount /dev/nvme1n1 /data

・df -h
Filesystem                                      Size  Used Avail Use% Mounted on
devtmpfs                                        454M     0  454M   0% /dev
tmpfs                                           482M     0  482M   0% /dev/shm
tmpfs                                           482M   13M  469M   3% /run
tmpfs                                           482M     0  482M   0% /sys/fs/cgroup
/dev/nvme0n1p1                                   20G   12G  8.1G  60% /
fs-da1d1dfb.efs.ap-northeast-1.amazonaws.com:/  8.0E  2.1G  8.0E   1% /efs
tmpfs                                            97M     0   97M   0% /run/user/1000
/dev/nvme1n1                                     20G   33M   20G   1% /data

ここまではほぼAWSドキュメント通り。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-using-volumes.html

・関連してそうなプロセスを止めておく
systemctl stop httpd
systemctl stop mysqld
systemctl stop postgresql
systemctl stop haproxy

・Apacheのドキュメントルート(正確にはドキュメントルート含むコンテンツ全て)を移動およびシンボリックリンクを貼る
mv /www /data/
ln -s /data/www /www
mkdir -p /data/var/lib
mv /var/lib/redmine /data/var/lib/
ln -s /data/var/lib/redmine /var/lib/redmine

lrwxrwxrwx    1 root root          9 Aug 31 03:03 www -> /data/www
lrwxrwxrwx   1 root    root      21 Aug 31 04:11 redmine -> /data/var/lib/redmine

・mysql、postgresqlのデータ移動およびシンボリックリンクを貼る
mv /var/lib/mysql /data/var/lib/
ln -s /data/var/lib/mysql /var/lib/mysql
mv /var/lib/pgsql/ /data/var/lib/
ln -s /data/var/lib/pgsql /var/lib/pgsql

・blkidでUUIDを確認し、/etc/fstabを編集
vi /etc/fstab
-----
(追記)
UUID=7faa88dd-6320-4af2-9a27-71a67d967d5d /data                   xfs     defaults        0 0
-----

・rebootしても問題ないことを確認
ほんとはリブートするまえにアンマウントしてmount -aでエラーでないことを確認すべき。本番ではそうする。

・AMIを作成し、新規インスタンス作成
AMIを作成すると2つスナップショットと1つAMIが作成される。
そのAMIからインスタンス作成し、問題なく起動した。
mountも問題なし。
mountされているEBSボリュームもまとめてamiが作成されるんだなぁ。便利だ。

・容量はこんな感じ。/efsに2つのWordPressサイトデータがのっかっているので意外と/data自体は大きくならなかった。
df -h
Filesystem                                      Size  Used Avail Use% Mounted on
devtmpfs                                        454M     0  454M   0% /dev
tmpfs                                           482M     0  482M   0% /dev/shm
tmpfs                                           482M   13M  469M   3% /run
tmpfs                                           482M     0  482M   0% /sys/fs/cgroup
/dev/nvme0n1p1                                   20G   11G  9.5G  53% /
fs-da1d1dfb.efs.ap-northeast-1.amazonaws.com:/  8.0E  2.1G  8.0E   1% /efs
tmpfs                                            97M     0   97M   0% /run/user/1000
/dev/nvme1n1                                     20G  1.5G   19G   8% /data

宿題

次はいよいよ本番適用。マスターだけ適用し、マスターの複製からスレーブを作成する予定。 → 後日、実施しました。
ボリュームのスナップショットの取り方、スナップショットからの復旧手順も確認しておく。