AWS EC2インスタンスのディスク容量追加をしてみる

AWS初心者です。
EC2インスタンスのディスク容量追加やってみつつ、自分用の振り返り用の記事をまとめました。
公式Docもあり他の人の記事もすでにあるので、自分の記事に価値はないですが、なにか先達からコメントもらえたらいいなと思い公開します。

## EC2のストレージの種類​
EC2のストレージは、EBSとインスタンスストアの２種類がある。
公式ドキュメントでいう永続的ストレージはEBSを指していると考えられます。
また、公式ドキュメントでは、ストレージとボリュームは同義だと思っています。

### EBS
- 高い可用性と耐久性を持つストレージ
- EBSボリュームともいう
- 5つのEBSボリュームタイプ(2016/11/06現在)から目的にあったものを選ぶ
- 単位：IOPS(Input/Output Per Second)

執筆時点で選択できるEBSボリュームタイプ5つ

|タイプ     |ハードウェア|容量|コスト|用途     |
|:---------|:---------|:--|:--------|:--------|
|EBS マグネティック|HDD|1 GB～1 TB|0.05 USD/GB-月<br>0.05 USD/100 万 I/O|IOが遅くてもいい場合<br>コストを抑えたい場合|
|Cold HDD (sc1)|HDD|500 GB～16 TB|0.025 USD/GB-月|アクセス頻度の低いワークロード向け|
|スループット最適化 HDD (st1)|HDD|500 GB～16 TB|0.045 USD/GB-月|アクセス頻度の高いワークロード向け|
|EBS 汎用 SSD (gp2)*|SSD|1 GB～16 TB|0.10 USD/GB-月|幅広いトランザクションワークロードに適応できる|
|EBS プロビジョンド IOPS SSD (io1)|SSD|4 GB～16 TB|0.125 USD/GB-月<br>0.065 USD/プロビジョンド IOPS|レイテンシーの影響が大きいトランザクションワークロード向け|

### インスタンスストア
- インスタンス用のブロックレベルの一時ストレージ
- 1 つ以上のインスタンスストアボリュームで構成される
- インスタンスストアのデータはEC2インスタンス再起動時は引き継がれる
- 下記のような場合はインスタンスストアのデータは失われる
    - 基盤となるディスクでの障害発生
    - EC2インスタンスの停止
    - EC2インスタンスの終了

 EC2インスタンスのマネジメントコンソールからの再起動ではインスタンスストアのデータは引き続き利用できる。
これは同じ物理サーバ上で立ち上がるためだと思われます。 
一方、停止+起動によるインスタンスの再立ち上げは、停止前とは異なる物理サーバで立ち上がります。

## ルートボリュームと追加ボリューム
- ルートボリューム = ルートにマウントされたストレージ(ボリューム)
- 追加ボリューム = ルートボリューム以外に追加されたストレージ(ボリューム)

## ディスク容量の追加のパターン
インスタンスのディスク容量を増やす際に、3つのケースがある

1. ストレージを追加する
2. ルートボリュームの容量を追加する
3. 追加ボリュームの容量を追加する 

ざっくりした各項目の説明をします。
実行インスタンスOS : Amazon Linux

### 1. ストレージを追加する
- EBS => Volume => Volumeの追加
- 作成したVolumeをインスタンスにアタッチ
- Volumeをマウント

### 2. ルートボリュームの容量を追加する
- EC2インスタンスのAMIを作成する  
    - この時、「再起動しない」にチェックを入れとけば、AMI作成時にコピー元のインスタンスは再起動されない。商用で動いているインスタンスなら入れるべきですね。
- AMIから新しいインスタンスを起動する  
    - この時にルートボリュームのサイズを変更する
- 新しいインスタンスでルートボリュームのサイズが変更されていることを確認する  
    - サイズが変わっていなかったら[サイズ変更が反映されない場合]の項を参照のこと
- EIPを付け替える(Reallocateにチェックを入れないとエラーで実行できない)


これって、AMI作ってから、EIP付け替えるまでの情報って失われますよね。。。  
もっといい方法ないかな。

### 3. 追加ボリュームの容量を追加する 
「ルートボリュームの容量を追加する」でもできるかもしれないですが、「Amazon Web Services実践入門」では下記のボリュームを切り離す方法が説明されていた。

- EC2インスタンスを停止する  
    - 試してみましたが、インスタンスを停止しないと、後に実施する追加ボリュームの切り離しができなかったです。
- 容量追加する対象ボリュームのスナップショットを取得
- 対象ボリュームのスナップショットから新規ボリュームを作成する
    - サイズを変更する
    - EC2インスタンスと同じAvailability Zone(AZ)を選択する
- 元のボリュームを切り離す(デタッチする)
- サイズ変更した新ボリュームをアタッチする  
    - 元のボリュームと同じマウント先のディレクトリを選択すること  
    - サイズが変わっていなかったら[サイズ変更が反映されない場合]の項を参照のこと


## サイズ変更が反映されない場合
ファイルシステムで実施するコマンドが違う。

### - 対象ボリュームのファイルシステムがext4の場合  
次のコマンドで反映させる
$ sudo resize2fs &lt;デバイス&gt;


### - 対象ボリュームのファイルシステムがxfsの場合  
次のコマンドで反映させる
$ sudo xfs_growfs &lt;マウント先のディレクトリ&gt;

実行例：
<pre>[ec2-user@ip-172-31-20-58 ~]$ sudo xfs_growfs /mnt/ebs/0
meta-data=/dev/xvdf              isize=256    agcount=4, agsize=6553600 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=26214400, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal               bsize=4096   blocks=12800, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
data blocks changed from 26214400 to 31457280</pre>

### - ちなみにファイルシステムを確認するには
$ df -T
<pre>[ec2-user@ip-172-31-20-58 ~]$ df -T
Filesystem     Type     1K-blocks    Used Available Use% Mounted on
devtmpfs       devtmpfs    498772      60    498712   1% /dev
tmpfs          tmpfs       509664       0    509664   0% /dev/shm
/dev/xvda1     ext4      16380820 2364400  13916172  15% /
/dev/xvdf      xfs      125777920   32960 125744960   1% /mnt/ebs/0</pre>

## 参考資料
- [Amazon Web Services実践入門](http://amzn.to/2eLHzeF,"Amazon Web Services実践入門" )
- [公式ドキュメント AWS Documentation » Amazon EC2 » User Guide for Linux Instances » ストレージ](http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/Storage.html, "AWS EC2 Linux Instance Storage")