AMI からインスタンス起動時に手軽にルートサイズも変更しちゃう

7月 22, 2020AmazonLinux_CentOS,AWS,EC2

概要

  • 今まできっとデキルと思っていましたが、実際に変更したのは今回が初めてです…。 今回担当する案件で、適当なディスクサイズでインスタンスを起動して欲しいという依頼があり、EBSに100GiBを指定して起動。案の定、後から300GiBにして欲しいとのこと。
  • 当初、ECS2に割り当てているEBSのボリュームサイズを拡張して、Linux側でパーティションおよびファイルシステムの拡張が必要だと思っておりましたが、ふとAMI を取得して起動し直せばもっと手軽にルートサイズを変えられるのでは?と思いつきました! 今回は、EC2 インスタンスから取得したAMI(マシンイメージ)を使用して、ルートディスクサイズを変更してインスタンスを起動させる方法をご紹介します。
  • 私が現在提供されているAmazon Linux 2 と CentOS 7 で確認した結果、殆どオペレーションなしに拡張ができることが分かりました。Amazon Linux 2 と CentOS 7 で、それぞれ記載します。

 

Amazon Linux 2のルートディスクをサイズ変更する

元のマシンイメージ

  • 元のマシンイメージは、下記ディスク構成(10GiB)となります。


[ec2-user@ip-XX-XX-XX-XX ~]$ uname -a
Linux ip-10-10-0-216.ap-northeast-1.compute.internal 4.14.181-140.257.amzn2.x86_64 #1 SMP Wed May 27 02:17:36 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[ec2-user@ip-XX-XX-XX-XX ~]$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1       259:0    0  10G  0 disk
tqnvme0n1p1   259:1    0  10G  0 part /
mqnvme0n1p128 259:2    0   1M  0 part
[ec2-user@ip-XX-XX-XX-XX ~]$ df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  213M     0  213M   0% /dev
tmpfs          tmpfs     231M     0  231M   0% /dev/shm
tmpfs          tmpfs     231M  384K  231M   1% /run
tmpfs          tmpfs     231M     0  231M   0% /sys/fs/cgroup
/dev/nvme0n1p1 xfs        10G  1.3G  8.8G  13% /
tmpfs          tmpfs      47M     0   47M   0% /run/user/1000

 

EBSのサイズを変更して起動する

  • 現在のインスタンスから、最新のAMI を取得します。
  • AMIからインスタンスを起動する時に、下記の通りEBSのサイズを変更して起動します。10GiB → 20GiB に変更します。

 

Linux起動後の作業

  • OSを起動した結果、Amazon Linux2 の場合、EBSボリュームだけでなく、パーティションおよびファイルシステムまで拡張された状態で起動しました。特にOS起動後のオペレーションは必要ありません。
  • ルートディスクのサイズ変更がこれ程簡単にできるとは驚きですね。

[ec2-user@ip-XX-XX-XX-XX ~]$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1       259:0    0  20G  0 disk
tqnvme0n1p1   259:1    0  20G  0 part /
mqnvme0n1p128 259:2    0   1M  0 part
[ec2-user@ip-XX-XX-XX-XX ~]$ df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  213M     0  213M   0% /dev
tmpfs          tmpfs     231M     0  231M   0% /dev/shm
tmpfs          tmpfs     231M  384K  231M   1% /run
tmpfs          tmpfs     231M     0  231M   0% /sys/fs/cgroup
/dev/nvme0n1p1 xfs        20G  1.3G   19G   7% /
tmpfs          tmpfs      47M     0   47M   0% /run/user/1000

 

CentOS 7 のルートディスクをサイズ変更する

元のマシンイメージ

  • 元のマシンイメージは、下記ディスク構成(10GiB)となります。


[centos@ip-XX-XX-XX-XX ~]$ cat /etc/redhat-release
CentOS Linux release 7.7.1908 (Core)
[centos@ip-XX-XX-XX-XX ~]$ lsblk
NAME        MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1     259:0    0  10G  0 disk
mqnvme0n1p1 259:1    0  10G  0 part /
[centos@ip-10-10-0-107 ~]$ df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  211M     0  211M   0% /dev
tmpfs          tmpfs     234M     0  234M   0% /dev/shm
tmpfs          tmpfs     234M  8.4M  226M   4% /run
tmpfs          tmpfs     234M     0  234M   0% /sys/fs/cgroup
/dev/nvme0n1p1 xfs        10G  904M  9.2G   9% /
tmpfs          tmpfs      47M     0   47M   0% /run/user/1000

 

EBSのサイズを変更して起動する

  • 現在のインスタンスから、最新のAMI を取得します。
  • AMIからインスタンスを起動する時に、下記の通りEBSのサイズを変更して起動します。10GiB → 20GiB に変更します。

 

Linux起動後の作業

  • OSを起動した結果、CentOS 7 の場合も、EBSボリュームだけでなく、パーティションおよびファイルシステムまで拡張された状態で起動しました。特にOS起動後のオペレーションは必要ありません。
  • Amazon Linux2使用時の利点かと思いましたが、CentOS側も同じ結果でした。

[centos@ip-XX-XX-XX-XX ~]$ lsblk
NAME        MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1     259:0    0  20G  0 disk
mqnvme0n1p1 259:1    0  20G  0 part /
[centos@ip-10-10-0-186 ~]$ df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  211M     0  211M   0% /dev
tmpfs          tmpfs     234M     0  234M   0% /dev/shm
tmpfs          tmpfs     234M  8.4M  226M   4% /run
tmpfs          tmpfs     234M     0  234M   0% /sys/fs/cgroup
/dev/nvme0n1p1 xfs        20G  905M   20G   5% /
tmpfs          tmpfs      47M     0   47M   0% /run/user/1000

 

