クラウドインテグレーション事業部の尾谷です。
先日、拡張ネットワーキングが有効になっていない EC2 インスタンスのインスタンスファミリーを t2 から t3 に切り替えました。
OS は CentOS 6 でした。
以下の公式サイトに沿って拡張ネットワーキングを有効化しましたが、手順通りに進まない箇所もあり、なかなか勉強になったのでまとめてみました。
Linux インスタンスにおける Elastic Network Adapter (ENA) を使用した拡張ネットワーキングの有効化
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/enhanced-networking-ena.html
要件
まず、今回起動した EC2 インスタンスが拡張ネットワーキングに対応している OS か確認しました。
公式サイトには、
サポートされているバージョンの Linux カーネルとサポートされているディストリビューションを使用してインスタンスを起動します。
と記載があります。そして、以下 Git の情報を参照するように記載がされています。
CentOS 6 はマイナーバージョン関係なく、まるっと対応しているようです!
(2012/02/27 現在)
インスタンスはプライベートサブネットで起動
今回利用した AMI (Amazon Machine Image) は以下でした。
base-centos-6.10 - ami-06ce8b33d8f4f2ddd
古いイメージでセキュリティ面に不安を感じましたので、プライベートサブネットに起動し、パブリックサブネットに起動した踏み台サーバー (Amazon Linux 2) を経由して SSH ログインしました。
踏み台から対象へ SSH 接続を試みまして、
[ec2-user@ip-172-16-0-106 ~]$ ssh -l centos 172.16.2.200 -i .ssh/forge-tech-blog.pem
[centos@ip-172-16-2-200 ~]$
無事入れました。
拡張ネットワーキングが有効化されているかどうかのテスト
次に、ena モジュールがインストールされているか確認します。
$ modinfo ena
ERROR: modinfo: could not find module ena
$
ena モジュールがインストールされていないため、公式サイトに記載されているとおりのエラーが出力されました。
インスタンスに拡張ネットワーキングの enaSupport 属性が設定されているかどうかも確認しました。
$ aws ec2 describe-instances --instance-ids ★インスタンス ID ★ --query "Reservations.Instances.EnaSupport" --region ap-northeast-1
Unable to locate credentials. You can configure credentials by running "aws configure".
IAM ロールを設定せずに実行してしまったので、エラーになりました。
そこで、この後の手順で必要になるポリシーも含めたロールを作成しました。
そして、EC2 用のサービスベースロールに次のインラインポリシーをアタッチします。
以下のような JSON を書きました。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "EnaExtention",
"Effect": "Allow",
"Action": [
"ec2:DescribeImages",
"ec2:DescribeInstances",
"ec2:DescribeInstanceAttribute",
"ec2:RegisterImage"
],
"Resource": "*"
}
]
}
作成したロールを EC2 にアタッチします。
- EC2 インスタンスを選択
- [アクション] ボタンから、[インスタンスの設定] -> [IAM ロールの割り当て/置換] を選択
- ロールを選択して、[適応] ボタンをクリック
aws configure を設定せずに、--region を指定してコマンドを投入してみました。
$ aws ec2 describe-instances --instance-ids ★インスタンス ID ★ --query "Reservations.Instances.EnaSupport" --region ap-northeast-1
[]
$
何もレスポンスが返ってきませんでした。
これは対応していると判断して良いのでしょうか。続いて、イメージ属性も確認してみます。
$ aws ec2 describe-images --image-id "★ AMI ID ★" --query "Images.EnaSupport" --region ap-northeast-1
[]
$
こちらも空でした。
念のため、ネットワークインターフェイスドライバーの確認手順も実施しました。ドライバーはロードされていませんでした。
$ 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
$
この段階だけでは判断がつきませんが「true が返ってこない = 拡張ネットワーキングには対応していない」と仮定して手順を進めることにしました。
Linux での拡張ネットワーキングの有効化
CentOS の手順は公式ページの「Linux での拡張ネットワーキングの有効化」という見出しに当てはまりますので、こちらに沿って進めていきました。
GitHub からドライバーを取得する必要がありますが、
プライベートサブネットに起動しているのでインターネットに接続できません。
そのため、NAT Gateway を追加しました。
なお手順には記載されていませんが、yum アップデートしておきました。
git と perl-Git がインストールされました。
$ sudo yum update
公式ページには、以下 1 行だけ記載されています。
インスタンスで ena モジュールをコンパイルし、インストールします。
インストール方法は以下を参考にしました。
# cd amzn-drivers/kernel/linux/ena/
# make
# cp ena.ko /lib/modules/$(uname -r)/
# insmod ena.ko
sudo depmod コマンドを実行して、モジュールの依存関係を更新します。
# depmod
起動時に新しいモジュールがロードされるように、インスタンスの initramfs を更新します。 dracut コマンドが使えました。
# echo 'add_drivers+=" ena "' >> /etc/dracut.conf.d/ena.conf
# dracut -f -v
以下が出力されました。
I: -rw------- 1 root root 25575668 Feb 11 14:14 /boot/initramfs-2.6.32-754.27.1.el6.x86_64.img
ena.ko が initramfs に存在することを確認しました。
# lsinitrd /boot/initramfs-2.6.32-754.27.1.el6.x86_64.img | grep ena.ko
インスタンスをシャットダウンします。
# shutdown -h now
踏み台サーバーから拡張ネットワーキングを有効化してみる
CentOS 6 をシャットダウンしたので、拡張ネットワーキングの有効化を試します。
AWS CLI を実行するので、踏み台サーバーにも IAM ロールを付与します。
aws ec2 modify-instance-attribute --instance-id ★インスタンス ID ★ --ena-support --region ap-northeast-1
何も返答はありませんでした。
インスタンスタイプを変更してみる
手順は完了しましたが、変更できるでしょうか。
インスタンスを停止して、[アクション] から [インスタンスの状態] にある [インスタンスタイプの変更] を選択します。
ドキドキ。。。
無事変更できました!
再度 SSH ログインして、AWS CLI を実行してみました。
$ aws ec2 describe-instances --instance-ids "★インスタンス ID ★" --query "Reservations.Instances[].EnaSupport" --region ap-northeast-1
[
true
]
$
今度は true が返ってきましたね!