「EBSのサイズ減らして!」と言われたときにサッと対応する

AWS

「EBSのサイズ減らして!」ってな感じの強めな命令が来たときに、あたふたせずにササーットと対応できるように手順を紹介します。

【関連書籍紹介】AWSのデザインパターンが網羅されていて初心者にオススメ!

  1. システムデータ以外のEBSのサイズを減らす。
    1. 対象の環境
    2. やりたいこと
    3. 実際の手順
      1. 1.縮小先のボリューム「10GB」を新規作成する。
      2. 2.1で作成したボリュームをEC2にアタッチする。
      3. 3.ファイルシステムを作成する対象のボリュームを確認する。(2の作業で追加したボリュームのこと)
      4. 4.追加したボリュームに対してファイルシステムを作成する。
      5. 5.ボリュームをマウントする。
      6. 6.データを同期させる。
      7. 7.縮小前&縮小後のボリュームをアンマウントする。
      8. 8.不要な縮小前のボリュームをデタッチ&削除する。
      9. 9.自動マウントの設定をする。
  2. システムデータのEBSのサイズを減らす。
    1. 対象の環境
      1. EC2インスタンス
      2. EBS
    2. 縮小の流れ
    3. 実際の手順
      1. 1.testインスタンスのボリュームをデタッチして、workインスタンスにアタッチする。
      2. 2.newボリューム(10GB)をworkインスタンスにアタッチする。
      3. 3.newボリュームにパーティションを作成する。
      4. 4.newボリューム(/dev/xvdg)にXFSファイルシステムを作成する。
      5. 5.newボリューム/testボリュームをマウントする。
      6. 6.データを移行する。
      7. 7.fstabを変更する。
      8. 8.grub2を更新する。
      9. 9.newボリューム(/dev/xvdg)をアンマウントする。
      10. 10.newボリューム(/dev/xvdg)をデタッチして、testインスタンスにアタッチする。
      11. 11.testインスタンスを起動する。
  3. まとめ

システムデータ以外のEBSのサイズを減らす。

対象の環境

OSは「AmazonLinux2」。

ディスク構成は以下の通り。(EBSボリュームは2つアタッチしています。)

ディスクマウントポイントサイズ備考
/dev/xvda/10GB
/dev/xvdb/data20GB縮小対象

やりたいこと

/data を「20GB」から「10GB」に減らしたい。

ebs-shrink-image

実際の手順

1.縮小先のボリューム「10GB」を新規作成する。

ebs-shrink-001

どこにもアタッチされていないので、状態が「available」になっている。

2.1で作成したボリュームをEC2にアタッチする。

作成したボリュームを選択して、「アタッチ」を実行する。

ebs-shrink-002

アタッチする対象の「インスタンス」と「デバイス」を入力する。

「インスタンス」:入力欄を選択すると候補が表示されるのでそこから選択することも可能。

「デバイス」:最終的なデバイス名は後の作業で設定するため、ここでは適当で大丈夫。

ebs-shrink-002

アタッチできると、状態が「in-use」に変わる。

ebs-shrink-003

3.ファイルシステムを作成する対象のボリュームを確認する。(2の作業で追加したボリュームのこと)

[root@ip-100-0-1-250 /]# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
└─xvda1 202:1    0   8G  0 part /
xvdb    202:16   0  20G  0 disk /data
xvdf    202:80   0  10G  0 disk        ← これが対象!(マウントされていない、10GBのボリュームが確認できる)
[root@ip-100-0-1-250 /]#

4.追加したボリュームに対してファイルシステムを作成する。

[root@ip-100-0-1-250 /]# mkfs -t xfs /dev/xvdf
meta-data=/dev/xvdf              isize=512    agcount=4, agsize=655360 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=0
data     =                       bsize=4096   blocks=2621440, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@ip-100-0-1-250 /]#

今回はファイルシステムがXFSだったので、オプションに「-t xfs」を付与している。Ext4の場合は「-t ext4」になる。

5.ボリュームをマウントする。


[root@ip-100-0-1-250 /]#
[root@ip-100-0-1-250 /]# mount /dev/xvdf /mnt
[root@ip-100-0-1-250 /]#
[root@ip-100-0-1-250 /]# df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  482M     0  482M   0% /dev
tmpfs          tmpfs     492M     0  492M   0% /dev/shm
tmpfs          tmpfs     492M  408K  492M   1% /run
tmpfs          tmpfs     492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1     xfs       8.0G  1.5G  6.6G  19% /
tmpfs          tmpfs      99M     0   99M   0% /run/user/1000
/dev/xvdb      xfs        20G  153M   20G   1% /data  ←縮小対象のボリューム
/dev/xvdf      xfs        10G   43M   10G   1% /mnt   ←縮小先のボリューム
[root@ip-100-0-1-250 /]#

