【初心者向け】Cloud9の容量不足をEBSストレージを追加して解決する

##はじめに
勉強用にCloud9を使っているときに容量不足を解決した手順の備忘録として。
Cloud9が動いているインスタンスのストレージを拡張します。
EC2を自分で構築しない/Linuxをあまり触らない人向け。筆者も同じくらいなので理論の部分はあやふやです。

##注意事項
AWSの無料枠（1年間）を過ぎると、ボリュームの使用量に合わせて課金されるので、拡張の際はご注意ください。
記事を書いてる2021年1月時点で、だいたい1GBにつき0.08～0.1USD/月くらいっぽいです。
https://aws.amazon.com/jp/ebs/pricing/

##手順
1. 心当たりがある人は、いらないファイルを消す
2. EC2のボリューム(EBS)を拡張する
3. 拡張したボリュームをファイルシステムに適用する

##1.心当たりがある人は、いらないファイルを消す
Dockerとかの容量食うものを使っている人は、ですね。
Railsチュートリアルとかの勉強にCloud9を使ってる人は特に消せるものもないかと思います。

##2.EC2のボリュームを拡張する
Cloud9のEC2にくっついているボリュームを拡張します。
EC2・ボリュームとはなんぞや？という方は、かみ砕いていえば、
・EC2：仮想サーバ。Cloud9（開発環境）もここの中で動いてます。
・ボリューム(EBS)：サーバの保存領域・仮想ディスク。
です。

手順はこちらが詳しく、そっくりそのまま実行で大丈夫です。
[AWS Cloud9 で利用している EBS ボリューム領域を拡張する](https://qiita.com/ktrkmk/items/8cf1e100da2e717f3be2)
ボリューム拡張・EC2の再起動まで終わったら次へ。

##3.拡張したボリュームをファイルシステムに適用する
公式ガイドの通りです。
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html

が、ちょっと技術文書的な書き方なので簡単に補足します。これ以降すべてターミナル上での操作です。

####①ディスク空き容量を`sudo df -hT`コマンドで確認する
こんな感じの結果が出てくると思います。

```
Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  476M     0  476M   0% /dev
tmpfs          tmpfs      98M   11M   88M  11% /run
/dev/xxxx1     ext4      9.7G  9.7G     0 100% /
以下略
```

Mounted on列が`/`、つまりルートディレクトリに割り当てられているファイルシステムのディスク使用率`Use%`が100%ないしカツカツであれば、2.で拡張したボリュームが割り当たっていない可能性があります。
この時点でボリュームが割り当たってるケースもあるんですかね？　その場合はここで作業完了です。

####②ボリュームに拡張が必要なパーティションがあるかを`lsblk`コマンドで確認する
ざっくりですが、パーティション＝ボリュームをさらに、（論理ないし物理的ななにがしかで）区切ったもの　とのことです。
ディスクを増やしても、ディスクに割り当てたパーティションが増えなければ、インスタンスとして使える空き容量が増えないので、状況を確認します。
ボリュームを10GB→20GBに増やした場合、こんな感じの結果が出てくると思います。

```
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop0     7:0    0 55.4M  1 loop /snap/core18/1932
loop1     7:1    0 32.3M  1 loop /snap/amazon-ssm-agent/2996
loop2     7:2    0 55.4M  1 loop /snap/core18/1944
loop3     7:3    0 97.9M  1 loop /snap/core/10577
loop4     7:4    0 97.9M  1 loop /snap/core/10583
loop5     7:5    0 12.7M  1 loop /snap/amazon-ssm-agent/495
xxxx    202:0    0   20G  0 disk 
└─xxxx1 202:1    0   10G  0 part /
```

ルートディレクトリ`/`に割り当たっているパーティション`xxxx1`の容量が10GBしかありません。
一方でディスク本体である`xxxx`には、2でボリュームに割り当てた通りの20GBの容量があるので、ディスク容量増がパーティションに反映できていない状況です。

####③容量を`sudo growpart /dev/xxxx 1`コマンドでパーティションに割り当てる
xxxx にはファイルシステム上のディスクの名前を割り当てます。
①の`Filesystem`列の名称から、末尾`1`(パーティションの番号)を省いたものがディスク名称です。
コマンド引数3つめの`1`はパーティション番号を示しています。

####④上記の`growpart`コマンドで`FAILED: failed to make temp dir`エラーが出たら…
ディスクを本当に100%のカツカツまで使い切ると発生するみたいです。
この場合の手順はこちら。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ebs-volume-size-increase/

tmpfs（メモリに格納されている一時ファイルシステム）を/tmpにマウントします。
`sudo mount -o size=10M,rw,nodev,nosuid -t tmpfs tmpfs /tmp`

コマンドの詳細はちょっとわからず、すみません…
(/と異なるディスクが割り当たっている/tmpにtmpfsを移すことで、一時的にメモリ上のtmpfsを使えるようにするってことだろうか。)
ともあれこれで、`size`オプションで指定した10Mの空き容量ができるので、`growpart`コマンドを再実行してください。

####⑤パーティションの容量をファイルシステムに反映する
③が終わったら、再び`dh -hT`コマンドを実行します。

```
Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  476M     0  476M   0% /dev
tmpfs          tmpfs      98M   11M   88M  11% /run
/dev/xxxx1     ext4      9.7G  9.7G     0 100% /
以下略
```
まだ/dev/xxxx1が20GBになっていません。
③でディスク側の準備はパーティション含め完了したものの、OS（Linux）側でそれを認識できてない状態みたいです。
なので次に、ディスク側へ増やした容量をファイルシステムへ反映させます。

ここはファイルシステムのタイプによってコマンドが異なります。
Type列がext4の場合、

```
sudo resize2fs /dev/xxxx1
```

xfsの場合、（※筆者はこっちは実行してません。ドキュメントによればこうみたいです）

```
sudo xfs_growfs -d /
```

これで容量拡張完了です。確認のために`dh -hT`コマンドを実行します。

````
Filesystem     Type      Size  Used Avail Use% Mounted on
udev           devtmpfs  476M     0  476M   0% /dev
tmpfs          tmpfs      98M  2.0M   96M   2% /run
/dev/xxxx1     ext4       20G  9.7G  9.7G  50% /
```
無事ルートディレクトリ`/`の容量が20GBになり、使用率も改善しました。
####⑥後始末
④でtmpfsのマウントを実行した場合は元に戻しておきます。

```
sudo umount /tmp
```