(Red Hat編)Nitro世代へのEC2インスタンスタイプ変更を試してみた

Red Hatの旧世代EC2インスタンスをNitroベースのインスタンスタイプに変更する方法を解説します。Nitroを利用するには、Elastic Network Adapter (ENA)モジュールとNVMe モジュールを有効化する必要があります。
2018.10.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

更新:2020/06/09 Nitro対応をチェックするスクリプト名(c5_m5_checks_script.shからnitro_check_script.shへ)、ナレッジベースURLの変更を反映しました。

re:Invent 2017で発表された Nitro システムでは AWS が構築したハードウェアとソフトウェアのコンポーネントが一体化され、この上で動作する各インスタンスは、 高パフォーマンス、高可用性、優れたセキュリティを実現し、ベアメタル機能を備えることで仮想化オーバーヘッドを排除します。

C5/C5d, M5/M5d に続き、8月からは T3 のインスタンスタイプも提供されています。

旧世代のインスタンスタイプ(C3系)で動作する Red Hat を Nitro 世代のインスタンスタイプに変換する機会がありましたので、手順を紹介します。

他のプラットフォームでの対応方法は以下の記事を参照ください。

検証環境

RHEL 6系の最新公式AMIを利用します。

RHEL-6.10_HVM_GA-20180810-x86_64-0-Hourly2-GP2 (ami-06e361057b216c8de)

作業の流れ

インスタンスを Nitro システムに移行する場合、以下の流れで作業します。

  1. nitro_checks_script.sh を実行してシステム要件を満たしているかチェック
  2. NVMe ドライバーをインストール
  3. ENA ドライバーをインストール && インスタンスの enaSupport 属性を有効
  4. インスタンスタイプを変更

Nitro システム要件のチェック

Nitro システムを利用する上では

  • NVMe モジュール
  • Elastic Network Adapter(ENA) モジュール

がインストールされている必要があります。

AWS が提供するスクリプト nitro_checks_script.sh を実行することで、要件を満たしているか簡単にチェックできます。

nitro_checks_script.sh の実行方法

このスクリプトは GitHub の次のレポジトリで提供されています。

aws-support-tools/EC2/NitroInstanceChecks at master · awslabs/aws-support-tools · GitHub

Nitro に変換したいインスタンス内にダウンロードし、ルート権限で実行するだけです。

nitro_checks_script.sh

$ curl -L -o nitro_checks_script.sh https://raw.githubusercontent.com/awslabs/aws-support-tools/master/EC2/NitroInstanceChecks/nitro_check_script.sh
$ chmod +x nitro_checks_script.sh
$ sudo ./nitro_checks_script.sh
------------------------------------------------

OK     NVMe Module is installed and available on your instance
cat: /etc/os-release: No such file or directory


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


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

------------------------------------------------
$

NVMe モジュールはインストールされているが、ENA モジュールはインストールされていないことがわかりました。

Red Hat 6 に ENA モジュールをインストール

RHEL 6.10 に ENA をインストールします。

Linux 向け ENA ドライバーは GitHub の次のレポジトリで提供されています。 今回は最新バージョンの 1.6.0 をインストールします。

https://github.com/amzn/amzn-drivers

リリース済みバージョン一覧は次の URL から確認できます。

https://github.com/amzn/amzn-drivers/releases

インストールに必要なパッケージをインストール

$ sudo yum update -y
$ sudo yum install -y gcc kernel-devel
$ sudo reboot

カーネルアップデート後も $ uname -r が最新のカーネルバージョンを指すように、リブートしています。

ソースコードの取得

GitHub から ENA ドライバーのソースコードを取得します。

$ VERSION=1.6.0
$ curl -L -o ena_linux_${VERSION}.tar.gz https://github.com/amzn/amzn-drivers/archive/ena_linux_${VERSION}.tar.gz
$ tar zxfv ena_linux_${VERSION}.tar.gz
$ cd amzn-drivers-ena_linux_${VERSION}

バージョンは適宜読み替えてください。

ENA モジュールのコンパイル

