composer requireを実行した際にNo space left on deviceエラーが発生

## はじめに
この記事はプログラミング初学者による備忘録用の記事であり、また、少しでも他の初学者のお役に立てればと思い書いています。

今回は、LaravelでS3を扱うために``league/flysystem-aws-s3-v3``パッケージのインストールを実行すると、``No space left on device``エラーが発生し解決に時間がかかったので解決策を備忘録としてまとめておきたいと思います。
ちなみに、LaravelアプリケーションはEC2インスタンス配下でgit cloneした状態です。

間違いなどがございましたら、ご指摘のほどよろしくお願い致します。

## エラー内容 : composer requireでパッケージをインストールに失敗
Laravel6.xでAmazon S3を利用するために、``$ composer require league/flysystem-aws-s3-v3:^1.0``を実行すると下記のようなエラーが発生しました。

```
$ composer require league/flysystem-aws-s3-v3:^1.0
# 略
Downloading (100%)    Failed to download aws/aws-sdk-php from dist: 
The "https://codeload.github.com/aws/aws-sdk-php/legacy.zip/ed############e7" file could not be written to /home/###/###/laravel/vendor/aws/aws-sdk-php/4#####36:
write of 8192 bytes failed with errno=28 No space left on device
Only 188416 of 3292576 bytes written, possibly out of free disk space
    Now trying to download from source
  - Installing aws/aws-sdk-php (3.212.5): Cloning ed69594b38
```

エラー文では``No space left on device``と表示されており、ホストのディスク容量が不足していると言われています。

