tetu式

ゲームと音楽・作曲の自己満足と悩みどころの多いプログラムのブログ。

AWS EC2のインスタンスタイプ変更がなかなか面倒だった話

ちょいとお仕事でAWSに触れる機会ができたので備忘録として。

基本的にAWS EC2におけるインスタンスタイプ変更の手順は

1.AWS上で対象のインスタンスを右クリックし、インスタンスの状態->停止を選択
2.stoppedになるまで待つ
3.stoppedになったインスタンスを右クリックし、インスタンスの設定->インスタンスタイプの変更
4.変更ダイアログが表示されるので任意のインスタンスタイプを選択して適用ボタンクリック

これだけで済みます。
が、対象のインスタンスでENA周りの設定を怠っていると面倒ごとに巻き込まれます。

特に古めのインスタンスタイプから比較的最近登場したインスタンスタイプに変更する場合はひっかかりやすそうです。


で、今回そのENA周りの設定がちゃんとなってなかったことで巻き込まれた面倒ごとへの対処。
4.の適用ボタンをクリックした後、以下のようなエラーが出ました。

インスタンス開始のエラー
Enhanced networking with the Elastic Network Adapter (ENA) is required for the 'm5.large' instance type. Ensure that your instance '対象インスタンスID' is enabled for ENA.

t2.microからm5.largeへインスタンスタイプを変更しようとしたらこんな感じのエラーが出ちゃったわけですね。
簡単に訳すと
「m5.large」インスタンスタイプを使用するにはENAによるネットワーク強化が必要です。
「対象インスタンスID」でENAが有効か確認してください。
ってな感じです。

要はENAがちゃんとなってないってことですね。少しずつ確認していきます。

ENAモジュールのインストール状況確認

まず対象インスタンスがこの時点で停止しているので、一旦以前のインスタンスタイプに戻し、再稼働させます。
起動したらSSHで対象インスタンスに侵入し、以下のコマンドでENAモジュールが入っているかどうかを確認します。

$ modinfo ena

入っていなければ

modinfo: ERROR: Module ena not found.

と表示されます。
この場合は
VPC 内の Linux インスタンスにおける Elastic Network Adapter (ENA) を使用した拡張ネットワーキングの有効化 - Amazon Elastic Compute Cloud
この辺りのドキュメントを参考にしてENAをインストールします。

幸い自分の場合はモジュールがインストールされていました。
インストールされた状態で先ほどのコマンドを打つと以下のようなパラメータの羅列が表示されます。

filename:       /lib/modules/3.10.0-862.2.3.el7.x86_64/kernel/drivers/net/ethernet/amazon/ena/ena.ko.xz
version:        1.2.0k
license:        GPL
description:    Elastic Network Adapter (ENA)
author:         Amazon.com, Inc. or its affiliates
retpoline:      Y
rhelversion:    7.5
srcversion:     15437686CDA6E16E3FE5EE2
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:       3.10.0-862.2.3.el7.x86_64 SMP mod_unload modversions 
signer:         
sig_key:        
sig_hashalgo:   
parm:           

環境が特定されそうな部分があるので一部は値を消してます。

ENASupportの有効化確認とAWS CLI

続いてENASupportが有効化されているかを確認します。
確認にはAWS CLIというAWSをコマンド上でいろいろ動かすツールを使用します。

コマンドに aws と入力して反応がない場合は下記URLにしたがいAWS CLIをインストールします。
AWS CLI のインストールと設定 - Amazon Kinesis Data Streams

次にAWS CLIで色々コマンドを実行するにあたり、ユーザー情報(IAM)の設定を行う必要があります。
AWS->サービス>IAM からユーザーを開き、ユーザーの追加ボタンを押して新規ユーザーを追加します。

ユーザー詳細の設定

ユーザー名を適当に決め、AWS アクセスの種類を選択では「プログラムによるアクセス」にチェックを入れます。
もしAWSにもログインしたいユーザーとしたい場合は「AWS マネジメントコンソールへのアクセス」にもチェックを入れますが、
完全に AWS CLI にしか使わない目的であれば外しておきましょう。