$ cd kernel/linux/ena/
$ make
make -C /lib/modules/2.6.32-754.6.3.el6.x86_64/build M=/home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena modules
make[1]: Entering directory `/usr/src/kernels/2.6.32-754.6.3.el6.x86_64'
  CC [M]  /home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena/ena_netdev.o
  CC [M]  /home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena/ena_ethtool.o
  CC [M]  /home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena/../common/ena_com//ena_com.o
/home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena/../common/ena_com//ena_com.c: In function ‘ena_com_reg_bar_read32’:
/home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena/../common/ena_com//ena_com.c:635: warning: passing argument 2 of ‘__read_once_size’ discards qualifiers from pointer target type
include/linux/compiler.h:173: note: expected ‘void *’ but argument is of type ‘volatile short unsigned int *’
  CC [M]  /home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena/../common/ena_com//ena_eth_com.o
  CC [M]  /home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena/ena_sysfs.o
  LD [M]  /home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena/ena.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena/ena.mod.o
  LD [M]  /home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena/ena.ko.unsigned
  NO SIGN [M] /home/ec2-user/amzn-drivers-ena_linux_1.6.0/kernel/linux/ena/ena.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.32-754.6.3.el6.x86_64'

カレントディレクトリに ena.ko が作成されます。 これをインストールします。

$ sudo cp -v ena.ko /lib/modules/$(uname -r)/
`ena.ko' -> `/lib/modules/2.6.32-754.6.3.el6.x86_64/ena.ko'
$ sudo depmod # カーネルモジュールの依存関係情報を更新
$ modinfo ena
ilename:       /lib/modules/2.6.32-754.6.3.el6.x86_64/ena.ko
version:        1.6.0g
license:        GPL
description:    Elastic Network Adapter (ENA)
author:         Amazon.com, Inc. or its affiliates
retpoline:      Y
srcversion:     E69DD4FD80D67736CAFC212
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:
vermagic:       2.6.32-754.6.3.el6.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

ブート時に新規モジュール ena を読み込むように、dracut コマンドを実行して initramfs を更新します。

$ sudo dracut -f -v --add-drivers ena

nitro_checks_script.sh を再実行

Nitro のシステム要件をチェックする nitro_checks_script.sh を再実行します。

$ sudo ./nitro_checks_script.sh
------------------------------------------------

OK     NVMe Module is installed and available on your instance
cat: /etc/os-release: No such file or directory


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


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

------------------------------------------------

すべて OK となっています。

以上で EC2 インスタンス内の作業は完了です。

EC2 インスタンスに対する操作

インスタンスに拡張ネットワーキング用の enaSupport 属性を有効にし、Nitro系インスタンスに変更します。

enaSupport 属性を有効化

変更前の enaSupport 属性は false となっています。

$ IID=i-1234 # インスタンスID
$ aws ec2 describe-instances \
  --instance-ids $IID \
  --query 'Reservations[].Instances[].EnaSupport'
[
    false
]

インスタンスを stopped 状態にして、この属性を有効にします。

$ aws ec2 modify-instance-attribute \
  --instance-id $IID \
  --ena-support
$ aws ec2 describe-instances \
  --instance-ids $IID \
  --query 'Reservations[].Instances[].EnaSupport'
[
    true
]

インスタンスタイプを変更

Nitro系の t3.micro に変更します。

$ INSTANCE_TYPE=t3.micro
$ aws ec2 modify-instance-attribute \
  --attribute instanceType \
  --instance-id $IID \
  --value $INSTANCE_TYPE

インスタンスタイプは管理コンソールからも変更可能です

変更可能なインスタンス一覧に、Nitro 系の T3 ファミリーを確認できます。

ネットワークインターフェイスドライバーの違い

EC2 インスタンスを起動後、NIC ドライバーを確認すると、 vif から ena に変わっていることがわかります。

ena モジュールロード前

$ ethtool -i eth0
driver: vif
version:
firmware-version:
bus-info: vif-0
supports-statistics: no
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no

ena モジュールロード後

$ ethtool -i eth0
driver: ena
version: 1.6.0g
firmware-version:
bus-info: 0000:00:05.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no

Red Hat の ドライバー対応状況について

NVMe 対応状況について

6 系の場合、2013年11月にリリースされた 6.5 以降で対応しています。

Red Hat Launches Latest Version of Red Hat Enterprise Linux 6

ENA 対応状況について

6系の場合、最新(6.10)のAMIでも未対応です。

7系の場合、7.4以降で対応しています。

まとめ

インスタンスを Nitro システムに移行する場合、以下の流れで作業します。

  1. nitro_checks_script.sh を実行してシステム要件を満たしているかチェック
  2. NVMe ドライバーをインストール
  3. ENA ドライバーをインストール && インスタンスの enaSupport 属性を有効
  4. インスタンスタイプを変更

RHEL 6 系の最新公式 AMI では ENA が有効になっていなかったため、ENA カーネルドライバーのインストールと ENA 属性の有効化を行いました。

DKMS を使ってカーネルモジュールを管理したい場合、次の gist を参考にしてください。

https://gist.github.com/kwilczynski/36914ee29e31f7dbd27b4f6742dc96b3

それでは。

参考