Carpe Diem

備忘録

C5/M5インスタンス用のAMIをpackerで作成する

概要

先日東京リージョンにもC5/M5インスタンスが対応されました。
コスト的にC4/M4より10~15%ほど安くなるため、可能であれば逐次移行した方が良いです。
ただC5/M5からは

  • Elastic Network Adapter (ENA) 対応
  • NVMe対応のOSが必要
  • バイス名の変更

といった大きな変更が入っており、単純にインスタンスタイプを変更するだけだと動かない・パフォーマンスが十分に発揮できない可能性があります。

環境

主な変更点

Elastic Network Adapter (ENA) 対応

ENA の特徴は高スループット・低レイテンシかつホストプロセッサの負荷を最小限に留めるため、ぜひ対応したい機能です。
対応するためには

  • Kernelにena moduleがインストールされている
  • インスタンス属性でenaが有効になっている
  • ena対応のAMIである

の3つが必要で、それらを満たすと通常ネットワークインタフェースが

$ 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ドライバのインタフェースに変わります。

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

対応しないと以下のようなエラーがでます。

Error launching source instance: InvalidParameterCombination: Enhanced networking with the Elastic Network Adapter (ENA) is required for the 'm5.large' instance type. Ensure that you are using an AMI that is enabled for ENA.

Kernelにena moduleがインストールされている

以下のコマンドで確認できます。

$ modinfo ena
filename:       /lib/modules/4.4.11-23.53.amzn1.x86_64/kernel/drivers/amazon/net/ena/ena.ko
version:        0.6.6
license:        GPL
description:    Elastic Network Adapter (ENA)
author:         Amazon.com, Inc. or its affiliates
srcversion:     3141E47566402C79D6B8284
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.4.11-23.53.amzn1.x86_64 SMP mod_unload modversions
parm:           debug:Debug level (0=none,...,16=all) (int)
parm:           push_mode:Descriptor / header push mode (0=automatic,1=disable,3=enable)
              0 - Automatically choose according to device capability (default)
              1 - Don't push anything to device memory
            3 - Push descriptors and header buffer to device memory (int)
parm:           enable_wd:Enable keepalive watchdog (0=disable,1=enable,default=1) (int)
parm:           enable_missing_tx_detection:Enable missing Tx completions. (default=1) (int)
parm:           numa_node_override_array:Numa node override map
 (array of int)
parm:           numa_node_override:Enable/Disable numa node override (0=disable)

未対応だと以下になります。

$ modinfo ena
ERROR: modinfo: could not find module ena

インスタンス属性でenaが有効になっている

以下のコマンドで確認できます。

$ aws ec2 describe-instances --instance-ids ${instance_id} --query 'Reservations[].Instances[].EnaSupport'
[
    true
]

未対応だと空配列が返ります。
古いインスタンスは空配列でしたが、最近作った新しいインスタンスはデフォルトで有効になってました。
t2c4など

ena対応のAMIである

以下のコマンドで確認できます。

$ aws ec2 describe-images --image-id ${ami_id} --query 'Images[].EnaSupport'
[
    true
]

未対応だと空配列です。
これはimageの作成時に以下のように指定する必要があります。

$ aws ec2 register-image --ena-support ...

NVMe対応のOSが必要

ドキュメントには以下のOSである必要があると書いてあります。

ref: Compute Optimized Instances - Amazon Elastic Compute Cloud

バイス名の変更

以前はxvdaxvdbといった名前でマッピングされましたが、

$ lsblk 
NAME    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
xvda    202:0    0    20G  0 disk 
└─xvda1 202:1    0    20G  0 part /
xvdb    202:16   0   400G  0 disk /data

C5/M5インスタンスはNVMeインタフェースを使うため、デバイス名のスキームが変更されました。

$ lsblk
NAME          MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme2n1       259:1    0   1G  0 disk
nvme1n1       259:0    0   1G  0 disk
nvme0n1       259:2    0   8G  0 disk
├─nvme0n1p1   259:3    0   8G  0 part /
└─nvme0n1p128 259:4    0   1M  0 part

なのでもしバイスファイルシステムを変える処理を入れてる〜と言ったことをしていると、以前の書き方ではうまくいかないため注意してください。

Packerで作成する

ベースAMIの選択

Kernelがena moduleやNVMeをサポートしている必要があるので、Ubuntu xenialのami-60a4b21c(20180405)を使います。
探し方は以下を参考にしてください。

christina04.hatenablog.com

ビルド時のオプションを設定

ena_supportというオプションがあるのでそれを使います。

{
  "builders": [{
    "type": "amazon-ebs",
    "access_key": "",
    "secret_key": "",
    "region": "ap-northeast-1",
    "source_ami": "ami-60a4b21c",
    "instance_type": "t2.micro",
    "ssh_username": "ubuntu",
    "ami_name": "ena {{timestamp}}",
    "ena_support": true
  }],

  "provisioners": [{
    "type": "shell",
    "inline": [
      "sudo apt-get update",
      "sudo apt-get install -y python-simplejson aptitude"
    ]
  }, {
    "type": "ansible",
    "host_alias": "api",
    "ansible_env_vars": ["ANSIBLE_SCP_IF_SSH=y", "ANSIBLE_HOST_KEY_CHECKING=False"],
    "playbook_file": "./ansible/playbooks/api.yml"
  }]
}

こんな感じですね。

ビルド

$ packer build api.json

動作検証

ビルド後にWebコンソールでポチポチとインスタンスを起動します。
以下のようにちゃんとネットワークインタフェースがenaドライバになっています。

$ ethtool -i ens5
driver: ena
version: 1.3.0K
firmware-version: 
expansion-rom-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

その他疑問点

eth0じゃなくてens5というのは?

最近のLinuxではeth0でなく、predictable network interface namesと言うものが使われるようになりました。
Ubuntu 16.04ではsystemdを使っており、systemdはバージョン197よりこのpredictable network interface namesを使うようになっています。

気になる方は以下のサイトが非常に分かりやすいです。

ほげめも: Debian vs Ubuntu: ネットワークインタフェースの名前

ENAじゃなくてixgbevfとかいう拡張ネットワークもある

C3、C4の頃からあった拡張ネットワーキングのタイプです。

  • Intel 82599 Virtual Function (VF) インターフェイス
    • 最大 10 Gbps のネットワーク速度
    • C3、C4、D2、I2、R3、M4 (m4.16xlarge を除く) インスタンス
  • Elastic Network Adapter (ENA)
    • 最大 25 Gbps のネットワーク速度
    • C5、F1、G3、H1、I3、M5、P2、P3、R4、X1 および m4.16xlarge インスタンス

ref: Linux の拡張ネットワーキング - Amazon Elastic Compute Cloud
ref: VPC 内の Linux インスタンスにおける Intel 82599 VF インターフェイスを使用した拡張ネットワーキングの有効化 - Amazon Elastic Compute Cloud

比較を見て分かるように、ENAの方が高性能なので今後はそちらを利用しましょう。

ap-northeast-1cではC5は使えない

オートスケーリンググループで利用したところ以下のエラーが起きて1cだと起動できませんでした。

Launching a new EC2 instance. Status Reason: Your requested instance type (c5.xlarge) is not supported in your requested Availability Zone (ap-northeast-1c). Please retry your request by not specifying an Availability Zone or choosing ap-northeast-1d, ap-northeast-1a. Launching EC2 instance failed.

なので1a1dにする必要があります。

まとめ

C5/M5対応のAMIの作成では大きな変更点が多々あるので注意してください。
次回はC4から移行した際のパフォーマンス比較をしようと思います。

ソース