← ハンズオン一覧に戻る

AWS Hands-on / Compute

ディスクが足りなくなったので、後から大きくする

EC2 インスタンスに接続されたディスク(EBS ボリューム)の容量が足りなくなった状態をあえて作り、コンソールからボリュームのサイズを拡張し、サーバーの中でパーティションとファイルシステムを広げて、実際に使える容量を増やすところまでを一通り体験します。

● Lv.2 基本的なリソースを作れる人 ⏱ 所要 40〜60 分 コンソール操作+一部コマンドライン操作あり
01 — Prerequisites

はじめる前に

  • 必須AWS アカウントを持っていること
  • 必須マネジメントコンソールにサインインできること
  • 必須EC2 インスタンスへ SSH 接続できること(手順内で接続方法も説明します)
  • あると良いLinux のコマンドラインを少し触ったことがある(lscd 程度で構いません)

※ 今回はコンソール操作に加えて、サーバーの中で数個のコマンドを実行します。コマンドはすべて本文中にそのまま掲載するので、入力するだけで進められます。

※ ローカル端末は Windows を想定し、標準搭載の OpenSSH を使う手順で説明します。

02 — References

参照する公式ドキュメント

手順に迷ったときや、用語の意味を確かめたいときに開きましょう。

※ リンク切れの場合は、ページタイトルで検索してください。

03 — Background

背景・シナリオ

EC2 インスタンスを動かし続けていると、ログファイルやアップロードされたデータが積み重なって、いつの間にかディスクの空き容量が少なくなっていく、ということがよく起こります。空き容量がなくなると、新しいファイルが書き込めなくなり、サーバーが正常に動かなくなってしまいます。

幸い、EC2 が使うディスク(EBS ボリューム)は、あとからサイズを大きくできます。しかも、最近の世代のボリュームは稼働中のインスタンスを停止しなくてもサイズ変更ができます。ただし、ボリューム側のサイズを増やすだけでは終わりません。OS(サーバーの中)側でも、増えた分を使えるようにする作業が別に必要になります。今回はこの「コンソールでの変更」と「OS 側での拡張」をひと続きで体験します。

ボリュームを大きくする間、サーバーを止める必要があるの?

いいえ。EBS ボリュームは「稼働中のまま」サイズを変更できます。ただし、サイズ変更後に OS 側でパーティションとファイルシステムを広げる作業は、別途自分で行う必要があります。

コンソールでサイズを増やせば、OS の容量もすぐに増えるの?

いいえ、そこが今回の一番のポイントです。コンソールで増やせるのは「ボリュームという箱の大きさ」だけです。箱の中に入っている区画(パーティション)と、その上にあるファイルシステムは、自分で「広げてください」と指示するまで古いサイズのままです。

Goal

EC2 インスタンスの EBS ボリュームのサイズをコンソールから拡張し、SSH 接続したサーバーの中でパーティションとファイルシステムを拡張して、df -h で表示される使える容量が実際に増えていることを確認する。

04 — Architecture

つくる構成

「ディスクの空きが少ない状態」から、「ボリュームを拡張し、OS 側でも認識させた状態」になるまでの変化を比べます。この変化を自分の手で再現するのが、このハンズオンの中心です。

Before — 拡張前

空き容量が
残り少ない状態

使用率 約 94%
ボリューム:8 GiB(例)
⚠ もうすぐ書き込めなくなる
After — 拡張後

余裕のある
容量に拡張した状態

使用率 約 38%
ボリューム:20 GiB(例)
✓ コンソール変更+OS拡張の両方が完了

※ 図のサイズ・使用率は一例です。実際の値は自分の環境で確認した値になります。

05 — Requirements

要件

以下の流れで、「容量が厳しい状態を作る」→「ボリュームを拡張する」→「OS側でも使えるようにする」を順に行ってください。

No要件
1リージョンは「東京(ap-northeast-1)」を使用する。
2EC2 インスタンスを1台起動する。AMI は Amazon Linux 2023(最新版でよい)、インスタンスタイプは無料利用枠の対象(例:t3.micro)。ルートボリュームのサイズは小さめのまま(例:8 GiB)にしておく。名前タグは resize-demo(例)。
3SSH で接続し、ダミーファイルを作成するなどしてディスクの使用率を意図的に上げ、容量が残り少ない状態を作る。
4EC2 コンソールから、このインスタンスのルートボリュームのサイズを大きく変更する(例:8 GiB20 GiB)。
5サーバーの中でパーティションとファイルシステムを拡張し、df -h で使える容量が増えたことを確認する。
06 — Steps

構築の進め方