6.データを同期させる。

今回はrsyncコマンドを使用。

[root@ip-100-0-1-250 /]# rsync -ax /data/ /mnt
[root@ip-100-0-1-250 /]#
[root@ip-100-0-1-250 /]# df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  482M     0  482M   0% /dev
tmpfs          tmpfs     492M     0  492M   0% /dev/shm
tmpfs          tmpfs     492M  408K  492M   1% /run
tmpfs          tmpfs     492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1     xfs       8.0G  1.5G  6.6G  19% /
tmpfs          tmpfs      99M     0   99M   0% /run/user/1000
/dev/xvdb      xfs        20G  153M   20G   1% /data
/dev/xvdf      xfs        10G  144M 9.9G   2% /mnt
[root@ip-100-0-1-250 /]#

rsync -ax [コピー元] [コピー先] の順で指定する。「コピー元」の最後に「/」を入れることで、「コピー元の配下」という意味になる!(逆に「/data」の場合は、コピー完了後「/mnt/data」のようになってしまうので注意)

<rsyncコマンドのオプション解説

-a:コピー元ファイルと同一条件でコピーする。

-x:ファイルシステムを跨いだコピーを禁止する。

7.縮小前&縮小後のボリュームをアンマウントする。

[root@ip-100-0-1-250 /]# umount /data
[root@ip-100-0-1-250 /]# umount /mnt/tmp

8.不要な縮小前のボリュームをデタッチ&削除する。

デタッチを実行する。

ebs-shrink-004

デタッチを確認する。

ebs-shrink-005

デタッチが完了したら、「アクション」→「ボリュームを削除」を実行して、ボリュームを削除する。

9.自動マウントの設定をする。

[ec2-user@ip-100-0-1-250 ~]$ cat /etc/fstab
#
UUID=518d317e-9b1a-43aa-8b7c-850dd3510341     /           xfs    defaults,noatime  1   1
/dev/xvdf                                     /data       xfs    defaults,nofail   0   2 ←追加
[ec2-user@ip-100-0-1-250 ~]$

既存で自動マウントの設定を行っている場合、デバイス名を変えたくない!こともあるかも。その時は、縮小後のボリュームを一度デタッチして、再度アタッチする。この再アタッチの時に入力するデバイス名を以前のものにすることで解消できる。

システムデータのEBSのサイズを減らす。

対象の環境

ebs-shrink-system-data-001

EC2インスタンス

■testインスタンス

縮小元のボリュームを持っているインスタンス。testボリュームはデタッチするため、インスタンスは停止しておく必要がある。

ディスクマウントポイントサイズ備考
/dev/xvda/20GBtestボリューム。このボリュームサイズを10GBに変更したい。

■workインスタンス

データ移行などを行う作業用のインスタンス。作業用のため、最小のインスタンスタイプ、ボリュームサイズで大丈夫!

ディスクマウントポイントサイズ備考
/dev/xvda/8GBworkボリューム。

管理コンソールからは以下のように見えます。

ebs-shrink-ec2

EBS

ebs-shrink-system-data-image

縮小の流れ

縮小の大まかなイメージ。

まず、testボリュームをデタッチし、workインスタンスにアタッチする。次に、新規で作成したnewボリューム(縮小先のボリューム)もworkインスタンスにアタッチする。

ebs-shrink-system-data-002

testボリュームのデータをnewボリュームに移行する。

ebs-shrink-system-data-003

newボリュームをworkインスタンスからデタッチして、testインスタンスにアタッチする。

ebs-shrink-system-data-004

大まかな作業の流れはこんな感じ。実際の手順になると、パーティションを作成したり、UUIDの変更なども必要になってきます。システムデータ以外に比べて、結構面倒。。

実際の手順

1.testインスタンスのボリュームをデタッチして、workインスタンスにアタッチする。

事前にtestインスタンスは停止して置く必要があります!デタッチ/アタッチの手順は「システムデータ以外の縮小」に記載している手順と同じです。

2.newボリューム(10GB)をworkインスタンスにアタッチする。

3.newボリュームにパーティションを作成する。

[root@ip-100-0-1-238 ~]# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
└─xvda1 202:1    0   8G  0 part /
xvdf    202:80   0  20G  0 disk
└─xvdf1 202:81   0  20G  0 part
xvdg    202:96   0  10G  0 disk ←パーティションを作成する対象のボリューム
[root@ip-100-0-1-238 ~]#

newボリューム(/dev/xvdg)に対してパーティションを作成する。

