ちょっと話題の記事

EC2インスタンスのEBSボリュームを拡張する

2013.11.29

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Jenkinsで継続的インテグレーション(CI)を運用していると、ディスクの容量不足となることがあります。これは、継続的に行っているビルドやテストの成果物がJenkinsによって継続的に蓄積されることが主な要因です。これはJenkinsプロジェクトで「古いビルドを破棄」を設定することで抑制することができます。この時、ビルドの保存日数やビルドの保存最大数を設定します。

jenkis_build_history

とはいえ、根本的に容量不足となってしまったならば、ディスク容量を増やすしかありません。

$ df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/xvda1            7.9G  6.8G  1.1G  87% /
tmpfs                 1.9G     0  1.9G   0% /dev/shm

Amazon EC2ではこのようなケースでも、柔軟にディスク容量を拡張することができます。

前提

EC2インスタンスのルートデバイスがEBS Volumeで構築されていることが前提となります。また、稼働中のEC2インスタンスを一度停止してから、EBS Volumeの差しかえを行うため、10-30分程度のダウンタイムが発生します。

なお、ルートデバイスでなければインスタンスを停止/起動する代わりに、EBS Volumeのデタッチ/アタッチで同様の拡張が可能です。この場合、ダウンタイムを短くすることができます。

流れ

EC2インスタンスのEBS Volumeを拡張する流れは次の通りです。

  1. EC2インスタンスを停止する
  2. EC2インスタンスのEBS Volumeからスナップショットを作成する
  3. スナップショットから容量を拡張した新しいEBS Volumeを作成する
  4. EC2インスタンスから既存のEBS Volumeをデタッチし、新しいEBS Volumeをアタッチする
  5. EC2インスタンスを起動し、ファイルシステムをリサイズする

extend_ebs_volume-2

EC2インスタンスを停止する

必要に応じてJenkinsなどのアプリケーションを停止し、EC2インスタンスを停止します。これは安全なスナップショットをとるためです。

stop_instance

EC2インスタンスのEBS Volumeからスナップショットを作成する

次にスナップショットを作成します。

スナップショットを作成する時にEBS VolumeのIDが必要となります。はじめに、EC2インスタンスのDescriptionからRoot Deviceをクリックし、EBS IDをメモしましょう。

EBS_ID

次に、サイドメニューのELASTIC BLOCK STOREのSnapshotsメニューを選択し、Create Snapshotpをクリックします。

create_snapshot

Volumeから先ほど確認したEBS IDを選択してください。続けて適当な名前(例: Jenkins)を入力し、「Create」をクリックします。なお、スナップショットは初回作成時の場合、数分から数十分程度かかります(なお、2回目以降は差分をとるだけであるため短時間で終わります)。できたSnapshotのIDは後から使うのでメモしておきましょう。

create_snapshot

スナップショットから容量を拡張した新しいEBS Volumeを作成する

次に新しい容量のEBS Volumeを作成します。つまり、既にあるEBS Volume自体を拡張するというのではなく、新しい容量のEBS Volumeを作成し、元のデータをコピーすることになります。前の手順で作成したスナップショットのコンテキストメニューを開き、「Create Volume from Snapshot」を選択してください。

create_snapshot

続けて新しく作成するEBS Volumeの情報を入力します。

create_volume-5

この時、AZはEC2のインスタンスが稼動しているAZを選択してください。別のAZを選択すると、この後でEC2インスタンスにアタッチできません。

Sizeは元のEBSよりも大きく確保しますが、確保したSizeに比例してコストが増えます。足りなくなってきたら増やせば良いので必要な分だけ増やすことにしましょう。ここでは8GBの容量が87%となっていたので、10GBに増やしました。これで70%程度になる計算です。

作成されたvolumeを確認します。Volumesを選択し、EBS Volumeの一覧を表示します。SnapshotのIDをフィルタに入力すれば簡単に絞り込めるので便利です。Volume IDをメモしておきます。

volume-9

EC2インスタンスから既存のEBS Volumeをデタッチし、新しいEBSボリュームをアタッチする

準備はできたのでEC2インスタンスのRoot Deviceを交換します。

はじめに、サイドメニューのELASTIC BLOCK STORE - Volumesメニューから、EC2インスタンスにアタッチされているEBS Volumeを探します。フィルターにメモしたVolume IDを入力すると良いでしょう。対象のEBS Volumeが見つかったならばコンテキストメニューからDetach Volumeを選択し、EC2インスタンスからデタッチします。

detach_volume-7

次に先ほど作成した新しい容量のEBS Volumeを探し、コンテキストメニューからAtach Volumeを選択します。

attach_volume

続けて、アタッチ先のEC2インスタンスを選択し、Deviceにルートデバイス、すなわち/dev/sda1を指定します。後は「Yes, Attach」をクリックする事でインスタンスに新しいEBS Volumeがアタッチされます。

attach_volume-6-6

EC2インスタンスを起動し、ファイルシステムをリサイズする

EBS Volumeを差し替えたならば、EC2インスタンスを起動します。しかし、ファイルシステムでは元のデータ領域しか認識していないため、ファイルシステムの更新を行い、新しいEBS Volumeのデータ領域全体を認識させる必要があります。

はじめにディスク容量を確認しておきましょう。

$ df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/xvda1            7.9G  6.8G  1.1G  87% /
tmpfs                 1.9G     0  1.9G   0% /dev/shm

ファイルシステムの更新のため、resize2fsコマンドを実行します。

$ sudo resize2fs /dev/sda1 
resize2fs 1.42.3 (14-May-2012)
Filesystem at /dev/sda1 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 1
The filesystem on /dev/sda1 is now 2621440 blocks long.

再度、ディスク容量を確認します。

$ df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/xvda1            9.9G  6.8G  3.1G  69% /
tmpfs                 1.9G     0  1.9G   0% /dev/shm

7.9GBから9.9GBへ増え、空き領域にも余裕がでました。

まとめ

物理的なサーバであれば少しづつ容量を増やしていっては無駄なコストがかかります。使わなくなったディスクも破棄しなければなりません。しかし、AWSを使えば簡単に容量を拡張することができ、コストも最小限にすることができます。