「先に容量不足の状態を作ってから、それを解消する」という順番で進めます。コンソールでの変更と OS 側での拡張、両方が必要だという感覚を、実際の数値の変化で確かめましょう。

  1. マネジメントコンソールにサインインし、リージョンを合わせる

    ブラウザで AWS マネジメントコンソールにサインインし、画面右上のリージョンが「アジアパシフィック(東京)ap-northeast-1」になっていることを確認します。

  2. 確認用の EC2 インスタンスを1台起動する

    EC2 コンソールで「インスタンスを起動」を押し、名前に resize-demo、AMI に Amazon Linux 2023、インスタンスタイプに無料利用枠の対象(例:t3.micro)を選びます。キーペアを新規作成し、.pem ファイルをダウンロードしておきます。ストレージ設定のルートボリュームは、サイズを変えずデフォルト(例:8 GiB)のまま起動します。

    セキュリティグループは SSH のみ許可でよい

    インバウンドルールで SSH(ポート22)を、自分の IP からのみ許可しておきます。Web サーバーなどは今回立てないため、それ以外のポートは開けなくて構いません。

  3. Windows の OpenSSH で接続する

    PowerShell を開き、ダウンロードした鍵ファイルの権限を絞った上で接続します(<インスタンスのパブリックIP> は実際の値に置き換えてください)。

    PowerShell
    # 鍵ファイルの権限を自分のみ読み取り可に絞る
    icacls .\resize-demo-key.pem /inheritance:r
    icacls .\resize-demo-key.pem /grant:r "$($env:USERNAME):(R)"
    
    # SSH接続
    ssh -i .\resize-demo-key.pem ec2-user@<インスタンスのパブリックIP>
  4. いまのディスク使用状況を確認する

    接続できたら、現在のディスクの使用状況を確認します。

    EC2 インスタンス内
    df -h /
    lsblk
    lsblk で実際のデバイス名を確認しておく

    lsblk の結果に表示されるディスク名(例:nvme0n1 とその下の nvme0n1p1)を、あとの手順で使います。最近の世代のインスタンスでは /dev/xvda ではなく NVMe 形式の名前になっていることが多いので、ここで必ず実際の値を確認してください。

  5. ダミーファイルを作って、容量が厳しい状態を再現する

    fallocate コマンドで大きなファイルを1つ作り、空き容量が少ない状態を意図的に作ります。ボリュームの空き容量に合わせて、サイズは適宜調整してください。

    EC2 インスタンス内
    # 例:5GBのダミーファイルを作成
    fallocate -l 5G ~/dummy.img
    df -h /
    使用率が9割前後になっていればOK

    df -h /Use% の列が9割前後になっていれば、「容量が厳しい状態」の再現は十分です。ディスクを使い切ってインスタンスが不安定にならないよう、使用率100%にはしないようにしましょう。

  6. EC2 コンソールから、ボリュームのサイズを変更する

    EC2 コンソールの左メニュー「Elastic Block Store」→「ボリューム」を開き、resize-demo インスタンスのルートボリュームを選びます。「アクション」→「ボリュームの変更」を押し、新しいサイズ(例:20 GiB)を入力して保存します。

    縮小はできない・変更には少し時間がかかる

    EBS ボリュームのサイズは大きくすることしかできません(小さくはできません)。また、変更が完了するまで数分かかることがあります。ボリュームの状態が「in-use」のまま「最適化中」のような表示になっていれば、しばらく待ちましょう。

  7. サーバーの中でパーティションを拡張する

    もう一度 SSH 接続し、growpart コマンドでパーティションを拡張します(デバイス名は手順4で確認したものに置き換えてください)。

    EC2 インスタンス内
    # 例:lsblkで /dev/nvme0n1 と /dev/nvme0n1p1 だった場合
    sudo growpart /dev/nvme0n1 1
    lsblk
    パーティション番号は「1」が一般的

    growpart の2つ目の引数はパーティション番号です。lsblk でデバイス名の末尾に p1 のように付いている場合、その「1」を指定します。

  8. ファイルシステムを拡張する

    Amazon Linux 2023 のルートファイルシステムは標準で XFS です。xfs_growfs でファイルシステムを拡張します。

    EC2 インスタンス内
    sudo xfs_growfs -d /
    df -h /
    ファイルシステムの種類によってコマンドが違う

    ファイルシステムが ext4 の場合は、代わりに sudo resize2fs /dev/nvme0n1p1(デバイス名は自分の環境のものに置き換え)を使います。df -T /lsblk -f で、自分の環境のファイルシステムの種類を確認できます。

  9. 容量が増えたことを確認し、ダミーファイルを削除する

    df -h / を実行し、Size の列が新しいボリュームサイズに近い値(例:約20GB)になっていること、Use% が下がっていることを確認します。確認できたら、手順5で作ったダミーファイルを削除しておきます。

    EC2 インスタンス内
    rm ~/dummy.img
    df -h /
07 — Pitfalls