システムボリュームの場合、パーティションを作成しないとボリュームを入れ替えたときに起動しない。

[root@ip-100-0-1-238 ~]# fdisk /dev/xvdg

Welcome to fdisk (util-linux 2.30.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): n ←新しいパーティションを作成する。
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p ←プライマリパーティションとして作成する。
Partition number (1-4, default 1): 1
First sector (2048-20971519, default 2048):<空エンター>
Last sector, +sectors or +size{K,M,G,T,P} (2048-20971519, default 20971519):<空エンター>

Created a new partition 1 of type 'Linux' and of size 10 GiB.

Command (m for help): p ←一旦、設定の確認。
Disk /dev/xvdg: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc7c540f3

Device     Boot Start      End  Sectors Size Id Type
/dev/xvdg1       2048 20971519 20969472  10G 83 Linux

Command (m for help): a ←ブート可能フラグの設定。
Selected partition 1
The bootable flag on partition 1 is enabled now.

Command (m for help): p ←設定の最終確認。
Disk /dev/xvdg: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc7c540f3

Device     Boot Start      End  Sectors Size Id Type
/dev/xvdg1 *     2048 20971519 20969472  10G 83 Linux

Command (m for help): w ←設定の保存。
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

[root@ip-100-0-1-238 ~]#

作成したパーティションを確認する。

[root@ip-100-0-1-238 ~]# fdisk -l
・・・
Disk /dev/xvdg: 10 GiB, 10737418240 bytes, 20971520 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xc7c540f3

Device     Boot Start      End  Sectors Size Id Type
/dev/xvdg1 *     2048 20971519 20969472  10G 83 Linux ←パーティションが作成されている。
[root@ip-100-0-1-238 ~]#
[root@ip-100-0-1-238 ~]#
[root@ip-100-0-1-238 ~]# lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk
└─xvda1 202:1    0   8G  0 part /
xvdf    202:80   0  20G  0 disk
└─xvdf1 202:81   0  20G  0 part
xvdg    202:96   0  10G  0 disk
└─xvdg1 202:97   0  10G  0 part ←パーティションが作成されている。
[root@ip-100-0-1-238 ~]#

4.newボリューム(/dev/xvdg)にXFSファイルシステムを作成する。

今回はXFSファイルシステムを作成する。

[root@ip-100-0-1-238 ~]# mkfs -t xfs /dev/xvdg1
meta-data=/dev/xvdg1             isize=512    agcount=4, agsize=655296 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=0
data     =                       bsize=4096   blocks=2621184, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

ファイルシステムが作成されたことを確認する。

[root@ip-100-0-1-238 ~]# blkid
/dev/xvda1: LABEL="/" UUID="417df3d5-5cb9-4b5e-a1a2-8475fff8efc9" TYPE="xfs" PARTLABEL="Linux" PARTUUID="097807a8-787d-4446-8712-53dabb1f0cc5"
/dev/xvdf1: LABEL="/" UUID="417df3d5-5cb9-4b5e-a1a2-8475fff8efc9" TYPE="xfs" PARTLABEL="Linux" PARTUUID="097807a8-787d-4446-8712-53dabb1f0cc5"
/dev/xvdg1: UUID="09ab9050-7212-44d8-863d-d82ef1bed44f" TYPE="xfs" PARTUUID="c7c540f3-01"
[root@ip-100-0-1-238 ~]#

5.newボリューム/testボリュームをマウントする。

マウントポイントを作成する。

[root@ip-100-0-1-238 ~]# mkdir /mnt/old /mnt/new

newボリューム(/dev/xvdg1)をマウントする。

[root@ip-100-0-1-238 ~]# mount /dev/xvdg1 /mnt/new

testボリューム(/dev/xvdf1)をマウントする。

testボリュームのUUIDがworkインスタンスのルートボリュームのUUIDが被るため、mountコマンドのオプションに「-o nouuid」を付与してマウントする。

[root@ip-100-0-1-238 ~]# mount -o nouuid /dev/xvdf1 /mnt/old

6.データを移行する。

移行前のサイズを確認する。

[root@ip-100-0-1-238 ~]# df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  482M     0  482M   0% /dev
tmpfs          tmpfs     492M     0  492M   0% /dev/shm
tmpfs          tmpfs     492M  424K  492M   1% /run
tmpfs          tmpfs     492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1     xfs       8.0G  1.4G  6.7G  18% /
tmpfs          tmpfs      99M     0   99M   0% /run/user/1000
/dev/xvdf1     xfs        20G  1.4G   19G   7% /mnt/old
/dev/xvdg1     xfs        10G   43M  10G   1% /mnt/new
[root@ip-100-0-1-238 ~]#

データを移行する。今回はrsyncコマンドで実施。

