AWS CLIでEBSボリュームを拡張する

## 概要
AWS CloudShell から コマンドライン(AWS CLI)で EBS ボリュームサイズを拡張します  

## 環境
- AWS CloudShell
- aws-cli 2.13.7
- Ubuntu 22.04 LTS

## 手順の流れ
1. [EBS ボリュームIDの確認](#1-ebs-ボリュームidの確認)
2. [EBS ボリュームの拡張](#2-ebs-ボリュームの拡張)
3. [進捗状況の確認](#3-進捗状況の確認)
4. [EBS ボリュームのパーティション拡張](#4-ebs-ボリュームのパーティション拡張)
5. [EBS ボリュームのファイルシステム拡張](#5-ebs-ボリュームのファイルシステム拡張)

## 手順
### 1. EBS ボリュームIDの確認
[AWS マネジメントコンソール](https://console.aws.amazon.com/console/)から 
[AWS CloudShell](https://ap-northeast-1.console.aws.amazon.com/cloudshell/) を起動し、 EBS のボリューム ID を取得します

#### コマンド
```shell_session
$ aws ec2 describe-instances --query 'Reservations[*].Instances[*].[InstanceId, State.Name, Tags[?Key==`Name`].Value | [0], BlockDeviceMappings[*].Ebs.VolumeId]' --output text
```

#### 実行結果
```text
# ヘッダーは出力されません
InstanceId           State.Name Tags.Value
-------------------- ---------- ----------
BlockDeviceMappings[*].Ebs.VolumeId
-----------------------------------
i-1234567890abcdef1     running ec2-instance1
vol-1234567890abcdef1 # -> ec2-instance1 に割り当てられたEBSボリュームID
i-1234567890abcdef2     running ec2-instance2
vol-1234567890abcdef2 # -> ec2-instance2 に割り当てられたEBSボリュームID
```

### 2. EBS ボリュームの拡張
EBS ボリュームを拡張します

#### コマンド
```shell_session
$ aws ec2 modify-volume --size 10 --volume-id vol-1234567890abcdef1
# --size 10                         # 拡張後のサイズ(GB)
# --volume-id vol-1234567890abcdef1 # EBSボリュームID
```

#### 実行結果
```shell_session
{
    "VolumeModification": {
        "VolumeId": "vol-1234567890abcdef1",
        "ModificationState": "modifying",
        "TargetSize": 10,
        "TargetIops": 100,
        "TargetVolumeType": "gp2",
        "TargetMultiAttachEnabled": false,
        "OriginalSize": 8,
        "OriginalIops": 100,
        "OriginalVolumeType": "gp2",
        "OriginalMultiAttachEnabled": false,
        "Progress": 0,
        "StartTime": "2023-08-13T18:35:59+00:00"
    }
}
```

### 3. 進捗状況の確認
EBS ボリューム拡張の進捗状況を確認します  
Progress で 進捗状況のパーセンテージを確認できます  
ModificationState が `completed` になるまで待機します  

#### コマンド
```shell_session
$ aws ec2 describe-volumes-modifications --volume-id vol-1234567890abcdef1 --output table
# --volume-id vol-1234567890abcdef1 # EBSボリュームID
# --output table                    # 出力形式
```

#### 実行結果
```shell_session:進行中
---------------------------------------------------------------
|                DescribeVolumesModifications                 |
+-------------------------------------------------------------+
||                   VolumesModifications                    ||
|+-----------------------------+-----------------------------+|
||  ModificationState          |  optimizing                 ||
||  OriginalIops               |  100                        ||
||  OriginalMultiAttachEnabled |  False                      ||
||  OriginalSize               |  8                          ||
||  OriginalVolumeType         |  gp2                        ||
||  Progress                   |  5                          ||
||  StartTime                  |  2023-08-13T18:35:59+00:00  ||
||  TargetIops                 |  100                        ||
||  TargetMultiAttachEnabled   |  False                      ||
||  TargetSize                 |  10                         ||
||  TargetVolumeType           |  gp2                        ||
||  VolumeId                   |  vol-1234567890abcdef1      ||
|+-----------------------------+-----------------------------+|
```

```shell_session:完了
---------------------------------------------------------------
|                DescribeVolumesModifications                 |
+-------------------------------------------------------------+
||                   VolumesModifications                    ||
|+-----------------------------+-----------------------------+|
||  EndTime                    |  2023-08-13T18:41:05+00:00  ||
||  ModificationState          |  completed                  ||
||  OriginalIops               |  100                        ||
||  OriginalMultiAttachEnabled |  False                      ||
||  OriginalSize               |  8                          ||
||  OriginalVolumeType         |  gp2                        ||
||  Progress                   |  100                        ||
||  StartTime                  |  2023-08-13T18:35:59+00:00  ||
||  TargetIops                 |  100                        ||
||  TargetMultiAttachEnabled   |  False                      ||
||  TargetSize                 |  10                         ||
||  TargetVolumeType           |  gp2                        ||
||  VolumeId                   |  vol-1234567890abcdef1      ||
|+-----------------------------+-----------------------------+|
```

### 4. EBS ボリュームのパーティション拡張
EC2 インスタンスにログインし、EBS ボリュームのパーティションを拡張します  
ModificationState が optimizing になると実行可能になります  

#### コマンド
```shell_session
# パーティションのサイズを確認
ubuntu@ip-xx-xx-xx-xx:~$ sudo lsblk
NAME     MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0      7:0    0  24.4M  1 loop /snap/amazon-ssm-agent/6312
loop1      7:1    0  24.8M  1 loop /snap/amazon-ssm-agent/6563
loop2      7:2    0  55.6M  1 loop /snap/core18/2745
loop3      7:3    0  55.7M  1 loop /snap/core18/2785
loop4      7:4    0  63.3M  1 loop /snap/core20/1879
loop5      7:5    0  63.4M  1 loop /snap/core20/1974
loop6      7:6    0 111.9M  1 loop /snap/lxd/24322
loop7      7:7    0  53.2M  1 loop /snap/snapd/19122
loop8      7:8    0  53.3M  1 loop /snap/snapd/19457
xvda     202:0    0    10G  0 disk
├─xvda1  202:1    0   7.9G  0 part / # このパーティションを拡張します
├─xvda14 202:14   0     4M  0 part
└─xvda15 202:15   0   106M  0 part /boot/efi
```

:::note warn
警告
デバイス名 (xvda) とパーティション番号 (1) の間のスペースに注意してください  
:::
```shell_session
# パーティションのサイズを拡張
ubuntu@ip-xx-xx-xx-xx:~$ sudo growpart /dev/xvda 1
CHANGED: partition=1 start=227328 old: size=16549855 end=16777183 new: size=20744159 end=20971487

ubuntu@ip-xx-xx-xx-xx:~$ sudo lsblk
NAME     MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
loop0      7:0    0  24.4M  1 loop /snap/amazon-ssm-agent/6312
loop1      7:1    0  24.8M  1 loop /snap/amazon-ssm-agent/6563
loop2      7:2    0  55.6M  1 loop /snap/core18/2745
loop3      7:3    0  55.7M  1 loop /snap/core18/2785
loop4      7:4    0  63.3M  1 loop /snap/core20/1879
loop5      7:5    0  63.4M  1 loop /snap/core20/1974
loop6      7:6    0 111.9M  1 loop /snap/lxd/24322
loop7      7:7    0  53.2M  1 loop /snap/snapd/19122
loop8      7:8    0  53.3M  1 loop /snap/snapd/19457
xvda     202:0    0    10G  0 disk
├─xvda1  202:1    0   9.9G  0 part / # パーティションが拡張されました
├─xvda14 202:14   0     4M  0 part
└─xvda15 202:15   0   106M  0 part /boot/efi
```

### 5. EBS ボリュームのファイルシステム拡張
EC2 インスタンスにログインし、EBS ボリュームのファイルシステムを拡張します  
ModificationState が optimizing になると実行可能になります  


#### コマンド
```shell_session:拡張前
# 拡張対象の Filesystem、Type、Size、Mounted on を取得
ubuntu@ip-xx-xx-xx-xx:~$ df -hT
Filesystem     Type   Size  Used Avail Use% Mounted on
/dev/root      ext4   7.6G  7.4G  184M  98% /  # このファイルシステムを拡張します
tmpfs          tmpfs  479M     0  479M   0% /dev/shm
tmpfs          tmpfs  192M  836K  191M   1% /run
tmpfs          tmpfs  5.0M     0  5.0M   0% /run/lock
/dev/xvda15    vfat   105M  6.1M   99M   6% /boot/efi
tmpfs          tmpfs   96M  4.0K   96M   1% /run/user/1000
```

```shell_session
# ファイルシステム拡張
# Type が xfs の場合
ubuntu@ip-xx-xx-xx-xx:~$ sudo xfs_growfs -d /

# Type が ext4 の場合
ubuntu@ip-xx-xx-xx-xx:~$ sudo resize2fs /dev/xvda1
```

### 出力結果
```shell_session:拡張後
ubuntu@ip-xx-xx-xx-xx:~$ df -hT
Filesystem     Type   Size  Used Avail Use% Mounted on
/dev/root      ext4   9.6G  7.4G  2.2G  78% /  # ファイルシステムが拡張されました
tmpfs          tmpfs  479M     0  479M   0% /dev/shm
tmpfs          tmpfs  192M  836K  191M   1% /run
tmpfs          tmpfs  5.0M     0  5.0M   0% /run/lock
/dev/xvda15    vfat   105M  6.1M   99M   6% /boot/efi
tmpfs          tmpfs   96M  4.0K   96M   1% /run/user/1000
```

## 参考

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/requesting-ebs-volume-modifications.html

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/monitoring-volume-modifications.html

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html