Nitro世代にインスタンスタイプを切り替えたいっ!~準備からトラブルシューティングまで~

湿気がしんどくて乾燥剤に包まれたい。

▲ しょうもない事を考えてしまうのも高湿度の影響です

こんにちは。AWS事業本部のShirotaです。
皆様は今年の厳しい暑さの中、元気にお過ごしでしょうか?
これだけ暑いともう暫くは海で遊べそうですが、例年お盆後はクラゲが発生したりと海水浴シーズンも終わりを迎えてしまいそうでちょっと残念ですね。 私は今年まだ一度も海で遊んでいません。 悲しい。

そんな個人の感想はひとまず置いておき、今日はネットの海にDeepDiveしながらEC2インスタンスで色々と検証した事についてお話したいと思います。

非Nitro世代インスタンスをNitro世代インスタンスに変えたいシンプルな理由

インスタンスは基本的に最新世代のインスタンスタイプの方が仕様料金も安くなっている事が多いです。
例えば、代表的なOSでt系のオンデマンドインスタンス料金(東京リージョン/2019年8月15日現在)を比較すると、次のようになっています。

インスタンスタイプ/OS Amazon Linux Red Hat Enterprise Linux(RHEL) SUSE Linux Enterprise Server(SLES) Windows Server
t2.micro 0.0152USD/h 0.0752USD/h 0.0252USD/h 0.0198USD/h
t3.micro 0.0136USD/h 0.0736USD/h 0.0136USD/h 0.0228USD/h

その他インスタンスタイプのオンデマンド料金を確認したい場合は、以下のリンクを参考にして下さい。

Amazon EC2 料金表

また、当たり前と思われるかもしれませんが、最新世代のインスタンスタイプの方がスペックが良い為、AWSでは最新世代のインスタンスの使用が推奨されています。
例えば、拡張ネットワーキングを可能にするElastic Network Adapter(ENA)をサポートしているインスタンスタイプは、2019年8月15日現在以下のようにユーザーガイドに記載されています。

サポートされているインスタンスタイプは次のタイプのみです: A1, C5, C5d, C5n, F1, G3, H1, I3, I3en, m4.16xlarge, M5, M5a, M5ad, M5d, P2, P3, R4, R5, R5a, R5ad, R5d, T3, T3a, u-6tb1.metal, u-9tb1.metal, u-12tb1.metal, X1, X1e, and z1d。

さて、ここで「 AWSで推奨されているし、拡張ネットワーキングで低レイテンシーを実現したいし、ENAがサポートされているインスタンスタイプに変更したい! 」と考えたとします。
この時どうしたらいいのかを考えていきましょう。

インスタンスタイプの切り替え方法

インスタンスタイプの切り替えを実施したい、と考えた際にまず確認する事は 拡張ネットワーキングを可能にする環境の要件 です。
要件として挙げられるものは以下です。

  • ハードウェア仮想マシン(HVM)である事
  • ENA 拡張ネットワーキングが有効化されている事(AMI,インスタンス共に)
  • NVMeドライバがインストールされている事
  • ENAをサポートしているインスタンスタイプの利用が許可されているAMIである事

基本的に、NVMeドライバ(ストレージ規格の一種)に関しては、最新のカーネルを使用していれば組み込まれていると考えていいでしょう。

要件の確認手段

上記の確認手段としては、まずEC2の構築時にAMIを選択する時に確認できます。

▲ 下部にちらっと記載があります

このAmaszon Linux2のAMIはVirtualization typeが hvmで、ENA Enabledが Yesとなっているので上記の要件に合致していそうだと分かります。
Marketplace AMIだと、AMI選択後に以下のようなポップアップが出るので、そこで要件を確認できます。

▲ ENAが有効化されているかは判断出来ない

切り替え対象のインスタンスに対して、ローカルからAWS CLIを使ってENAが有効化されているかどうかの確認ができます。
インスタンスに対して、enaSupport属性を確認する事で、インスタンスにおいてENAが有効化されている事が確認できます。

$ aws ec2 describe-instances --instance-ids i-XXXXXXXXXXX --query "Reservations[].Instances[].EnaSupport"
[
     true
]

