AWS EBSルートボリュームのサイズを縮小する方法


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

皆さま、こんにちは!協栄情報の陳です。

やりたいこと

EBSはサイズの拡張が容易になりますが、縮小ができません。でも、課金を抑えたいという意図など、どうしてもサイズを小さくしたい場合もあります。
今回は、データ同期を利用して、EBSを30Gから10Gへ縮小します。

環境

OS:RHEL7.9

作業ステップ

同期元としてボリュームの作成

EC2を停止して、ルートボリュームからナップショット[EBS-SNAPSHOT]取得
file

ナップショット[EBS-SNAPSHOT]作成済みことを確認
file

スナップショットから同期元としてボリュームを作成
注意:ボリュームのアベイラビリティーゾーンは必ず対象EC2と一致
file

ボリューム[SNAPSHOT]作成済みことを確認
file

縮小後新ボリュームの作成

今回の縮小対象ボリュームはルートボリュームなので、新ボリュームにディスクパーティションの作成を回避するために、対象EC2と同じのAMIからEC2を新規起動して、ルートボリュームを取得します:
①対象EC2と同じのAMIからEC2を新規起動して、ルートボリュームを10Gに設定します。
②新EC2を作成した後で、停止にして、ルートボリュームをデタッチします。
※新ボリュームを取得するために、新EC2を作成したので、ボリュームを取得できたら、新EC2を削除しても構わないです。

ボリューム[NEW]作成済みことを確認
file

ボリュームのアタッチ

同期元ボリューム[SNAPSHOT]と新ボリューム[NEW]を対象EC2にアタッチします。
file

ボリュームの同期

対象EC2を開始して、SSHでディスクデバイスの状態をみてみます。

file

マウントポイントを作成します。
$ sudo mkdir /mnt/new /mnt/old
同期元と新ボリュームをマウントします。

注意:3つのボリュームは、UUIDが同じですので、"-o nouuid"をつけないとエラーとなります。

$ sudo mount -o nouuid /dev/xvdf2 /mnt/new
$ sudo mount -o nouuid /dev/xvda2 /mnt/old
マウント結果を確認します。

file

新ボリュームを同期元ボリュームと同期します。

rsyncオプション:
-a 転送元のディレクトリを再帰的にオーナー・グループ・パーミッション・タイムスタンプをそのままコピーします。
-x 再帰的に実行された時にファイルシステムの境界を横断しません。
–delete 転送元のディレクトリに存在せず転送先のディレクトリに存在するファイルがあれば削除します。

$ sudo rsync -ax --delete /mnt/old/ /mnt/new/
同期結果を確認します。

file

新ボリュームをアンマウントします。
$ sudo umount /mnt/new

ボリュームの切り替え

EC2を停止して、3つのボリュームを全部デタッチして、10Gの新ボリュームをルートボリュームとしてアタッチします。
注意:ルートデバイス名は必ず"/dev/sda1"とします。
file

結果検証

EC2を開始して、SSHでユーザ名、インストールされたAPPなどを検証します。
file

最後に

この方法は1つのEC2(新ボリューム取得するためのEC2)と2つのEBS(ボリューム[EBS-SIZE-REDUCE]とボリューム[SNAPSHOT])が残っているため、忘れずに、細心な注意を払う、削除してください。それに、新ルートボリュームの「終了時に削除」が"いいえ"になりましたので、気にすれば、スナップショット→AMI→新EC2起動で「終了時に削除」が"はい"に変更できます。

それでは、今回も読んでいただきありがとうございました!!

Last modified: 2024-02-05

Author