EC2をC4インスタンスからC5インスタンスへ移行する

# 概要
データ集計に利用しているc4ベースのインスタンスをc5ベースにしたいと思いました。
C5/M5にするために割と必要なことが多いのですが、EBSを使った場合に最初から最後までまとまっている記事が意外と見つからず、メモとして残しました。


# C5/M5にするために必要なこと
- NVMeドライバ対応の確認
- ENAの有効化
- マウント済みのEBSの対応（fstabの変更）


# 環境

```
$ cat /etc/system-release
Amazon Linux AMI release 2015.09

$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/xvda1       7.8G  3.9G  3.8G   51% /
devtmpfs         2.0G   60K  2.0G    1% /dev
tmpfs            2.0G     0  2.0G    0% /dev/shm
/dev/xvdb        300G   49G  252G   17% /xxx/xxxx
```


# チェックスクリプトで現状確認
なんと上述の達成状況が分かるスクリプトがAWSから提供されています。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/boot-error-linux-m5-c5/

これを実行するとC5/M5にするための対応状況が分かります。便利！

```
$ sudo ./c5_m5_checks_script.sh
------------------------------------------------

OK     NVMe Module is installed and available on your instance


ERROR  ENA Module is not available on your instance.
        - Please install ENA module before changing your instance type to M5/C5. Look at the following link for further guidance:
        > https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/enhanced-networking-ena.html#enhanced-networking-ena-linux


ERROR  Your fstab file contains device names. Mount the partitions using UUID's before changing an instance type to M5/C5.

Press y to replace device names with UUID in your fstab file? (y/n)
```

チェックと言いつつ、fstabについては変更を行おうとしてくれるので一旦 n を選択します。

## NVMeドライバ対応の確認
上記、OKになっていますが一応調べると

> Amazon Linuxでは、2015.09のバージョンから、kernel 4.1.17が採用されており、それ以降のイメージを利用していれば問題は無さそうです。
https://dev.classmethod.jp/cloud/aws/change-type-to-m5-nitro-generation/

とのことで、幸運にも大丈夫だったようです。

## ENAの有効化
modify-instance-attributeというサブオプションで--ena-supportを指定すると有効になります。

```
$ aws ec2 modify-instance-attribute --instance-id i-xxxxxxxxxxxx  --ena-support
usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
To see help text, you can run:

  aws help
  aws <command> help
  aws <command> <subcommand> help

Unknown options: --ena-support
```
が、aws_cliのバージョンが古いとエラーとなります...

バージョンアップ後実行

```
$ aws ec2 modify-instance-attribute --instance-id i-xxxxxxxxxxxx  --ena-support

An error occurred (IncorrectInstanceState) when calling the ModifyInstanceAttribute operation: The instance 'i-xxxxxxxxxxxx' is not in the 'stopped' state.
```

が、stoppedじゃないと実行できません。
他のインスタンスで実行。

```
$ aws ec2 modify-instance-attribute --instance-id i-090297c84c36d4b5f  --ena-support
$ 
```
音もなく終了。
インスタンスを**C4のまま**立ち上げます。


## マウント済みのEBSの対応（fstabの変更）
先ほどのチェックスクリプトを再度実行します。

```
$ sudo ./c5_m5_checks_script.sh
------------------------------------------------

OK     NVMe Module is installed and available on your instance


OK     ENA Module with version 1.5.0g is installed and available on your instance


ERROR  Your fstab file contains device names. Mount the partitions using UUID's before changing an instance type to M5/C5.

Press y to replace device names with UUID in your fstab file? (y/n) y
```

fstabを書き換えます（yを選択）

```
Writing changes to /etc/fstab...


***********************
#
LABEL=/     /           ext4    defaults,noatime  1   1
tmpfs       /dev/shm    tmpfs   defaults        0   0
devpts      /dev/pts    devpts  gid=5,mode=620  0   0
sysfs       /sys        sysfs   defaults        0   0
proc        /proc       proc    defaults        0   0

#####
UUID=3xxxxxxd-9xx7-4xxc-8xx5-fxxxxxxxxxbc /xxx/xxxx xfs defaults 0 0

***********************

Original fstab file is stored as /etc/fstab.backup.2018-09-20-10:36:32
```

/etc/fstabが書き変わりました。メッセージの通り、同ディレクトリにバックアップが取られています。

**※C5インスタンスに変えたあと実行すると書き変わらないようです。**

もう一度チェックスクリプトを実行すると、無事全てOKに。

```
$ sudo ./c5_m5_checks_script.sh
------------------------------------------------

OK     NVMe Module is installed and available on your instance


OK     ENA Module with version 1.5.0g is installed and available on your instance


OK     fstab file looks fine and does not contain any device names.

------------------------------------------------
```

インスタンスを停止し、C5インスタンスに変更し起動すれば完了です！

また、再起動するとちゃんとEBSがマウントされていることも確認できました。

```
$ df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/xvda1       7.8G  3.9G  3.8G   51% /
devtmpfs         2.0G   60K  2.0G    1% /dev
tmpfs            2.0G     0  2.0G    0% /dev/shm
/dev/xvdb        300G   49G  252G   17% /xxx/xxxx
```