はじめに

AWSEC2 インスタンスに EBS ボリュームをアタッチする方法をメモしておく。

ユースケース

  • EC2 インスタンスが 2 台あり、どちらもディスクの容量を上げたくないが、一時ファイルの置き場所(例えばバックアップのファイル)を確保したい。

準備

  • アタッチする EC2インスタンスを 2 台用意
    ※アタッチすることを検証するだけであれば1台で問題ない。
    デタッチして、他の EC2 インスタンスにアタッチすることをしたいので2台でやる。

EC2 インスタンスの作成

2 台のインスタンスを下記のように作成する。
create-ec2-instance-1
create-ec2-instance-2

どちらも下記のような構成

項目設定値
OSAmazonLinux2023
アーキテクチャ64 ビット(Arm)
インスタンスタイプt4g.nano
ストレージ8GB(gp3)

インスタンスを起動する
list-ec2-instance

EBS ボリュームをアタッチする

EBS ボリュームを作成する

メニューから Elastic Block Store -> ボリューム を選択する。
list-ebs-volumes

ボリュームの作成 を押す

下記の構成で作成をする。
create-ebs-volume

項目設定値
ボリュームタイプ汎用 SSD(gp3)
サイズ (GiB)10
アベイラビリティーゾーンap-northeast-1d

※アベイラビリティゾーンをあわせないと、アタッチできないので注意

作成が完了すると、EBS ボリュームは 使用可能 になっている。
list-ebs-volumes-2

EC2インスタンスにログインする

connect-ec2-instance

lsblk コマンドでボリュームを確認する。

1
2
3
4
5
[ec2-user@ip-172-31-38-101 ~]$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme0n1       259:0    0   8G  0 disk 
├─nvme0n1p1   259:1    0   8G  0 part /
└─nvme0n1p128 259:2    0  10M  0 part 

df -hで容量の確認

