はじめる前に
- 必須AWS アカウントを持っていること
- 必須マネジメントコンソールにサインインできること
- 必須EC2 インスタンスへ SSH 接続できること(手順内で接続方法も説明します)
- あると良いLinux のコマンドラインを少し触ったことがある(
lsやcd程度で構いません)
※ 今回はコンソール操作に加えて、サーバーの中で数個のコマンドを実行します。コマンドはすべて本文中にそのまま掲載するので、入力するだけで進められます。
※ ローカル端末は Windows を想定し、標準搭載の OpenSSH を使う手順で説明します。
参照する公式ドキュメント
手順に迷ったときや、用語の意味を確かめたいときに開きましょう。
/dev/xvda のような名前ではなく NVMe 形式になる、という背景の説明。
docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/nvme-ebs-volumes.html
※ リンク切れの場合は、ページタイトルで検索してください。
背景・シナリオ
EC2 インスタンスを動かし続けていると、ログファイルやアップロードされたデータが積み重なって、いつの間にかディスクの空き容量が少なくなっていく、ということがよく起こります。空き容量がなくなると、新しいファイルが書き込めなくなり、サーバーが正常に動かなくなってしまいます。
幸い、EC2 が使うディスク(EBS ボリューム)は、あとからサイズを大きくできます。しかも、最近の世代のボリュームは稼働中のインスタンスを停止しなくてもサイズ変更ができます。ただし、ボリューム側のサイズを増やすだけでは終わりません。OS(サーバーの中)側でも、増えた分を使えるようにする作業が別に必要になります。今回はこの「コンソールでの変更」と「OS 側での拡張」をひと続きで体験します。
ボリュームを大きくする間、サーバーを止める必要があるの?
いいえ。EBS ボリュームは「稼働中のまま」サイズを変更できます。ただし、サイズ変更後に OS 側でパーティションとファイルシステムを広げる作業は、別途自分で行う必要があります。
コンソールでサイズを増やせば、OS の容量もすぐに増えるの?
いいえ、そこが今回の一番のポイントです。コンソールで増やせるのは「ボリュームという箱の大きさ」だけです。箱の中に入っている区画(パーティション)と、その上にあるファイルシステムは、自分で「広げてください」と指示するまで古いサイズのままです。
EC2 インスタンスの EBS ボリュームのサイズをコンソールから拡張し、SSH 接続したサーバーの中でパーティションとファイルシステムを拡張して、df -h で表示される使える容量が実際に増えていることを確認する。
つくる構成
「ディスクの空きが少ない状態」から、「ボリュームを拡張し、OS 側でも認識させた状態」になるまでの変化を比べます。この変化を自分の手で再現するのが、このハンズオンの中心です。
空き容量が
残り少ない状態
余裕のある
容量に拡張した状態
※ 図のサイズ・使用率は一例です。実際の値は自分の環境で確認した値になります。
要件
以下の流れで、「容量が厳しい状態を作る」→「ボリュームを拡張する」→「OS側でも使えるようにする」を順に行ってください。
| No | 要件 |
|---|---|
| 1 | リージョンは「東京(ap-northeast-1)」を使用する。 |
| 2 | EC2 インスタンスを1台起動する。AMI は Amazon Linux 2023(最新版でよい)、インスタンスタイプは無料利用枠の対象(例:t3.micro)。ルートボリュームのサイズは小さめのまま(例:8 GiB)にしておく。名前タグは resize-demo(例)。 |
| 3 | SSH で接続し、ダミーファイルを作成するなどしてディスクの使用率を意図的に上げ、容量が残り少ない状態を作る。 |
| 4 | EC2 コンソールから、このインスタンスのルートボリュームのサイズを大きく変更する(例:8 GiB → 20 GiB)。 |
| 5 | サーバーの中でパーティションとファイルシステムを拡張し、df -h で使える容量が増えたことを確認する。 |
構築の進め方
「先に容量不足の状態を作ってから、それを解消する」という順番で進めます。コンソールでの変更と OS 側での拡張、両方が必要だという感覚を、実際の数値の変化で確かめましょう。
-
マネジメントコンソールにサインインし、リージョンを合わせる
ブラウザで AWS マネジメントコンソールにサインインし、画面右上のリージョンが「アジアパシフィック(東京)ap-northeast-1」になっていることを確認します。
-
確認用の EC2 インスタンスを1台起動する
EC2 コンソールで「インスタンスを起動」を押し、名前に
resize-demo、AMI に Amazon Linux 2023、インスタンスタイプに無料利用枠の対象(例:t3.micro)を選びます。キーペアを新規作成し、.pem ファイルをダウンロードしておきます。ストレージ設定のルートボリュームは、サイズを変えずデフォルト(例:8 GiB)のまま起動します。セキュリティグループは SSH のみ許可でよいインバウンドルールで SSH(ポート22)を、自分の IP からのみ許可しておきます。Web サーバーなどは今回立てないため、それ以外のポートは開けなくて構いません。
-
Windows の OpenSSH で接続する
PowerShell を開き、ダウンロードした鍵ファイルの権限を絞った上で接続します(
<インスタンスのパブリックIP>は実際の値に置き換えてください)。# 鍵ファイルの権限を自分のみ読み取り可に絞る 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>
-
いまのディスク使用状況を確認する
接続できたら、現在のディスクの使用状況を確認します。
df -h / lsblk
lsblk で実際のデバイス名を確認しておくlsblkの結果に表示されるディスク名(例:nvme0n1とその下のnvme0n1p1)を、あとの手順で使います。最近の世代のインスタンスでは/dev/xvdaではなく NVMe 形式の名前になっていることが多いので、ここで必ず実際の値を確認してください。 -
ダミーファイルを作って、容量が厳しい状態を再現する
fallocateコマンドで大きなファイルを1つ作り、空き容量が少ない状態を意図的に作ります。ボリュームの空き容量に合わせて、サイズは適宜調整してください。# 例:5GBのダミーファイルを作成 fallocate -l 5G ~/dummy.img df -h /使用率が9割前後になっていればOKdf -h /のUse%の列が9割前後になっていれば、「容量が厳しい状態」の再現は十分です。ディスクを使い切ってインスタンスが不安定にならないよう、使用率100%にはしないようにしましょう。 -
EC2 コンソールから、ボリュームのサイズを変更する
EC2 コンソールの左メニュー「Elastic Block Store」→「ボリューム」を開き、
resize-demoインスタンスのルートボリュームを選びます。「アクション」→「ボリュームの変更」を押し、新しいサイズ(例:20 GiB)を入力して保存します。縮小はできない・変更には少し時間がかかるEBS ボリュームのサイズは大きくすることしかできません(小さくはできません)。また、変更が完了するまで数分かかることがあります。ボリュームの状態が「in-use」のまま「最適化中」のような表示になっていれば、しばらく待ちましょう。
-
サーバーの中でパーティションを拡張する
もう一度 SSH 接続し、
growpartコマンドでパーティションを拡張します(デバイス名は手順4で確認したものに置き換えてください)。# 例:lsblkで /dev/nvme0n1 と /dev/nvme0n1p1 だった場合 sudo growpart /dev/nvme0n1 1 lsblkパーティション番号は「1」が一般的growpartの2つ目の引数はパーティション番号です。lsblkでデバイス名の末尾にp1のように付いている場合、その「1」を指定します。 -
ファイルシステムを拡張する
Amazon Linux 2023 のルートファイルシステムは標準で XFS です。
xfs_growfsでファイルシステムを拡張します。sudo xfs_growfs -d / df -h /
ファイルシステムの種類によってコマンドが違うファイルシステムが ext4 の場合は、代わりに
sudo resize2fs /dev/nvme0n1p1(デバイス名は自分の環境のものに置き換え)を使います。df -T /やlsblk -fで、自分の環境のファイルシステムの種類を確認できます。 -
容量が増えたことを確認し、ダミーファイルを削除する
df -h /を実行し、Sizeの列が新しいボリュームサイズに近い値(例:約20GB)になっていること、Use%が下がっていることを確認します。確認できたら、手順5で作ったダミーファイルを削除しておきます。rm ~/dummy.img df -h /
つまずきポイント
初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。
「ボリュームのサイズは20GiBになったのに、df -h は8GBのまま」
growpart と xfs_growfs(または resize2fs)の両方を実行したか見直しましょう。ボリュームのサイズ・パーティションのサイズ・ファイルシステムのサイズは、それぞれ別の階層にあり、上の階層を直しただけでは下の階層は自動で追従しません。3つの階層がそれぞれ拡張されているか、lsblk の出力で1つずつ確認してみてください。
「コマンドを実行すると、デバイスが見つからないと言われる」
デバイス名を /dev/xvda のような古い形式で指定していないか確認しましょう。最近の世代のインスタンスでは lsblk の結果が nvme0n1 のような NVMe 形式の名前になっています。コマンドの中のデバイス名が、lsblk で実際に表示された名前と一致しているか見直してみてください。
完了チェック
要件の再確認ではなく、画面・コマンドのどこを見れば達成を確認できるかをまとめました。次を順に確かめましょう。
- EC2 コンソールの「ボリューム」一覧で、対象ボリュームのサイズが新しい値(例:20 GiB)になっている。
- そのボリュームの状態が、変更処理を終えて「in-use」に戻っている。
- サーバー内で
lsblkを実行すると、パーティションのサイズも新しい値に近くなっている。 df -h /のSize列が、新しいボリュームサイズに近い値になっている。df -h /のUse%列が、ダミーファイル削除後に十分低い値(10〜40%程度)になっている。
考えてみよう
手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。
- EBS ボリュームのサイズを増やしただけでは、サーバーの中で使える容量がすぐに増えなかったのはなぜでしょうか。「ボリューム」「パーティション」「ファイルシステム」という3つの言葉を使って説明してみましょう。
ヒント
3つはそれぞれ別の階層の情報です。ボリュームは物理的な箱の大きさ、パーティションはその箱の中の区画、ファイルシステムはその区画の上でファイルを管理する仕組みです。上の階層を変えても、下の階層は自分で更新するまで古い情報を持ち続けます。 - EBS ボリュームのサイズは「大きくすることしかできない(縮小できない)」という制約があります。これはなぜそうなっていると考えられるでしょうか。
ヒント
ファイルシステムは、ボリューム全体にデータを分散して配置しています。縮小するには「後ろの領域にあるデータを安全に前方へ移動してから切り詰める」という複雑な処理が必要になります。データを壊さずに縮小する難しさという観点から考えてみましょう。 - 本番で稼働しているサーバーが、今回のように「容量がぎりぎりになって初めて気づく」という状態になるのは避けたいものです。容量不足を事前に察知するには、どのような仕組みを用意しておくとよいでしょうか。
ヒント
ディスク使用率などのメトリクスを定期的に収集し、ある割合を超えたら通知する仕組みを考えてみましょう。サーバーの監視や、しきい値を超えたときに知らせる仕組みは、他のハンズオンでも扱われている考え方です。
後片づけ
作成したインスタンスを終了し、リソースを整理しましょう。
- インスタンスを終了する:EC2 コンソールの「インスタンス」で
resize-demoを選び、「インスタンスの状態」→「インスタンスを終了(Terminate)」を選びます。 - ボリュームが残っていないか確認する:左メニュー「ボリューム」を開き、インスタンス終了後にこのボリュームが一覧から消えている(または「利用不可」になっていない)ことを確認します。通常はルートボリュームの「終了時に削除」が既定で有効なため、インスタンスの終了と同時に削除されます。
「終了時に削除」がオフになっていると、ボリュームだけ残って課金が続く
ボリュームの設定で「終了時に削除」が無効になっていた場合、インスタンスを終了してもボリュームは削除されずに残り、料金が発生し続けます。後片づけの最後に、必ず「ボリューム」の一覧を確認してください。なお、デフォルト VPC やデフォルトのサブネットは消さないようにしてください。
コストに関する注意: EC2 インスタンスは起動中のみ課金されます(t3.micro などは無料利用枠の対象で、月あたり一定時間まで無料)。EBS ボリュームには、確保している容量(GB)に応じた料金が時間単位でかかり続けます。サイズを大きくすると、その分の料金もそのまま増える点に注意してください。短時間で終えれば少額にとどまりますが、後片づけを忘れてインスタンスやボリュームを放置すると課金が継続します。最新の料金は AWS の公式料金ページで確認できます。なお、VPC・サブネット・ルートテーブル・セキュリティグループ自体には料金はかかりません。