つまずきポイント

初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。

Pitfall 01 — コンソールで増やしたのに df -h では増えない

「ボリュームのサイズは20GiBになったのに、df -h は8GBのまま」

growpartxfs_growfs(または resize2fs)の両方を実行したか見直しましょう。ボリュームのサイズ・パーティションのサイズ・ファイルシステムのサイズは、それぞれ別の階層にあり、上の階層を直しただけでは下の階層は自動で追従しません。3つの階層がそれぞれ拡張されているか、lsblk の出力で1つずつ確認してみてください。

Pitfall 02 — growpart や xfs_growfs でエラーが出る

「コマンドを実行すると、デバイスが見つからないと言われる」

デバイス名を /dev/xvda のような古い形式で指定していないか確認しましょう。最近の世代のインスタンスでは lsblk の結果が nvme0n1 のような NVMe 形式の名前になっています。コマンドの中のデバイス名が、lsblk で実際に表示された名前と一致しているか見直してみてください。

08 — Checklist

完了チェック

要件の再確認ではなく、画面・コマンドのどこを見れば達成を確認できるかをまとめました。次を順に確かめましょう。

  • EC2 コンソールの「ボリューム」一覧で、対象ボリュームのサイズが新しい値(例:20 GiB)になっている。
  • そのボリュームの状態が、変更処理を終えて「in-use」に戻っている。
  • サーバー内で lsblk を実行すると、パーティションのサイズも新しい値に近くなっている。
  • df -h /Size 列が、新しいボリュームサイズに近い値になっている。
  • df -h /Use% 列が、ダミーファイル削除後に十分低い値(10〜40%程度)になっている。
09 — Think

考えてみよう

手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。

  1. EBS ボリュームのサイズを増やしただけでは、サーバーの中で使える容量がすぐに増えなかったのはなぜでしょうか。「ボリューム」「パーティション」「ファイルシステム」という3つの言葉を使って説明してみましょう。
    ヒント
    3つはそれぞれ別の階層の情報です。ボリュームは物理的な箱の大きさ、パーティションはその箱の中の区画、ファイルシステムはその区画の上でファイルを管理する仕組みです。上の階層を変えても、下の階層は自分で更新するまで古い情報を持ち続けます。
  2. EBS ボリュームのサイズは「大きくすることしかできない(縮小できない)」という制約があります。これはなぜそうなっていると考えられるでしょうか。
    ヒント
    ファイルシステムは、ボリューム全体にデータを分散して配置しています。縮小するには「後ろの領域にあるデータを安全に前方へ移動してから切り詰める」という複雑な処理が必要になります。データを壊さずに縮小する難しさという観点から考えてみましょう。
  3. 本番で稼働しているサーバーが、今回のように「容量がぎりぎりになって初めて気づく」という状態になるのは避けたいものです。容量不足を事前に察知するには、どのような仕組みを用意しておくとよいでしょうか。
    ヒント
    ディスク使用率などのメトリクスを定期的に収集し、ある割合を超えたら通知する仕組みを考えてみましょう。サーバーの監視や、しきい値を超えたときに知らせる仕組みは、他のハンズオンでも扱われている考え方です。
10 — Clean up

後片づけ

作成したインスタンスを終了し、リソースを整理しましょう。

  1. インスタンスを終了する:EC2 コンソールの「インスタンス」で resize-demo を選び、「インスタンスの状態」→「インスタンスを終了(Terminate)」を選びます。
  2. ボリュームが残っていないか確認する:左メニュー「ボリューム」を開き、インスタンス終了後にこのボリュームが一覧から消えている(または「利用不可」になっていない)ことを確認します。通常はルートボリュームの「終了時に削除」が既定で有効なため、インスタンスの終了と同時に削除されます。
Caution — ボリュームが残ったままになっていないか確認する

「終了時に削除」がオフになっていると、ボリュームだけ残って課金が続く

ボリュームの設定で「終了時に削除」が無効になっていた場合、インスタンスを終了してもボリュームは削除されずに残り、料金が発生し続けます。後片づけの最後に、必ず「ボリューム」の一覧を確認してください。なお、デフォルト VPC やデフォルトのサブネットは消さないようにしてください。

コストに関する注意: EC2 インスタンスは起動中のみ課金されます(t3.micro などは無料利用枠の対象で、月あたり一定時間まで無料)。EBS ボリュームには、確保している容量(GB)に応じた料金が時間単位でかかり続けます。サイズを大きくすると、その分の料金もそのまま増える点に注意してください。短時間で終えれば少額にとどまりますが、後片づけを忘れてインスタンスやボリュームを放置すると課金が継続します。最新の料金は AWS の公式料金ページで確認できます。なお、VPC・サブネット・ルートテーブル・セキュリティグループ自体には料金はかかりません。