上記のように、属性が設定されているとレスポンスにtrueが返ってきます。
無効の場合は[]と空欄で返ってきます。
同様に、AMIに対してもenaSupport属性を確認します。

$ aws ec2 describe-images --image-id ami-XXXXXXXXXXXX --query "Images[].EnaSupport"
[
    true
]

属性が設定されていると、レスポンスにtrueが返ってきます。 無効の場合は[]と空欄で返ってきます。

Amazon Linux 2は簡単に切り替えられる  

要件が整っているのを確認したら、まずはAWSで提供されているAmazon Linux 2 でt2 → t3への切り替えを試してみます。

▲ インスタンスが起動していると切り替えができないので止めましょう

▲ 切り替え前。停止してある事を確認

▲ t3.microへ切り替えてみます

▲ インスタンスタイプが切り替わりました!瞬殺でした

このように、簡単にインスタンスタイプの切り替えができました。

その他のOSでも試してみる

次に、先ほど要件の確認手段を確かめる時に確認した、Marketplace AMIにあるCentOS 7でも切り替えを試してみます。

▲ Amazon Linux 2の時と同じ手順でいけました

Windows Server 2016の最新のAMIでも試してみました。

▲ 停止からの切り替え、楽です

Red Hat Enterprise Linux(RHEL) 8も同様に切り替えできました。
最新のAMIは、ほぼほぼ拡張ネットワーキングに対応しているという事が分かります。

ENAドライバが対応しているカーネル及びディストリビューション

これについては、以下のページで確認できます。

ENA Linux Kernel Driver Release notes

要件を満たさない状態でインスタンスタイプを切り替えると……

上記に記載した要件を満たさない状態で同様の切り替え手段を実施するとどうなるのでしょうか。

Marketplace AMIで、ENAをサポートしているインスタンスタイプの利用が許可されていなかった場合

以下のようなエラーが出ます。

▲ サポートされているインスタンスタイプを確認してねと怒られました

この場合、Marketplace AMI側で許可が出ない限りは利用できません。
念の為、ENAの有効化とENAドライバーのインストールを実行してからEBSスナップショットを取得し、そこからAMIを作成してみましたが同様のエラーが出ました。
実際に、t3をサポートしていないMarketplace AMIでローンチしたEC2のEBSを見てみます。

▲ Product codesに記載があります

ここに記載されたコードでライセンスを管理していると思われます。
なので、スナップショットを取ってもそこからAMIを作成しても、どのMarketplace AMIを元にしているのかが判別できます。
この為、このAMIをベースにする以上はサポートされていないインスタンスタイプへの切り替えが不可能となります。
対処法としては、

  • AWSサポートへ相談する
  • サポートされているインスタンスタイプの利用が許可されているAMIを使う

となりますが、基本的に「サポートされていない」ということは「そのインスタンスタイプでの動作を保証していない」という事なので、 サポートされているインスタンスタイプの利用が許可されているAMIを使う事がベストな対処法である と思われます。

ENA Enabledが No となっているAMIを使用した場合

主な実例としては、古いインスタンスを切り替えようとした際に起こります。
この場合、切り替えの手順自体はうまくいくのですが、切り替えたインスタンスを立ち上げようとするとエラーが出ます。

▲ ENAの有効化をしてくれと怒られました

この場合は、 ENAの使用が可能な状態になればインスタンスタイプの切り替えが可能 です。

ENAが使用できる状態にインスタンスをセットアップする

ここからは、ENAが使用できる状態にインスタンスをセットアップする手順を纏めていきます。 Nitro世代のインスタンスタイプへ切り替えを実際にやってみた系ブログが、弊社にはいくつもあったのでそちらのリンクと公式ドキュメントへのリンクを最後に纏めておきます。

ENAドライバーはダウンロードされているか?

まずはENAドライバーがインストールされているかを確認します。

Linuxの場合

Amazon Linux 2やCentOS、Red Hat Enterprise Linuxでは以下のコマンドを実行する事でENAドライバーがインストールされているかが確認できます。 実際に、ENAドライバーが無かった時の結果と共に載せます。

$ modinfo ena
modinfo: ERROR: Module ena not found.

ENAドライバーがある場合は以下のような結果が出力されます。

