Amazon EBS でボリュームを追加・拡張し、スナップショットを取る
記事の「実践」を 1 項目ずつ進めるためのページです。AWS マネジメントコンソールで操作したら、右の一覧にチェックを入れてください。チェックはこのブラウザに保存されます。
前提条件
- リージョン:
ap-northeast-1(東京) - AWS マネジメントコンソールにログイン済みであること
- 以下のリソースが作成済みであること
| リソース種別 | リソース名 | 内容 |
|---|---|---|
| VPC | ebs-vpc | 10.0.0.0/16 |
| サブネット | ebs-public-subnet | 10.0.1.0/24(ap-northeast-1a、インターネットゲートウェイ経由で外部に出られる) |
| EC2 インスタンス | ebs-server | Amazon Linux 2023 / t3.micro / ap-northeast-1a。AmazonSSMManagedInstanceCore を含む IAM インスタンスプロファイルが付与されており、Session Manager で接続できる |
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| EBS ボリューム | ebs-data-volume | ebs-server に追加するデータ用ボリューム(gp3 / 10GiB で作成し、20GiB に拡張) |
| EBS スナップショット | ebs-data-snapshot | ebs-data-volume のバックアップ |
ステップ1: インスタンスの AZ を確認する
EBS ボリュームはインスタンスと同じ AZ に作る必要があるため、先に ebs-server の AZ を確認します。
- AWS マネジメントコンソールにログインし、リージョンが
ap-northeast-1(東京)であることを確認します - 上部の検索バーに
EC2と入力し、表示された「EC2」を選択します - 左側ナビゲーションの「インスタンス」→「インスタンス」を選択します
ebs-serverを選択し、下部の「ネットワーキング」タブで「アベイラビリティーゾーン」がap-northeast-1aであることを確認します- 下部の「ストレージ」タブで、ルートデバイスとして EBS ボリュームが 1 つアタッチされていることも確認しておきます
ステップ2: gp3 ボリュームを作成する
- 左側ナビゲーションの「Elastic Block Store」→「ボリューム」を選択します
- 右上の「ボリュームの作成」をクリックします
- 「ボリューム設定」で以下を入力します
- ボリュームタイプ:
汎用 SSD (gp3) - サイズ (GiB):
10 - IOPS:
3000(デフォルト) - スループット (MiB/秒):
125(デフォルト) - アベイラビリティーゾーン:
apne1-az4 (ap-northeast-1a)(ステップ1で確認した AZ) - スナップショット ID:
スナップショットから作成しない(デフォルト) - 暗号化: 「このボリュームを暗号化する」にチェックを入れ、KMS キーは
(デフォルト) aws/ebsを選択します(リージョンで「デフォルトで暗号化」が有効な場合は、最初からチェックが入っています)
- ボリュームタイプ:
- 「タグ - オプション」で「新しいタグを追加」をクリックし、キー
Name、値ebs-data-volumeを入力します - その他の項目はデフォルトのままにします
- 右下の「ボリュームの作成」をクリックします
- ボリューム一覧で
ebs-data-volumeの「ボリュームの状態」が「使用可能」になるまで待ちます
ステップ3: ボリュームをインスタンスにアタッチする
- ボリューム一覧で
ebs-data-volumeを選択し、右上の「アクション」→「ボリュームのアタッチ」をクリックします - 「インスタンス」で
ebs-serverを選択します(同じ AZ のインスタンスだけが候補に表示されます) - 「デバイス名」で
/dev/sdfを選択します - 「ボリュームのアタッチ」をクリックします
- ボリューム一覧で
ebs-data-volumeの「ボリュームの状態」が「使用中」になり、「アタッチされたリソース」にebs-serverのインスタンス ID が表示されることを確認します
ステップ4: Session Manager で接続し、フォーマット・マウントする
アタッチしただけのボリュームは、まだファイルシステムがない「生のディスク」です。OS からフォーマットしてマウントします。
- 左側ナビゲーションの「インスタンス」→「インスタンス」を選択し、
ebs-serverを選択して右上の「接続」をクリックします - 「セッションマネージャー」タブを選択し、「接続」をクリックします
- ブラウザ上にターミナルが開いたら、ブロックデバイスの一覧を確認します
lsblk
t3.micro のような Nitro ベースのインスタンスでは、EBS ボリュームが NVMe デバイスとして見えます。そのため、コンソールで指定した /dev/sdf ではなく nvme1n1 のような名前で表示されます。サイズが 10G でパーティションもマウントポイントもないデバイスが、追加した ebs-data-volume です。以下は表示例です(ルートボリュームのパーティション構成は AMI によって異なります)。
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nvme0n1 259:0 0 8G 0 disk
├─nvme0n1p1 259:1 0 8G 0 part /
├─nvme0n1p127 259:2 0 1M 0 part
└─nvme0n1p128 259:3 0 10M 0 part /boot/efi
nvme1n1 259:4 0 10G 0 disk
以降のコマンドの /dev/nvme1n1 は、lsblk で確認したデバイス名に置き換えてください。まず、ファイルシステムがまだないことを確認します。
sudo file -s /dev/nvme1n1
/dev/nvme1n1: data と表示されれば、ファイルシステムがない空のボリュームです。XFS でフォーマットします。
sudo mkfs -t xfs /dev/nvme1n1
マウントポイントを作成してマウントし、ファイルを書き込みます。
sudo mkdir /data
sudo mount /dev/nvme1n1 /data
echo "hello ebs" | sudo tee /data/hello.txt
df -hT /data
/data の行に、タイプ xfs、サイズ約 10G のファイルシステムが表示されれば、マウントは成功です。
ここでは一時的なマウントです。インスタンスの再起動後も自動でマウントしたい場合は、sudo blkid で確認した UUID を使って /etc/fstab に UUID=<UUID> /data xfs defaults,nofail 0 2 の形で追記します。nofail を付けておくと、ボリュームがアタッチされていない状態でもインスタンスが起動できます。
ステップ5: ボリュームのサイズを 20GiB に拡張する
ebs-data-volume をアタッチしたまま、サイズを 10GiB から 20GiB に増やします。
- Session Manager のタブはそのままにして、EC2 コンソールのタブに戻ります
- 左側ナビゲーションの「Elastic Block Store」→「ボリューム」を選択します
ebs-data-volumeを選択し、右上の「アクション」→「ボリュームの変更」をクリックします- 「サイズ (GiB)」を
20に変更します。ボリュームタイプ・IOPS・スループットはそのままにします
- 右下の「変更」をクリックします。確認のダイアログが表示された場合は、内容を確認して「変更」をクリックします
- ボリューム一覧で
ebs-data-volumeを選択し、「ボリュームの状態」にoptimizingが表示されるまで待ちます(サイズの増加は、変更がoptimizing状態になった時点で有効になります)
ステップ6: ファイルシステムを拡張する
ボリュームを広げただけでは、OS 側のファイルシステムは 10GiB のままです。Session Manager のターミナルに戻り、確認します。
lsblk /dev/nvme1n1
df -hT /data
lsblk ではデバイスのサイズが 20G になっている一方、df ではファイルシステムのサイズが約 10G のままであることが確認できます。今回のボリュームはパーティションを作らずに丸ごと XFS でフォーマットしたので、パーティションの拡張(growpart)は不要です。XFS のファイルシステムを拡張します。
sudo xfs_growfs -d /data
df -hT /data
cat /data/hello.txt
df の /data のサイズが約 20G に増え、hello.txt の中身 hello ebs もそのまま読めることが確認できます。インスタンスを止めず、データも消さずに容量を増やせました。
ステップ7: スナップショットを作成する
ebs-data-volume のスナップショットを作成します。スナップショットにはリクエストした時点でボリュームに書き込まれているデータが含まれるので、書き込み中の処理がない状態で取るのが推奨されています。今回は書き込みをしていないため、このまま進めます。
- EC2 コンソールの左側ナビゲーションの「Elastic Block Store」→「スナップショット」を選択します
- 右上の「スナップショットの作成」をクリックします
- 以下を設定します
- リソースタイプ:
ボリューム - ボリューム ID:
ebs-data-volumeのボリューム ID を選択 - 説明:
ebs-data-volume backup
- リソースタイプ:
- 「タグ」で「新しいタグを追加」をクリックし、キー
Name、値ebs-data-snapshotを入力します - 「暗号化」の欄に元のボリュームの設定(「暗号化済み」)が表示され、変更できないことを確認します
- 右下の「スナップショットを作成」をクリックします
- スナップショット一覧で
ebs-data-snapshotの「スナップショットのステータス」が「保留中」から「完了済み」になるまで待ちます。作成中もボリュームはそのまま使い続けられます - 「完了済み」になったら、
ebs-data-snapshotを選択し、下部の「詳細」タブでボリュームサイズが20 GiB、暗号化が「暗号化済み」になっていることを確認します
このスナップショットから、ap-northeast-1 内の別の AZ にボリュームを作成したり、「アクション」→「スナップショットをコピー」で別のリージョンにコピーしたりできます。