概要
年に一度RI購入のためサーバーの棚卸しをするのですが、その時にT2インスタンスがちらほら...。 AWSも最新のファミリータイプを使用することを推奨しているので、ここいらでT3にするぞと対応したらドハマりしました。
今回はAWS EC2 Ubuntu 14.0.4インスタンスをT2からT3に移行で「FATAL: Could not load /lib/modules」または「BusyBox」 (カーネルモジュールの欠如)によりステータスチェックが1/2になってしまった時の対応方法を紹介します。
発生したこと
発生したことは大きく2つです。
- ENAを有効にしていないがために、T3ファミリータイプに変更して起動しようとすると警告が表示される
- インスタンスのステータスチェックが失敗し、SSHができない。
ENAを有効にしていないのは、割とあるあるなようですが、インスタンスのステータスチェックの失敗を解決するのに時間を取られました。
対応したこと
ENAを有効にする
公式ドキュメントを参考に作業をしました。
まず、ENAが有効になっているか確認します。
aws ec2 describe-instances --instance-ids インスタンスID --query "Reservations[].Instances[].EnaSupport"
有効になっていない場合、空配列が返ってきます。(有効になっている場合は、trueが返ってきます。)
次に、ENAを有効にします。ENAを有効にするには、
- インスタンスを停止する
- 別のインスタンスまたはローカルから以下のコマンドを実行する
aws ec2 modify-instance-attribute --instance-id インスタンスID --ena-support
最後に再度、ENAが有効になっているか確認します。有効になっている場合は、trueが返ってきます。
インスタンスのステータスチェックが失敗し、SSHができない
インスタンスのステータスチェックが失敗する理由の一覧はこちらです。
これらの中で、自分は「FATAL: Could not load /lib/modules」または「BusyBox」 (カーネルモジュールの欠如)を引き当てました。ありがとうございます。
推奨する対処がなかなかの塩っぷりなので、かなり厳しいです。
しかし、Q&Aに答えがありました! aws.amazon.com
どうやらNitroInstanceChecksスクリプトなるものがあり、これを全てパスするとNitroInstance(T3ファミリータイプ)にできるということです。
こちらのスクリプトは以下を確認しています。
- ENAが有効になっているか
- NVMeモジュールが有効になっているか
- fstabファイルが存在し、デバイス名が含まれていないこと
ENAは先述の通り有効にしているため、NVMeモジュールかfstabファイル周りが原因であることがわかります。 さらに!こちらのスクリプトはfstabをいい感じに(デバイス名をUUIDに置換)してくれます。
すると、残る問題はNVMeモジュールを有効にするだけです。
こちらについても、AWSの公式ドキュメントがありました!
これらを解決すると、先ほどのNitroInstanceChecksスクリプトで以下のような実行結果を得られます。
------------------------------------------------ OK NVMe Module is installed and available on your instance OK ENA Module is installed and available on your instance OK fstab file looks fine and does not contain any device names. ------------------------------------------------
対応は以上です。
まとめ
AWS EC2のT2ファミリータイプをNitro世代(T3)に移行する際に発生した問題は2つです。
- ENAを有効にしていないがために、T3ファミリータイプに変更して起動しようとすると警告が表示される
- インスタンスのステータスチェックが失敗し、SSHができない。
問題の多くはENAを有効にするだけで解決するはずです。しかし、Amazon Linux以外のOSを使用していると、インスタンスチェックが失敗することがあります。
自分の場合はUbuntu 14.0.4を使用していました。
トラブルシューティング方法は基本的にはAWS公式ドキュメントで事足りました(しかし情報が散らばっていたので、発生している事象からたどり着くしかなかったので時間がかかった)。
インスタンスのステータスチェックのトラブルシューティングは多岐に渡るため、一概にこの解決方法で!というわけにはいきませんが、自分の場合は色々調べた結果、以下の方法が近道だと感じました。
- まずはステータスチェックに失敗したインスタンスのトラブルシューティング を確認する
- 推奨する対処を確認する
- 推奨する対処に記載されている語句でAWSのドキュメントを検索する