追加ユーザー名の のアクセス権限を設定

既存のポリシーを直接アタッチをクリックし、検索フォームに EC2Fullと入力すると出てくる「AmazonEC2FullAccess」にチェックを入れます。
FullAccessとあるので実際にはもっと細かく設定ができるのでしょうが、ひとまずこれで・・・

確認

設定項目を確認してユーザーの作成ボタンをクリックします。

CSVファイル

その後の画面で、作成したユーザーの情報が書かれているCSVをダウンロードできます。
このタイミングでしかダウンロードできないので忘れずにしておきましょう。

CSVの中身を見るとUser name | Password | Access key ID | Secret access key | Console login linkの5項目があります。
そのうち、Passwordに関してはAWS マネジメントコンソールへのアクセスのチェックを外している場合は空欄になります。

さて、ユーザーの作成が済んだのでAWS CLIの設定を書き換えます。

AWS CLI設定

以下のコマンドを実行します

$ aws configure

すると以下の文が表示され、アクセスキーの設定をすることになります。

AWS Access Key ID [None]:

ここには先ほどのCSVAccess key IDに当たる部分を入力します。
入力したあとはシークレットアクセスキーを入力します。

AWS Secret Access Key [None]:

ここにはCSVのSecret access keyに当たる部分を入力します。
次にリージョンの設定をします。

Default region name [None]:

これは対象インスタンスのリージョンを指定します。
東京を指定しているのであれば ap-northeast-1 を入れておきます。
次で最後、出力フォーマットの指定です

Default output format [None]:

入力できるのはjson、text、tableの3択です。
プログラムなどで見慣れているのであればjsonがいいでしょう(未入力でデフォルトがjsonになるらしいです)

これでAWS CLIを使用する準備ができました。
以下のコマンドを実行してENASupportが有効化されているか確認します。

$ aws ec2 describe-instances --instance-ids 対象インスタンスID --query 'Reservations[].Instances[].EnaSupport'

対象インスタンスIDの部分はEC2のインスタンス IDを入力してください。
実行すると

[
    false
]

もしくは

[
    true
]

が表示されると思います。
もしどっちも表示されず、

An error occurred (UnauthorizedOperation) when calling the DescribeInstances operation: You are not authorized to perform this operation.

こんな感じのエラー文が出た場合はaws configureで設定したユーザー情報でポリシーが正しくアタッチされていない可能性があるのでもう一度
IAM情報を確認してみてください。

ENASupport有効化

falseと表示されてしまった場合は残念ながらENASupportが無効になっています。
これを有効化するためにまたAWS CLIを使用するのですが・・・

設定する対象インスタンスを停止させている必要があります。

なのでAWSから対象のインスタンスを右クリックし、インスタンスの状態->停止を選択します。
じゃぁどこから設定するのかというとローカルPCから設定することになります。
(別にローカルじゃなくてもAWS CLIが入っているのであれば別インスタンスのEC2から行うことも可能なはず・・・aws configureはまた設定するけど)

ローカルPCにAWS CLIを入れる方法は各自調べてください・・・
でインストールしたらコンソールなりターミナルを開いて aws configure コマンドを実行します。
設定内容は対象EC2インスタンスに行ったものと同じです。

設定が終わったら以下のコマンドを実行し、対象インスタンスのENASupportを有効化します。

$ aws ec2 modify-instance-attribute --instance-id 対象インスタンスID --ena-support

コマンドを実行したらAWSを開いてstoppedになってる対象インスタンスを右クリックし、インスタンスの状態->開始をクリックして起動させます。

起動後、改めて

$ aws ec2 describe-instances --instance-ids 対象インスタンスID --query 'Reservations[].Instances[].EnaSupport'

でENASupportの値を確認し、trueになっていれば設定完了です。

そしたら再び冒頭の1〜4の手順を実行してインスタンスタイプを変更して立ち上げることができます。