※league/flysystem-aws-s3-v3のバージョン指定は、[リンク先](https://readouble.com/laravel/8.x/ja/filesystem.html#composer-packages)を参考にしてください。


今回はこのエラーに対する解決策を実行順にまとめていきます。
## ``No space left on device``の解決策
### 1.Elastic Block Store(EBS)ボリュームサイズを増やす
#### 1-1.ディスクの容量を確認
まず初めに、エラーの原因であるディスク容量を確認するために``$ df -hT``コマンドを実行します。

```
[ec2-user ~]$ df -hT
ファイルシス   タイプ   サイズ  使用  残り 使用% マウント位置
devtmpfs       devtmpfs   970M     0  970M    0% /dev
tmpfs          tmpfs      978M     0  978M    0% /dev/shm
tmpfs          tmpfs      978M   25M  953M    3% /run
tmpfs          tmpfs      978M     0  978M    0% /sys/fs/cgroup
/dev/nvme0n1p1 xfs          8G     0    8G  100% /
tmpfs          tmpfs      196M     0  196M    0% /run/user/1000
```
実行結果を見ると、ファイルシステム``/dev/nvme0n1p1``の箇所が使用率100%となっており、容量が不足した状態となっています。
従って、この状態のままパッケージをインストールしても容量不足でエラーが発生してしまうのです。

これを解決するために、利用しているAWSインスタンスの**Elastic Block Store(EBS)ボリュームサイズを増やします**。

#### 1-2.利用しているAWSインスタンスのEBSボリュームサイズを増やす
下記の画面に移動後、アクションをクリックして``ボリュームの変更``を選択します。

![スクリーンショット 2022-03-11 16.37.55（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/61db17eb-2552-d8ea-bcf9-317e3c66c962.png)

``ボリュームの変更``を選択後、特定のサイズを指定して変更を実行してください。

![スクリーンショット 2022-03-11 17.24.25（2）.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/891113/15a7dca8-2376-8032-dc06-bdc4a5ee7201.png)


### 2.EBSボリュームサイズを変更後、Linuxファイルシステムの拡張を行う
EBSボリュームのサイズを変更後、ファイルシステム固有のコマンドを使用して、ファイルシステムのサイズを拡張します。(ボリュームの状態が optimizing時のみ)

Linuxでファイルシステムを拡張するプロセスは以下のとおりです。

>1.EBS ボリュームには、ファイルシステムとデータを含むパーティションが存在する場合があります。ボリュームのサイズを拡張しても、パーティションのサイズは拡張されません。サイズ変更されたボリュームのファイルシステムを拡張する前に、新しいサイズのボリュームに拡張する必要があるパーティションがそのボリュームにあるかどうかを確認します。<br>2.ファイルシステム固有のコマンドを使用して、各ファイルシステムのサイズを新しいボリューム容量に変更します。
``引用:``[AWS docs ボリュームサイズ変更後の Linux ファイルシステムの拡張](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html)

※ファイルシステムを拡張する際は、``NVMe EBS ボリューム``か``EBS ボリューム``どちらかのファイルシステムを拡張します。
各自、該当するボリュームのファイルシステムを拡張して下さい。
今回は、``NVMe EBS ボリューム``のファイルシステムを拡張する手順を下記でまとめておきます。

### ・Linuxファイルシステムの拡張手順

**1.AWSインスタンスにssh接続する**

**2.拡張前のボリュームのファイルシステムを確認するために、``$ df -hT``コマンドを実行する**

```
[ec2-user ~]$ df -hT
Filesystem      Type  Size  Used Avail Use% Mounted on
/dev/nvme0n1p1  xfs   8.0G  8.0G    0G 100% /
...
```
今回は、使用率100%であるFilesystem[``/dev/nvme0n1p1``]のサイズを拡張します。
<br>
**3.``$ lsblk``コマンドでインスタンスにアタッチされているNVMeブロックデバイスに関する情報を表示する**
ボリュームに拡張が必要なパーティションがあるかどうかを確認するには、``lsblk``コマンドを使用して、インスタンスにアタッチされている NVMe ブロックデバイスに関する情報を表示します。

```
[ec2-user ~]$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1       259:0    0  20G  0 disk
├─nvme0n1p1   259:1    0   8G  0 part /
└─nvme0n1p128 259:2    0   1M  0 part
```
ルートボリュームである``/dev/nvme0n1``には、パーティション``/dev/nvme0n1p1``があります。ルートボリュームのサイズに新しいサイズ(20 GB) が反映されている場合、パーティション(nvme0n1p1)のサイズは元のサイズ (8 GB)のままであるため、ファイルシステムを拡張する前にパーティション(nvme0n1p1)を拡張する必要があります。
<br>
**4.``growpart``コマンドを使用してパーティションを拡張する**
先ほど``lsblk``コマンドで確認したパーティション(nvme0n1p1)を、下記コマンドを実行してサイズ変更後のEBSボリュームサイズまで拡張させます。

```
[ec2-user ~]$ sudo growpart /dev/nvme0n1 1
```
``growpart``コマンドを実行後、``lsblk``コマンドで増加分のボリュームサイズがパーティションに反映されていることを確認します。

```
[ec2-user ~]$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1       259:0    0  20G  0 disk
├─nvme0n1p1   259:1    0  20G  0 part /
└─nvme0n1p128 259:2    0   1M  0 part
```

<br>

**5.パーティションを拡張後、ファイルシステムを拡張する**
各ボリュームでファイルシステムを拡張するには、下記のように利用しているのファイルシステムに適したコマンドを使用します。
今回は、``XFSファイルシステム``の拡張を実行しています。
ファイルシステムの種類を確認する際は、[リンク先](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances)等をご確認ください。

``XFS file system (XFS ファイルシステム)``を拡張するには、``xfs_growfs``コマンドを使用します。
下記コマンドの``/``と``/data``は、``$ df -hT``の出力で示されているボリュームのマウント位置です。

```
[ec2-user ~]$ sudo xfs_growfs -d /
[ec2-user ~]$ sudo xfs_growfs -d /data
```
このコマンドを実行することで、ファイルシステムを拡張することができます。
<br>
**6.最後にサイズ変更後のボリュームサイズが各ファイルシステムに反映されていることを確認します**

```
[ec2-user@ip-172-16-10-10 ~]$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
devtmpfs         970M     0  970M    0% /dev
tmpfs            978M     0  978M    0% /dev/shm
tmpfs            978M   25M  953M    3% /run
tmpfs            978M     0  978M    0% /sys/fs/cgroup
/dev/nvme0n1p1    20G     0     0    0% /
tmpfs            196M     0  196M    0% /run/user/1000
```
上記のように、``/dev/nvme0n1p1``のサイズがAWSインスタンスのEBSボリュームサイズと同じになっていればファイルシステムの拡張は成功です。

## まとめ
上記の手順を踏むことで、エラーを解決できると思います。

今回、Linuxのファイルシステム等を拡張する作業は初めて行ったので、もしかしたら間違っている可能性もあるのでご注意下さい。

## 参考文献
[ボリュームサイズ変更後の Linux ファイルシステムの拡張](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/recognize-expanded-volume-linux.html)
[Amazon EBS ボリュームの種類](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/ebs-volume-types.html?icmpid=docs_ec2_console)