AWS EC2でインスタンスに複数のEBSボリュームをアタッチする

# AWS EC2でインスタンスに複数のEBSボリュームをアタッチする


EC2インスタンスは、仮想マシンの資料するファイルストレージにEBSという仮想ディスクを使用.
柔軟に容量を追加したり、別のディスク(ボリューム)を追加したりできる. 

すでに仮想マシンにアタッチ済みボリュームを格納することも可能だが、一時的に容量を追加したい時、格納するデータによって
ディスクを切り分けたい場合など、後から別のEBSボリュームをアタッチするのが割と役立つ. 

AWS公式ドキュメント [EBSマルチアタッチ](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-volumes-multi.html)

## 想定読者

- すでにAWS EC2インスタンスを起動・接続している
- EC2にS3ではなくディスク容量を追加したい方(機械学習など、大容量データを少しずつs3から持ってくると、実装面や速度面でネックとなるのでインスタンスのストレージで完結させたい方)


### ローカルストレージの容量確認
dfコマンドで確認できる. -hで容量の安易をいい感じにしてくれる

```bash
df -h
```

```bash
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        31G   12G   20G  39% /
tmpfs           7.9G     0  7.9G   0% /dev/shm
tmpfs           3.2G  840K  3.2G   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/xvda15     105M  6.1M   99M   6% /boot/efi
tmpfs           1.6G  4.0K  1.6G   1% /run/user/1000
```

ここではインスタンス作成時にEBSを32GBで作成していたため、空き容量は
`/dev/root        31G   12G   20G  39% /`に記載のある通り、32G中う12GBを使用し残り20GB.

20GBもあれば大抵のことは可能だが、大きいデータを作業インスタンスから直接読み込みたい場合など、dist容量を追加で
呼び出したい時がある. 

## EBS ボリュームの作成

AWSからEC2を選択し、左側のメニューからボリュームを選択. 選択すると右上にボリュームの作成というボタンが表示されるので選択.

![スクリーンショット 2023-02-15 1.20.39（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1154503/89ac1d71-27b7-dc16-532a-152f2d579614.png)

ボリュームタイプ、サイズ、アベイラビリティーゾーンを選択. 
ボリュームタイプは汎用SSD(gp2かgp3)を選択しておけば良く、サイズは必要な容量を設定.
参考までに[EBS料金](https://aws.amazon.com/jp/ebs/pricing/)で作成するボリュームのリージョンを見れば値段がわかる. 


![スクリーンショット 2023-02-15 1.21.00（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1154503/2d7b7146-6eb3-794d-ce98-f4859ccab2f3.png)

作成したら作成したボリュームを一覧画面から選択し、アクションからボリュームのアタッチを選択. 
ここでは、サンプルとして、5GBのものを選択しているが、実際には先ほぼ作成したものを選べば良い. 
![スクリーンショット 2023-02-15 1.33.29（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1154503/d43bc125-8429-e971-64e3-667aa40599cc.png)

設定したら、作成したボリュームをアタッチしたいインスタンスを設定. 

ここで要注意なのが、アタッチするためにはインスタンスとEBSボリュームがリージョンだけでなく、アベイラビリティーゾーンまで一致している必要がある.
インスタンスを設定したら[ボリュームをアタッチ]ボタンを押す. 

![スクリーンショット 2023-02-15 1.33.38（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1154503/988b8fe6-004c-720d-d412-ff075b9d6f23.png)

アタッチしたらEC2のインスタンスから、ボリュームをアタッチしたインスタンスを選択して、
インスタンス情報の画面から中央下部のストレージを選択。

ボリューム一覧が表示されているので、先ほどアタッチしたボリュームが表示されていることを確認. 
下記画像では、デバイス名 

![スクリーンショット 2023-02-15 1.48.41（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1154503/6cfeafca-3a8b-ec03-7817-6c58653da4c6.png)

## アタッチしたボリュームを使用できるようにする

インスタンスに接続して、`df -h`を実行
この段階ではまだアタッチしたボリュームは使用できない

```bash
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        31G   12G   20G  39% /
tmpfs           7.9G     0  7.9G   0% /dev/shm
tmpfs           3.2G  840K  3.2G   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/xvda15     105M  6.1M   99M   6% /boot/efi
tmpfs           1.6G  4.0K  1.6G   1% /run/user/1000
```

### lsblkコマンドでアタッチされたデバイスの確認
一番下の、`xvdf`に50GB(先ほぼアタッチしたボリューム)が存在するが、まだ利用できない状態. 

ここで、`xvdf`はデバイス名で、都度変わることがあるので、後の作業は全てこのデバイス名の箇所を適宜
実行環境のものに置き換える必要あり. 
(基本はxvdf.)

`xvdf`は`/dev/xvdf`に格納されているはず.

```bash
$ 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  55.6M  1 loop /snap/core18/2679
loop2      7:2    0  63.3M  1 loop /snap/core20/1778
loop3      7:3    0  63.3M  1 loop /snap/core20/1822
loop4      7:4    0 111.9M  1 loop /snap/lxd/24322
loop5      7:5    0  49.8M  1 loop /snap/snapd/17950
xvda     202:0    0    32G  0 disk 
├─xvda1  202:1    0  31.9G  0 part /
├─xvda14 202:14   0     4M  0 part 
└─xvda15 202:15   0   106M  0 part /boot/efi
xvdf     202:80   0    50G  0 disk 
```

`sudo file -s /dev/xvdf`を実行する

```bash
$ sudo file -s /dev/xvdf
/dev/xvdf: data
```


ここでまだ、`/dev/xvdf: data`とだけ表示されるはず. ここで、`GI XFS filesystem data (blksz 4096, inosz 512, v2 dirs)`のような出力がされた場合、次の`mkfs -t`コマンドはスキップ.

`mkfs -t` コマンドを使用し、そのボリューム上にファイルシステムを作成します。

```bash
$ sudo mkfs -t xfs /dev/xvdf
meta-data=/dev/xvdf              isize=512    agcount=4, agsize=3276800 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=0 inobtcount=0
data     =                       bsize=4096   blocks=13107200, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=6400, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
```

これでボリューム上にファイルシステムが作成されたので、適用な階層にマウントする

```bash
$ sudo mkdir /data
$ sudo mount /dev/xvdf /data
```

これでボリュームがマウントされたことが確認できる

```bash
$ 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  55.6M  1 loop /snap/core18/2679
loop2      7:2    0  63.3M  1 loop /snap/core20/1778
loop3      7:3    0  63.3M  1 loop /snap/core20/1822
loop4      7:4    0 111.9M  1 loop /snap/lxd/24322
loop5      7:5    0  49.8M  1 loop /snap/snapd/17950
xvda     202:0    0    32G  0 disk 
├─xvda1  202:1    0  31.9G  0 part /
├─xvda14 202:14   0     4M  0 part 
└─xvda15 202:15   0   106M  0 part /boot/efi
xvdf     202:80   0    50G  0 disk /data
```

一番下の`xvdf     202:80   0    50G  0 disk /data`で先ほどとは異なり、
`/data`へのマウントができている.

最後にストレージ容量を再度確認.  

`/dev/xvdf        50G  390M   50G   1% /data`が追加されている. 

```bash
$ df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root        31G   12G   20G  39% /
tmpfs           7.9G     0  7.9G   0% /dev/shm
tmpfs           3.2G  840K  3.2G   1% /run
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/xvda15     105M  6.1M   99M   6% /boot/efi
tmpfs           1.6G  4.0K  1.6G   1% /run/user/1000
/dev/xvdf        50G  390M   50G   1% /data
```

これでインスタンスに後からボリュームを追加できた.