[root@ip-100-0-1-238 ~]# rsync -ax /mnt/old/ /mnt/new
[root@ip-100-0-1-238 ~]#

移行後のサイズを確認する。

[root@ip-100-0-1-238 ~]# df -hT
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  482M     0  482M   0% /dev
tmpfs          tmpfs     492M     0  492M   0% /dev/shm
tmpfs          tmpfs     492M  424K  492M   1% /run
tmpfs          tmpfs     492M     0  492M   0% /sys/fs/cgroup
/dev/xvda1     xfs       8.0G  1.4G  6.7G  18% /
tmpfs          tmpfs      99M     0   99M   0% /run/user/1000
/dev/xvdf1     xfs        20G  1.4G   19G   7% /mnt/old
/dev/xvdg1     xfs        10G  1.5G 8.6G  15% /mnt/new ←無事増えてます。
[root@ip-100-0-1-238 ~]#

7.fstabを変更する。

データを移行した段階では、testボリュームのUUIDが残っている。このままだと、testインスタンスでは起動しないため、newボリュームのUUIDに変更する必要がある。

[root@ip-100-0-1-238 ~]# cat /mnt/new/etc/fstab
#
UUID=417df3d5-5cb9-4b5e-a1a2-8475fff8efc9     /           xfs    defaults,noatime  1   1 ←変更前
[root@ip-100-0-1-238 ~]#
[root@ip-100-0-1-238 ~]# vi /mnt/new/etc/fstab
[root@ip-100-0-1-238 ~]#
[root@ip-100-0-1-238 ~]#
[root@ip-100-0-1-238 ~]# cat /mnt/new/etc/fstab
#
UUID=09ab9050-7212-44d8-863d-d82ef1bed44f     /           xfs    defaults,noatime  1   1 ←変更後
[root@ip-100-0-1-238 ~]#

8.grub2を更新する。

grubを再設定するため、chrootを実行する。chroot実行時にproc、sys、devにアクセスできるように追加でマウントする。

[root@ip-100-0-1-238 ~]# mount -t proc /proc /mnt/new/proc
[root@ip-100-0-1-238 ~]# mount -t sysfs /sys /mnt/new/sys
[root@ip-100-0-1-238 ~]# mount --bind /dev /mnt/new/dev
[root@ip-100-0-1-238 ~]# chroot /mnt/new/
[root@ip-100-0-1-238 /]#

grub.cfgを作成する。

[root@ip-100-0-1-238 /]# grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.14.219-164.354.amzn2.x86_64
Found initrd image: /boot/initramfs-4.14.219-164.354.amzn2.x86_64.img
done
[root@ip-100-0-1-238 /]#

念の為、UUIDがnewボリュームの値になっているか確認する。

[root@ip-100-0-1-238 /]# cat /boot/grub2/grub.cfg | grep UUID
	linux16 /boot/vmlinuz-4.14.219-164.354.amzn2.x86_64 root=UUID=42ce3259-ff63-43db-8509-88f7b05bb0f0 ro  console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0
		linux16 /boot/vmlinuz-4.14.219-164.354.amzn2.x86_64 root=UUID=42ce3259-ff63-43db-8509-88f7b05bb0f0 ro  console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 nvme_core.io_timeout=4294967295 rd.emergency=poweroff rd.shell=0
[root@ip-100-0-1-238 /]#

grubをインストールする。

[root@ip-100-0-1-238 /]# grub2-install /dev/xvdg
Installing for i386-pc platform.
Installation finished. No error reported.
[root@ip-100-0-1-238 /]#

grubのインストールも完了したので、chrootを抜ける。

[root@ip-100-0-1-238 /]# exit
exit
[root@ip-100-0-1-238 ~]#

9.newボリューム(/dev/xvdg)をアンマウントする。

[root@ip-100-0-1-238 ~]# umount /mnt/new/proc /mnt/new/sys /mnt/new/dev ←追加でマウントしたものからアンマウントする。
[root@ip-100-0-1-238 ~]# umount /mnt/new
[root@ip-100-0-1-238 ~]#

10.newボリューム(/dev/xvdg)をデタッチして、testインスタンスにアタッチする。

testインスタンスにアタッチする時、デバイス名は「/dev/xvda」を入力すること。

11.testインスタンスを起動する。

SSHでログインできるはず!

まとめ

EBS縮小を「システムデータ以外」と「システムデータ」の2パターンのやり方を紹介しました。結構面倒なので、なるべく縮小させるのは避けたいところ。。

まぁ、とは言ってもやらねばならぬ時もあると思うので、そんな時に参考にして頂けたら。

コメント

タイトルとURLをコピーしました