Amazon EC2 (AWS) のインスタンスファミリーを t2 → t3 に移行した

Amazon EC2 (AWS) で動かしていた t2 インスタンスを、今更ながらですが、t3 インスタンスへ移行したので、そのメモ書き。

t3 インスタンスに変更すると、CPUクレジットの扱いが少し変わりますが、コストパフォーマンスはよくなるケースが多いはず。
t2 から t3 へ移行したブログエントリーは探すといくつか見つかるが、日本語での欲しい情報にたどりつけなかったこともあり、その辺もこのエントリにメモしておくことにする。

はじめに: このエントリーを書こうと思ったきっかけ

事前に作成されていたAMIから都度 t2 インスタンスを起動して使用するようなユースケースが前提としてあり、その保存済みのAMIからは、t3 インスタンスが起動できない状態でした。

インスタンスタイプの選択画面はこんな感じ。

で、この保存済みの AMI の設定をなんとか変更して、t3 インスタンスタイプに対応できないか、と色々調べたのですが、結論としては、AMI を再作成しないといけない模様。多分。

ので、やったことはシンプルに AMI からインスタンスを起動し、t3 でも起動可能な設定を行い、AMIを再作成するという流れで行いました。

ということで、以下の公式ドキュメントを参考に作業したので、こちらを見てもらう方が確実かもしれない。

確認していくべきこと

t3 インスタンスで動かすためには、ENA (Elastic Net Adapter) を有効化する必要があります。

お使いのインスタンスで ENA サポートが有効かどうかは、

  • カーネルモジュール (ena) が有効になっているか
  • "enaSupport" 属性が設定されているか

を確認する必要があります。

次の AMI には必要な ENA モジュールが含まれており、ENA のサポートが有効になっています。

  • Amazon Linux 2
  • Amazon Linux AMI 2018.03
  • Ubuntu 14.04 (linux-awsカーネル) 以降
  • Red Hat Enterprise Linux 7.4 以降
  • SUSE Linux Enterprise Server 12 SP2 以降
  • CentOS 7.4.1708 以降
  • FreeBSD 11.1 以降
  • Debian GNU/Linux 9 以降
Linux/ インスタンスにおける Elastic Network Adapter (ENA) を使用した拡張ネットワーキングの有効化 - Amazon Elastic Compute Cloud

実際の確認ログ

既存の AMI から EC2 インスタンスを起動して、 ena モジュールが有効化されているかを確認します。

# modinfo ena
filename:       /lib/modules/4.9.76-3.78.amzn1.x86_64/kernel/drivers/amazon/net/ena/ena.ko
version:        1.4.0U
license:        GPL
description:    Elastic Network Adapter (ENA)
author:         Amazon.com, Inc. or its affiliates
srcversion:     963AA763EBF4D86DF9EF826
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:
intree:         Y
vermagic:       4.9.76-3.78.amzn1.x86_64 SMP mod_unload modversions
parm:           debug:Debug level (0=none,...,16=all) (int)

modinfo コマンドで確認。有効化されていますね。
もし有効化されていない場合、Amazon Linux の最新バージョン等では、ENA がインストールされた拡張ネットワーキングに必要なモジュールが含まれているとのことなので、 "sudo yum update" などで最新に更新してみましょう。
(OSのアップデートについては、OSによって手順が異なりますが、その説明はここでは割愛します。)

次、ネットワークインターフェースでドライバーがロードされているかを確認します。

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

ふむ。ena ではなく vif モジュールがロードされています。

ということで次、インスタンスに enaSupport 属性が設定されているかどうかを確認します。
動かしているインスタンスIDを調べた上で、AWS CLIの以下コマンドを実行してみます。

$ aws ec2 describe-instances --instance-ids i-xxxxxxxx --output json | jq '.Reservations[].Instances[].EnaSupport'
null

値がつまっていないので設定されていないですね。
ということで、次に拡張ネットワーキングの設定を行います。

拡張ネットワーキング (enaSupport 属性) の設定

こちらも AWS CLI の以下コマンドで実行。

$ aws ec2 modify-instance-attribute --instance-id i-xxxxxxxx --ena-support

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

エラーが返ってきました。
インスタンスが稼働したままでは設定変更ができないようなので、インスタンスを停止してから、再実行します。

$ aws ec2 modify-instance-attribute --instance-id i-xxxxxxxx --ena-support

エラーが返ってきていないので、今度は問題なさそうです。(ちゃんと終了コード見るべきかw)

$ aws ec2 describe-instances --instance-ids i-xxxxxxxx --output json | jq '.Reservations[].Instances[].EnaSupport'
true

上記のように確認のコマンドを実行したところ、問題なく "true" が返ってきています。これで有効化された、と。

この状態で、AMI を再作成しておけば、ENAが有効化された AMI となります。
(ということで AMI を作成した。)

t3 インスタンスを起動して確認

さて、EC2 インスタンスを起動する際の AMI の選択画面を見ると、先ほど作成した AMI は、以下のような感じで、"ENA 有効" の項目が "はい" になっていることが確認できます。

ENA が有効なAMIを作成すると、以下のように t3 ファミリーのインスタンスを選択して起動することができます。

で、t3 インスタンスは問題なく起動したので、実際に起動したインスタンスで、ネットワークインターフェースのドライバーに ena があたっているかを確認してみると、、、

# ethtool -i eth0
driver: ena
version: 1.4.0U
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

OK、変更されていますね。


手順はざっくりこんな感じでしたー。
それでは!=͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́