cloud-utils-growpartについて

  • 今回、Amazon Linux2およびCentOS 7 でOS起動時に自動的にパーティションおよびファイルシステムが拡張された動作は、標準でcloud-utils-growpartパッケージがインストールされ、サービスが動作したため拡張が行われた様です。
  • OSにcloud-utils-growpartパッケージが含まれているか否かは、下記コマンドで確認します。

[centos@ip-XX-XX-XX-XX ~]$ yum list installed | grep cloud-utils-growpart
cloud-utils-growpart.noarch                 0.29-5.el7                 installed

 

  • AMIからOS起動時にgrowpartのサービスが動作するか否かは、/etc/cloud/cloud.cfgのcloud_init_modulesセクションで確認可能です。

users:
 - default
disable_root: 1
ssh_pwauth:   0
mount_default_fields: [~, ~, 'auto', 'defaults,nofail,x-systemd.requires=cloud-init.service', '0', '2']
resize_rootfs_tmp: /dev
ssh_deletekeys:   0
ssh_genkeytypes:  ~
syslog_fix_perms: ~
disable_vmware_customization: false
cloud_init_modules:
 - disk_setup
 - migrator
 - bootcmd
 - write-files
 - growpart
 - resizefs
 - set_hostname
 - update_hostname
 - update_etc_hosts
 - rsyslog
 - users-groups
 - ssh
cloud_config_modules:
 - mounts
 - locale
 - set-passwords
 - rh_subscription
 - yum-add-repo
 - package-update-upgrade-install
 - timezone
 - puppet
 - chef
 - salt-minion
 - mcollective
 - disable-ec2-metadata
 - runcmd
cloud_final_modules:
 - rightscale_userdata
 - scripts-per-once
 - scripts-per-boot
 - scripts-per-instance
 - scripts-user
 - ssh-authkey-fingerprints
 - keys-to-console
 - phone-home
 - final-message
 - power-state-change
system_info:
  default_user:
    name: centos
    lock_passwd: true
    gecos: Cloud User
    groups: [wheel, adm, systemd-journal]
    sudo: ["ALL=(ALL) NOPASSWD:ALL"]
    shell: /bin/bash
  distro: rhel
  paths:
    cloud_dir: /var/lib/cloud
    templates_dir: /etc/cloud/templates
  ssh_svcname: sshd
# vim:syntax=yaml

 

  • OS起動時にgrowpartが動作したか否かは、/var/log/cloud-init.logのログファイルで確認が可能です。

[centos@ip-XX-XX-XX-XX ~]$ sudo grep growpart /var/log/cloud-init.log
2020-07-21 15:56:17,968 - stages.py[DEBUG]: Running module growpart (<module 'cloudinit.config.cc_growpart' from '/usr/lib/python2.7/site-packages/cloudinit/config/cc_growpart.pyc'>) with frequency always
2020-07-21 15:56:17,968 - handlers.py[DEBUG]: start: init-network/config-growpart: running config-growpart with frequency always
2020-07-21 15:56:17,968 - helpers.py[DEBUG]: Running config-growpart using lock ()
2020-07-21 15:56:17,969 - cc_growpart.py[DEBUG]: No 'growpart' entry in cfg.  Using default: {'ignore_growroot_disabled': False, 'mode': 'auto', 'devices': ['/']}
2020-07-21 15:56:17,969 - util.py[DEBUG]: Running command ['growpart', '--help'] with allowed return codes [0] (shell=False, capture=True)
2020-07-21 15:56:18,008 - util.py[DEBUG]: Running command ['growpart', '--dry-run', '/dev/nvme0n1', '1'] with allowed return codes [0] (shell=False, capture=True)
2020-07-21 15:56:18,104 - util.py[DEBUG]: Running command ['growpart', '/dev/nvme0n1', '1'] with allowed return codes [0] (shell=False, capture=True)
2020-07-21 15:56:18,208 - cc_growpart.py[INFO]: '/' resized: changed (/dev/nvme0n1, 1) from 10736352768 to 21473771008
2020-07-21 15:56:18,208 - handlers.py[DEBUG]: finish: init-network/config-growpart: SUCCESS: config-growpart ran successfully

 

cloud-utils-growpartを使用しない環境での拡張手順

  • EC2のコンソールからEBSを拡張後、Linuxで下記のオペレーションが必要になります。

パーティションの拡張


[ec2-user ~]$ lsblk
↓ T3などNitro システムで構築されたインスタンスのパーティション
[ec2-user ~]$ sudo growpart /dev/nvme0n1 1
↓ T2 インスタンスのパーティション
[ec2-user ~]$ sudo growpart /dev/xvda 1
[ec2-user ~]$ lsblk

 

ファイルシステムの拡張


↓ ext2、ext3、ext4 ファイルシステムの場合
[ec2-user ~]$ df -h
[ec2-user ~]$ sudo resize2fs /dev/xvda1
[ec2-user ~]$ df -h
↓ XFS ファイルシステムの場合
[ec2-user ~]$ df -h
[ec2-user ~]$ sudo yum install xfsprogs (インストールされていない場合)
[ec2-user ~]$ sudo xfs_growfs -d / ("/"はマウントポイントを指定)
[ec2-user ~]$ df -h

 

  • 詳細は、下記ドキュメントを参照。