1
2
3
4
5
6
7
8
9
[ec2-user@ip-172-31-38-101 ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        4.0M     0  4.0M   0% /dev
tmpfs           215M     0  215M   0% /dev/shm
tmpfs            86M  468K   86M   1% /run
/dev/nvme0n1p1  8.0G  1.7G  6.3G  21% /
tmpfs           215M     0  215M   0% /tmp
tmpfs            43M     0   43M   0% /run/user/1000
[ec2-user@ip-172-31-38-101 ~]$ 

ボリュームのアタッチ

EC2 コンソールのメニューから Elastic Block Storeボリューム を選択する。
先ほど作成したボリュームを選択し、「アクション」から「ボリュームのアタッチ」を選択する。 attach-volume-1

インスタンスEC2-test-1 という名前のインスタンスを選択する。
attach-volume-2

attach-volume-3

選択できたら、ボリュームのアタッチ を選択する。

注意
EBSのアベイラビリティゾーンが アタッチしたい EC2インスタンスのアベイラビリティゾーンと異なると、表示されないので注意
fail-attach-volume

アタッチできたら、先ほど作成したボリュームは 使用中 になっている。
list-ebs-volumes-3

EC2インスタンスでボリュームをマウントする

EC2 インスタンスに戻る。

再度 lsblk コマンドを実行する。

1
2
3
4
5
6
[ec2-user@ip-172-31-38-101 ~]$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme0n1       259:0    0   8G  0 disk 
├─nvme0n1p1   259:1    0   8G  0 part /
└─nvme0n1p128 259:2    0  10M  0 part 
nvme1n1       259:3    0  10G  0 disk 

10Gnvme1n1 という名前のボリュームが増えていることを確認

ファイルシステムが作成済みかどうかを確認する。
/dev/nvme1n1 に関しては環境によって異なる可能性がある。 (/dev/[デバイス名])

1
sudo file -s /dev/nvme1n1
1
2
[ec2-user@ip-172-31-38-101 ~]$ sudo file -s /dev/nvme1n1
/dev/nvme1n1: data

今回は、data とでてきたのでファイルシステムは存在していない。
そのためファイルシステムを作成する必要がある。

ext4 のファイルシステムを作成する。

1
sudo mkfs -t ext4 /dev/nvme1n1
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[ec2-user@ip-172-31-38-101 ~]$ sudo mkfs -t ext4 /dev/nvme1n1
mke2fs 1.46.5 (30-Dec-2021)
Creating filesystem with 2621440 4k blocks and 655360 inodes
Filesystem UUID: ae928447-6ec0-4c1a-9571-58b81da7677d
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done 

再度 file コマンドで確認してみる。

1
2
[ec2-user@ip-172-31-38-101 ~]$ sudo file -s /dev/nvme1n1
/dev/nvme1n1: Linux rev 1.0 ext4 filesystem data, UUID=ae928447-6ec0-4c1a-9571-58b81da7677d (extents) (64bit) (large files) (huge files)

ext4 のファイルシステムになっていることを確認

マウント先のディレクトリを作成する。

1
sudo mkdir /ebs

マウントをする

1
sudo mount /dev/nvme1n1 /ebs

df -h で確認してみる。

1
2
3
4
5
6
7
8
9
[ec2-user@ip-172-31-38-101 ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        4.0M     0  4.0M   0% /dev
tmpfs           215M     0  215M   0% /dev/shm
tmpfs            86M  476K   86M   1% /run
/dev/nvme0n1p1  8.0G  1.7G  6.3G  21% /
tmpfs           215M     0  215M   0% /tmp
tmpfs            43M     0   43M   0% /run/user/1000
/dev/nvme1n1    9.8G   24K  9.3G   1% /ebs

/ebs のボリュームがマウントできていることを確認

これでOK!

/ebsにファイルを書き込んで見る。

1
2
3
4
5
sudo su
echo "hogehoge" > /ebs/hoge.txt

cat /ebs/hoge.txt
hogehoge

デタッチして他のEC2インスタンスにアタッチする

ボリュームのデタッチ

先程アタッチした EC2 インスタンスからボリュームをアンマウントしておく。

1
sudo umount /ebs
1
2
3
4
5
6
7
8
9
[ec2-user@ip-172-31-38-101 ~]$ sudo umount /ebs
[ec2-user@ip-172-31-38-101 ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        4.0M     0  4.0M   0% /dev
tmpfs           215M     0  215M   0% /dev/shm
tmpfs            86M  476K   86M   1% /run
/dev/nvme0n1p1  8.0G  1.7G  6.3G  21% /
tmpfs           215M     0  215M   0% /tmp
tmpfs            43M     0   43M   0% /run/user/1000

アンマウントできたら、EC2 コンソールに移動する。

EC2 コンソールのメニューから Elastic Block Storeボリューム を選択する。
先ほど作成したボリュームを選択し、「アクション」から「ボリュームのデタッチ」を選択する。
detach-volume-1
デタッチ」を選択する。
detach-volume-2

アタッチ&マウント

先程と同じ手順で、 EC2-test-2 にボリュームをアタッチする。

lsblk コマンドで確認

1
2
3
4
5
6
[ec2-user@ip-172-31-37-191 ~]$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme0n1       259:0    0   8G  0 disk 
├─nvme0n1p1   259:1    0   8G  0 part /
└─nvme0n1p128 259:2    0  10M  0 part 
nvme1n1       259:3    0  10G  0 disk 

file コマンドで確認 すでにファイルシステムは作成されているはずなので確認する。

1
2
[ec2-user@ip-172-31-37-191 ~]$ sudo file -s /dev/nvme1n1
/dev/nvme1n1: Linux rev 1.0 ext4 filesystem data, UUID=ae928447-6ec0-4c1a-9571-58b81da7677d (extents) (64bit) (large files) (huge files)

マウント先を作成する。

1
sudo mkdir /ebs
1
sudo mount /dev/nvme1n1 /ebs

df -h で確認

1
2
3
4
5
6
7
8
9
[ec2-user@ip-172-31-37-191 ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        4.0M     0  4.0M   0% /dev
tmpfs           215M     0  215M   0% /dev/shm
tmpfs            86M  476K   86M   1% /run
/dev/nvme0n1p1  8.0G  1.7G  6.3G  21% /
tmpfs           215M     0  215M   0% /tmp
tmpfs            43M     0   43M   0% /run/user/1000
/dev/nvme1n1    9.8G   28K  9.3G   1% /ebs

先程別の EC2インスタンスで書き込んだファイルがあるかを確認する。

1
2
3
4
[ec2-user@ip-172-31-37-191 ~]$ ls /ebs
hoge.txt  lost+found
[ec2-user@ip-172-31-37-191 ~]$ sudo cat /ebs/hoge.txt 
hogehoge

あるのでOK!

以上で終わり。

おまけ: 自動マウント

ボリュームを追加でアタッチしたあと、マウントについては再起動時に自動で実施されないので設定をする必要がある。

アンマウントしておく。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[ec2-user@ip-172-31-38-101 ~]$ sudo umount /ebs 
[ec2-user@ip-172-31-38-101 ~]$ df
Filesystem       1K-blocks    Used Available Use% Mounted on
devtmpfs              4096       0      4096   0% /dev
tmpfs               219352       0    219352   0% /dev/shm
tmpfs                87744     480     87264   1% /run
/dev/nvme0n1p1     8311788 1742456   6569332  21% /
tmpfs               219352       0    219352   0% /tmp
tmpfs                43868       0     43868   0% /run/user/1000
/dev/nvme0n1p128     10202    1384      8818  14% /boot/efi

下記を追記する。
/etc/fstab

1
/dev/nvme1n1   /ebs       ext4    defaults,nofail   0   2

マウントする。

1
sudo mount -a
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[ec2-user@ip-172-31-38-101 ~]$ sudo mount -a
[ec2-user@ip-172-31-38-101 ~]$ df -h
Filesystem        Size  Used Avail Use% Mounted on
devtmpfs          4.0M     0  4.0M   0% /dev
tmpfs             215M     0  215M   0% /dev/shm
tmpfs              86M  480K   86M   1% /run
/dev/nvme0n1p1    8.0G  1.7G  6.3G  21% /
tmpfs             215M     0  215M   0% /tmp
tmpfs              43M     0   43M   0% /run/user/1000
/dev/nvme0n1p128   10M  1.4M  8.7M  14% /boot/efi
/dev/nvme1n1      9.8G   28K  9.3G   1% /ebs

念のため、再起動したあともマウントされるかを見てみる。
↑上記で設定も確認も問題ないのだが念のため。

1
sudo reboot
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
Last login: Sat Jun 24 02:15:56 2023 from xxx.xxx.xxx.xxx
[ec2-user@ip-172-31-38-101 ~]$ df -h
Filesystem      Size  Used Avail Use% Mounted on
devtmpfs        4.0M     0  4.0M   0% /dev
tmpfs           215M     0  215M   0% /dev/shm
tmpfs            86M  480K   86M   1% /run
/dev/nvme0n1p1  8.0G  1.7G  6.3G  22% /
tmpfs           215M     0  215M   0% /tmp
/dev/nvme1n1    9.8G   28K  9.3G   1% /ebs
tmpfs            43M     0   43M   0% /run/user/1000

マウントされているのでOK!

参考

おわりに

EBS のボリュームマウントは比較的簡単にできるので忘れないようにメモ書きをした。
基本的に公式のリファレンスに載っているので都度見れば良いのだが、やったことの記録として残しておいた。
他のも一時ファイルを残すのであれば、S3をファイルストレージとしてマウントする(goofys等を使用),EFSを使うなどもの考えられる。 EFS は共有を目的としているので、時と場合によって使い分ける必要があるなと思った。