$ modinfo ena
filename:       /lib/modules/4.14.133-88.112.amzn1.x86_64/kernel/drivers/amazon/net/ena/ena.ko
version:        2.1.1g
license:        GPL
description:    Elastic Network Adapter (ENA)
author:         Amazon.com, Inc. or its affiliates
srcversion:     B9F643A0D5E12CFFEDBAD05
alias:          pci:v00001D0Fd0000EC21sv*sd*bc*sc*i*
alias:          pci:v00001D0Fd0000EC20sv*sd*bc*sc*i*
alias:          pci:v00001D0Fd00001EC2sv*sd*bc*sc*i*
alias:          pci:v00001D0Fd00000EC2sv*sd*bc*sc*i*
depends:
retpoline:      Y
intree:         Y
name:           ena
vermagic:       4.14.133-88.112.amzn1.x86_64 SMP mod_unload modversions
parm:           debug:Debug level (0=none,...,16=all) (int)
parm:           rx_queue_size:Rx queue size. The size should be a power of 2. Max value is 8K
(int)
parm:           force_large_llq_header:Increases maximum supported header size in LLQ mode to 224 bytes, while reducing the maximum TX queue size by half.
(int)

Windows Serverの場合

PowerShellで以下のコマンドを実行するとENAドライバーがインストールされているかが確認できます。

PS C:\Users\Administrator> Get-CimInstance Win32_SystemDriver -Filter "name='ena'"
DisplayName : Amazon Elastic Network Adapter Driver
Name        : ena
State       : Stopped
Status      : OK
Started     : False

上記作業を実行後、ENAドライバーがインストールされていない事が分かった場合はインストールを実施して下さい。
簡単にやり方を説明すると、

  • Amazon Linuxの場合: sudo yum updateを実行して最新のENAを含むカーネルとカーネルモジュールをインストールする
  • Ubuntuの場合: sudo apt-get update && sudo apt-get upgrade -y linux-aws でパッケージを更新する
  • その他のLinuxの場合: GitHubからENAモジュールのソースをクローンし、コンパイルする
  • Windows Serverの場合: ENAドライバーをここ " target="_blank" rel="noopener">リンク名からインストールする

Linux系はカーネルのアップデートも同時に行なっているのでNVMeドライバが自動で組み込まれますがWindows Serverの場合はここからインストールを行なって下さい。

ENAが有効化されているかを確認する

これは、前述した「インスタンスタイプの切り替え方法」の「要件の確認手段」に記載しているAWS CLIを使用してENAが有効化されているかを確認して下さい。
インスタンスを停止後、AWS CLIで以下コマンドを実行してENAを有効化します。

    aws ec2 modify-instance-attribute --instance-id i-XXXXXXXXX --ena-support

また、このインスタンスからAMIを作成すると、 インスタンスからenaSupport情報を継承する のでデフォルトでENAが有効となるインスタンスが作成できるようになります。

参考資料

公式ドキュメント関係

Linux インスタンスにおける Elastic Network Adapter (ENA) を使用した拡張ネットワーキングの有効化
Windows インスタンスにおける Elastic Network Adapter (ENA) を使用した拡張ネットワーキングの有効化
Windows インスタンス用 AWS NVMe ドライバー

クラメソブログ

NITRO世代(C5、M5)へのEC2インスタンスタイプ変更を試してみた(Amazon Linux編) #reinvent
(Red Hat編)Nitro世代(C5、M5、T3)へのEC2インスタンスタイプ変更を試してみた
2012年当時のWindows2008R2環境をNITRO世代のインスタンスに変更してみた
既存 Windows インスタンスを Nitro 世代(m5,c5,t3 …)に移行する手順まとめ ※’18/12 update対応版

環境の更新か新規作成かは適宜選択しよう

今現在使用しているインスタンスを更新すればNitro世代が使えるようになるのか、そもそも新規でNitro世代対応のAMIを使用しないといけないのかは事前に確認する必要があります。
また、作業の手間を鑑みると新規でインスタンスを作成し直した方が早い場合もあると思います。
Nitro世代は、ネットワーク面で見てもストレージ面で見ても強化されているインスタンスタイプなので事前確認をしっかりしてから利用して下さい。