AWS EC2のインスタンスストレージの揮発性を確認してみた

# はじめに
2024年12月からI7ieインスタンスが提供開始されています。

EC2 I7ieインスタンスはストレージ最適化インスタンスの1つであり、インスタンスストレージ（インスタンスストア）としてNitroSSDを有しています。
インスタンスストアであるゆえに、このSSDに保存したデータはインスタンスを停止するとデータが消失します。

今回、Linuxのインスタンスにて、データが消失する際の挙動を確認してみたので、参考としてメモします。
また、EC2インスタンス内からみて、どのデバイスがインスタンスストレージまたはEBSであるかを確認する方法も残しています。

いずれも基本的な操作、確認手順ですし、すでに同様の記事もあるかと思いますが、実施した一例として、どなたかの参考になれば幸いです。

## 結論
- インスタンスストレージのデータは、個々のファイルが消えるだけでなく、ファイルシステムごと消える！
- EC2内のデバイスについて、インスタンスストレージとEBSの特定は、nvmeコマンドで確認可能

## I7ieインスタンスとは
詳細は以下を参照ください。
- [提供を開始: ストレージ最適化 Amazon EC2 I7ie インスタンス](https://aws.amazon.com/jp/blogs/news/now-available-storage-optimized-amazon-ec2-i7ie-instances/)
- [Amazon EC2 I7ie インスタンス](https://aws.amazon.com/jp/ec2/instance-types/i7ie/)
    > Amazon Elastic Compute Cloud (EC2) I7ie インスタンスは、最大 120 TB のローカル NVMe ストレージを提供する第 3 世代 AWS Nitro SSD を搭載しています。I7ie インスタンスは、クラウドで最高のローカル NVMe ストレージ密度を提供します

インスタンスサイズは i7ie.large(vCPU 2, Memory 16GiB, InstanceStorage 1,250GB) からi7ie.48xlarge(vCPU 192, Memory 1,536GiB,InstanceStorage 120,000GB )まであります。

### Nitro SSDについて
関連して、AWS Nitro SSDについては、以下を参照ください
- [AWS Nitro SSD – I/O 集約型アプリケーション向けのハイパフォーマンスストレージ](https://aws.amazon.com/jp/blogs/news/aws-nitro-ssd-high-performance-storage-for-your-i-o-intensive-applications/)
- [Amazon EBS ボリュームと NVMe](https://docs.aws.amazon.com/ja_jp/ebs/latest/userguide/nvme-ebs-volumes.html)
- [EC2 インスタンスの SSD インスタンスストアボリューム](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ssd-instance-store.html)

## 環境
インスタンスは以下の通り。
- インスタンスタイプ: i7ie.large
- AMI: al2023-ami-2023.6.20250303.0-kernel-6.1-x86_64
- OS: Amaazon Linux 2023

ストレージについては以下の通り。
- EC2インスタンスのルートデバイス(EBS)のサイズ: 8GB (EC2インスタンス作成時に指定)
- インスタンスストレージのサイズ：1,250GB（largeなので）

## 準備

### 起動直後の状態
以下の手順に沿って、EC2インスタンスのストレージの様子を見ていきます。

https://docs.aws.amazon.com/ja_jp/ebs/latest/userguide/ebs-using-volumes.html

lsblkコマンドでみると、ルートデバイスの`nvme0n1`の8GBは、マウントされていますが、インスタンスストレージの`nvme1n1`の1.1TB（≒1,250GB）はマウントされていません。
```bash
[ec2-user@ip-10-0-138-182 ~]$ lsblk
NAME          MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
nvme1n1       259:0    0  1.1T  0 disk 
nvme0n1       259:1    0    8G  0 disk 
├─nvme0n1p1   259:2    0    8G  0 part /
├─nvme0n1p127 259:3    0    1M  0 part 
└─nvme0n1p128 259:4    0   10M  0 part /boot/efi
[ec2-user@ip-10-0-138-182 ~]$ 
```

fileコマンド、lsblkコマンドでみても、まだファイルシステムが存在していないことが確認できます。
```bash
[ec2-user@ip-10-0-138-182 ~]$ sudo file -s /dev/nvme1n1 
/dev/nvme1n1: data
[ec2-user@ip-10-0-138-182 ~]$ 
[ec2-user@ip-10-0-138-182 ~]$ sudo lsblk -f
NAME          FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
nvme1n1                                                                              
nvme0n1                                                                              
├─nvme0n1p1   xfs          /     f3225129-f7e3-4da4-90f7-5035c457993d    6.4G    20% /
├─nvme0n1p127                                                                        
└─nvme0n1p128 vfat   FAT16       9AA3-6C3B                               8.7M    13% /boot/efi
[ec2-user@ip-10-0-138-182 ~]$ 
```

### ファイルシステムの作成
xfsでファイルシステムを作成します
```bash
[ec2-user@ip-10-0-138-182 ~]$ sudo mkfs -t xfs /dev/nvme1n1 
meta-data=/dev/nvme1n1           isize=512    agcount=4, agsize=76293946 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=1 inobtcount=1
data     =                       bsize=4096   blocks=305175781, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=149011, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
Discarding blocks...Done.
[ec2-user@ip-10-0-138-182 ~]$ 
```
以下の通り、lsblkコマンドおよびblkidコマンドの結果から、`nvme1n1`がxfsでファイルシステムを作成できていることが確認できました。
```bash
[ec2-user@ip-10-0-138-182 ~]$ sudo lsblk -f
NAME          FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
nvme1n1       xfs                3eb024c4-3288-4535-91cf-4bee232af40f    1.1T     1% /data
nvme0n1                                                                              
├─nvme0n1p1   xfs          /     f3225129-f7e3-4da4-90f7-5035c457993d    6.4G    20% /
├─nvme0n1p127                                                                        
└─nvme0n1p128 vfat   FAT16       9AA3-6C3B                               8.7M    13% /boot/efi
[ec2-user@ip-10-0-138-182 ~]$ 
[ec2-user@ip-10-0-138-182 ~]$ sudo blkid
/dev/nvme0n1p1: LABEL="/" UUID="f3225129-f7e3-4da4-90f7-5035c457993d" BLOCK_SIZE="4096" TYPE="xfs" PARTLABEL="Linux" PARTUUID="7198aae6-3d36-4761-a593-b74880056701"
/dev/nvme0n1p128: SEC_TYPE="msdos" UUID="9AA3-6C3B" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="32beaf50-f049-4a2e-9404-fb52dce87853"
/dev/nvme0n1p127: PARTLABEL="BIOS Boot Partition" PARTUUID="f21c4b92-7bdc-4d4e-be64-fdb0cedf3e5a"
/dev/nvme1n1: UUID="3eb024c4-3288-4535-91cf-4bee232af40f" BLOCK_SIZE="512" TYPE="xfs"
[ec2-user@ip-10-0-138-182 ~]$ 
```

### インスタンスストレージ上にファイルを作成
インスタンスストレージをマウントします。
```bash
[ec2-user@ip-10-0-138-182 ~]$ sudo mkdir /data
[ec2-user@ip-10-0-138-182 ~]$ sudo mount /dev/nvme1n1 /data/
[ec2-user@ip-10-0-138-182 ~]$ 
[ec2-user@ip-10-0-138-182 ~]$ df -h
Filesystem        Size  Used Avail Use% Mounted on
devtmpfs          4.0M     0  4.0M   0% /dev
tmpfs             7.7G     0  7.7G   0% /dev/shm
tmpfs             3.1G  620K  3.1G   1% /run
/dev/nvme0n1p1    8.0G  1.6G  6.4G  20% /
tmpfs             7.7G     0  7.7G   0% /tmp
/dev/nvme0n1p128   10M  1.3M  8.7M  13% /boot/efi
tmpfs             1.6G     0  1.6G   0% /run/user/1000
/dev/nvme1n1      1.2T  8.2G  1.2T   1% /data
[ec2-user@ip-10-0-138-182 ~]$ 
```
適当なファイルを置きます。
```bash
[ec2-user@ip-10-0-138-182 ~]$ cd /data
[ec2-user@ip-10-0-138-182 data]$ for i in {1..9}; do   sudo  dd if=/dev/zero of=/data/file$i bs=1M count=1; done
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.000597692 s, 1.8 GB/s
（中略）
1+0 records in
1+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 0.000531044 s, 2.0 GB/s
[ec2-user@ip-10-0-138-182 data]$ ls /data
file1  file2  file3  file4  file5  file6  file7  file8  file9
[ec2-user@ip-10-0-138-182 data]$ ls -l /data
total 9216
-rw-r--r--. 1 root root 1048576 Mar 20 13:41 file1
-rw-r--r--. 1 root root 1048576 Mar 20 13:41 file2
-rw-r--r--. 1 root root 1048576 Mar 20 13:41 file3
-rw-r--r--. 1 root root 1048576 Mar 20 13:41 file4
-rw-r--r--. 1 root root 1048576 Mar 20 13:41 file5
-rw-r--r--. 1 root root 1048576 Mar 20 13:41 file6
-rw-r--r--. 1 root root 1048576 Mar 20 13:41 file7
-rw-r--r--. 1 root root 1048576 Mar 20 13:41 file8
-rw-r--r--. 1 root root 1048576 Mar 20 13:41 file9
[ec2-user@ip-10-0-138-182 data]$ 
[ec2-user@ip-10-0-138-182 data]$ du -h /data
9.0M    /data
[ec2-user@ip-10-0-138-182 data]$ 
```

これで準備はできました。

## インスタンス再起動した場合のストレージ
まずはインスタンスを再起動してみます。
以下、再起動直後の状態です。
fstabの設定をしていなかったので、マウントが外れていますが、再度マウントすればファイルは見れます。
```bash
[ec2-user@ip-10-0-138-182 ~]$ sudo lsblk -f
NAME          FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
nvme0n1                                                                              
├─nvme0n1p1   xfs          /     f3225129-f7e3-4da4-90f7-5035c457993d    6.4G    20% /
├─nvme0n1p127                                                                        
└─nvme0n1p128 vfat   FAT16       9AA3-6C3B                               8.7M    13% /boot/efi
nvme1n1       xfs                3eb024c4-3288-4535-91cf-4bee232af40f                
[ec2-user@ip-10-0-138-182 ~]$ 
[ec2-user@ip-10-0-138-182 ~]$ mount | grep data
[ec2-user@ip-10-0-138-182 ~]$ 
[ec2-user@ip-10-0-138-182 ~]$ ls /data
[ec2-user@ip-10-0-138-182 ~]$ 
[ec2-user@ip-10-0-138-182 ~]$ 
[ec2-user@ip-10-0-138-182 ~]$ 
[ec2-user@ip-10-0-138-182 ~]$ sudo mount /dev/nvme1n1 /data/
[ec2-user@ip-10-0-138-182 ~]$ mount | grep data
/dev/nvme1n1 on /data type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)
[ec2-user@ip-10-0-138-182 ~]$ ls /data
file1  file2  file3  file4  file5  file6  file7  file8  file9
[ec2-user@ip-10-0-138-182 ~]$ ls -l /data
total 9216
-rw-r--r--. 1 root root 1048576 Mar 20 13:41 file1
-rw-r--r--. 1 root root 1048576 Mar 20 13:41 file2
-rw-r--r--. 1 root root 1048576 Mar 20 13:41 file3
-rw-r--r--. 1 root root 1048576 Mar 20 13:41 file4
-rw-r--r--. 1 root root 1048576 Mar 20 13:41 file5
-rw-r--r--. 1 root root 1048576 Mar 20 13:41 file6
-rw-r--r--. 1 root root 1048576 Mar 20 13:41 file7
-rw-r--r--. 1 root root 1048576 Mar 20 13:41 file8
-rw-r--r--. 1 root root 1048576 Mar 20 13:41 file9
[ec2-user@ip-10-0-138-182 ~]$ 

[ec2-user@ip-10-0-138-182 ~]$ sudo lsblk -f
NAME          FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
nvme1n1       xfs                3eb024c4-3288-4535-91cf-4bee232af40f    1.1T     1% /data
nvme0n1                                                                              
├─nvme0n1p1   xfs          /     f3225129-f7e3-4da4-90f7-5035c457993d    6.4G    20% /
├─nvme0n1p127                                                                        
└─nvme0n1p128 vfat   FAT16       9AA3-6C3B                               8.7M    13% /boot/efi
[ec2-user@ip-10-0-138-182 ~]$ 
```

## インスタンスを停止したあとに、起動した場合のストレージ
マネジメントコンソールで、インスタンスを停止＆起動しました（not 再起動）。
lsblkコマンドや、fileコマンド、blkidコマンドの結果から、**xfsで作成していたファイルシステムごとなくなっています！データは消失し、完全に初期状態に戻っています！**

```bash

[ec2-user@ip-10-0-138-182 ~]$ lsblk -f
NAME          FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
nvme0n1                                                                              
├─nvme0n1p1   xfs          /     f3225129-f7e3-4da4-90f7-5035c457993d    6.4G    20% /
├─nvme0n1p127                                                                        
└─nvme0n1p128 vfat   FAT16       9AA3-6C3B                               8.7M    13% /boot/efi
nvme1n1                                                                              
[ec2-user@ip-10-0-138-182 ~]$ 
[ec2-user@ip-10-0-138-182 ~]$ sudo file -s /dev/nvme1n1 
/dev/nvme1n1: data
[ec2-user@ip-10-0-138-182 ~]$ 
[ec2-user@ip-10-0-138-182 ~]$ sudo blkid 
/dev/nvme0n1p1: LABEL="/" UUID="f3225129-f7e3-4da4-90f7-5035c457993d" BLOCK_SIZE="4096" TYPE="xfs" PARTLABEL="Linux" PARTUUID="7198aae6-3d36-4761-a593-b74880056701"
/dev/nvme0n1p128: SEC_TYPE="msdos" UUID="9AA3-6C3B" BLOCK_SIZE="512" TYPE="vfat" PARTLABEL="EFI System Partition" PARTUUID="32beaf50-f049-4a2e-9404-fb52dce87853"
/dev/nvme0n1p127: PARTLABEL="BIOS Boot Partition" PARTUUID="f21c4b92-7bdc-4d4e-be64-fdb0cedf3e5a"
[ec2-user@ip-10-0-138-182 ~]$ 
```


なお、ホームディレクトリ配下など、ルートデバイスに作成したデータは、停止＆再起動をしても残っています。EBSなので当然ですね。


## インスタンスストレージとEBSボリュームの確認方法
EC2インスタンスの内部から見ると、`/dev/nvme0n1`や`/dev/nvme1n1`など複数のデバイスがあります。そのため、そもそも、どれがインスタンスストレージなのか、どれがEBSボリュームなのかを確認したくなります。
その場合は、以下のre:Postの記事が参考になります

https://repost.aws/ja/knowledge-center/ec2-linux-instance-store-volumes


以下、今回の環境でやってみた結果です。

### nvme-cliのインストール
まずは、nvme-cliをインストールします。
```bash
[ec2-user@ip-10-0-138-182 ~]$ sudo yum search nvme-cli
Last metadata expiration check: 2:21:20 ago on Thu Mar 20 12:20:41 2025.
========================================================================================= Name Exactly Matched: nvme-cli ==========================================================================================
nvme-cli.x86_64 : NVMe management command line interface
[ec2-user@ip-10-0-138-182 ~]$ sudo yum install nvme-cli
Last metadata expiration check: 2:21:27 ago on Thu Mar 20 12:20:41 2025.
Dependencies resolved.
===================================================================================================================================================================================================================
 Package                                        Architecture                                 Version                                                       Repository                                         Size
===================================================================================================================================================================================================================
Installing:
 nvme-cli                                       x86_64                                       1.11.1-3.amzn2023.0.5                                         amazonlinux                                       360 k

Transaction Summary
===================================================================================================================================================================================================================
Install  1 Package

Total download size: 360 k
Installed size: 699 k
Is this ok [y/N]: y
Downloading Packages:
nvme-cli-1.11.1-3.amzn2023.0.5.x86_64.rpm                                                                                                                                          3.6 MB/s | 360 kB     00:00    
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Total                                                                                                                                                                              2.4 MB/s | 360 kB     00:00     
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                                                                                                                                                           1/1 
  Installing       : nvme-cli-1.11.1-3.amzn2023.0.5.x86_64                                                                                                                                                     1/1 
  Running scriptlet: nvme-cli-1.11.1-3.amzn2023.0.5.x86_64                                                                                                                                                     1/1 
  Verifying        : nvme-cli-1.11.1-3.amzn2023.0.5.x86_64                                                                                                                                                     1/1 

Installed:
  nvme-cli-1.11.1-3.amzn2023.0.5.x86_64                                                                                                                                                                            

Complete!
[ec2-user@ip-10-0-138-182 ~]$ 
```

### nvmeコマンドで確認
以下の通り、nvmeコマンドの結果から、`/dev/nvme0n1`がEBS、`/dev/nvme1n1`がインスタンスストレージとわかります。
```bash
[ec2-user@ip-10-0-138-182 ~]$ sudo nvme list
Node             SN                   Model                                    Namespace Usage                      Format           FW Rev  
---------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- --------
/dev/nvme0n1     vol002c7efadda3318d8 Amazon Elastic Block Store               1           8.59  GB /   8.59  GB    512   B +  0 B   2.0     
/dev/nvme1n1     AWSE98939B6A2F33355E Amazon EC2 NVMe Instance Storage         1           1.25  TB /   1.25  TB    512   B +  0 B   0
[ec2-user@ip-10-0-138-182 ~]$ 
```


### デバイス名とボリュームIDの紐づけ確認
EBSの場合、nvmeコマンドのSNの列に、EBSのVolumeIDが表示されています。
今回の例では、`vol002c7efadda3318d8`が、EC2のルートボリュームのEBSでした。

このVolumeIDは、マネジメントコンソールからも確認できますし、CloudShellだと例えば以下のように確認できます。
EC2インスタンス`i-0c145c8826c01d5d5`に、ボリューム`vol-002c7efadda3318d8`がアタッチされており、デバイス名は`/dev/xvda`であることが確認できます。
（`/dev/xvda`は`/dev/nvme0n1`へのシンボリックリンクになっていました。）

```bash
~ $ aws ec2 describe-instances --output=table --query 'Reservations[].Instances[].{InstanceId: InstanceId, State: State.Name, RootDeviceName: RootDeviceName, RootDeviceType: RootDeviceType, InstanceType: InstanceType, BlockDeviceMappings: BlockDeviceMappings[].{EbsVolumeId:Ebs.VolumeId,DeviceName:DeviceName}}'
----------------------------------------------------------------------------------------
|                                   DescribeInstances                                  |
+----------------------+---------------+-----------------+-----------------+-----------+
|      InstanceId      | InstanceType  | RootDeviceName  | RootDeviceType  |   State   |
+----------------------+---------------+-----------------+-----------------+-----------+
|  i-0c145c8826c01d5d5 |  i7ie.large   |  /dev/xvda      |  ebs            |  running  |
+----------------------+---------------+-----------------+-----------------+-----------+
||                                 BlockDeviceMappings                                ||
|+-----------------------------+------------------------------------------------------+|
||         DeviceName          |                     EbsVolumeId                      ||
|+-----------------------------+------------------------------------------------------+|
||  /dev/xvda                  |  vol-002c7efadda3318d8                               ||
|+-----------------------------+------------------------------------------------------+|
~ $ 
```


## おわりに
EC2 I7ieインスタンスを例に、インスタンスストレージとEBSボリュームとで、データが保持される様子を確認してきました。他のインスタンスタイプでも、同様かと思います。

この記事がどなたかの参考になれば幸いです。