ForgeVision Engineer Blog

フォージビジョン エンジニア ブログ

CentOS 6 を Nitro に対応させてみた

クラウドインテグレーション事業部の尾谷です。

先日、拡張ネットワーキングが有効になっていない 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 の情報を参照するように記載がされています。

github.com

CentOS 6 はマイナーバージョン関係なく、まるっと対応しているようです!
(2012/02/27 現在)

 

f:id:otanikohei:20200211093402p:plain
CentOS 6、CentOS 7 

インスタンスはプライベートサブネットで起動

今回利用した AMI (Amazon Machine Image) は以下でした。

base-centos-6.10 - ami-06ce8b33d8f4f2ddd


古いイメージでセキュリティ面に不安を感じましたので、プライベートサブネットに起動し、パブリックサブネットに起動した踏み台サーバー (Amazon Linux 2) を経由して SSH ログインしました。 

f:id:otanikohei:20200211095802p:plain
簡易構成図 

踏み台から対象へ 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 にアタッチします。

  1. EC2 インスタンスを選択
  2. [アクション] ボタンから、[インスタンスの設定] -> [IAM ロールの割り当て/置換] を選択
  3. ロールを選択して、[適応] ボタンをクリック
f:id:otanikohei:20200211102101p:plain
ロールを EC2 インスタンスにアタッチ 

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 モジュールをコンパイルし、インストールします。

インストール方法は以下を参考にしました。

aws.amazon.com

# 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

何も返答はありませんでした。

インスタンスタイプを変更してみる

手順は完了しましたが、変更できるでしょうか。
インスタンスを停止して、[アクション] から [インスタンスの状態] にある [インスタンスタイプの変更] を選択します。
  ドキドキ。。。  

f:id:otanikohei:20200211143415p:plain

祝!

無事変更できました!
再度 SSH ログインして、AWS CLI を実行してみました。

$ aws ec2 describe-instances --instance-ids "★インスタンス ID ★" --query "Reservations.Instances[].EnaSupport" --region ap-northeast-1
[
  true
]
$

今度は true が返ってきましたね!