Amazon Ec2

CentOS7系でEC2のセカンダリIPアドレスを自動的に割り当ててみた

こんにちは、ディーネットの山田です。

EC2にセカンダリIPアドレスを割り当てる機会があり、IPアドレスが自動的に追加されず困ったのでブログにしてみます。

はじめに

セカンダリIPアドレスを割り当てる方法について

AWSマネジメントコンソールから対象インスタンスのENIに対してセカンダリIPアドレスを付与します。
詳しい設定方法は、当社のomkが紹介していますので、こちらをご覧ください。

EC2インスタンスにElasticIP アドレスを複数個付けてみた

困った点

プライマリIPアドレスは、DHCPで自動的にIPアドレスが付与されるが、セカンダリIPアドレスはDHCPで付与されない。
調べたところ、手動で固定IPをNICに割り当てている記事を見かけたが、極力固定IPの設定をOSに設定したくない。

解決策

Amazon Linuxだと「ec2-net-utils」というパッケージの機能でセカンダリIPアドレスを自動的に割り当ててくれるみたいなので、CentOSでも導入してみる。

作業内容

AWSマネジメントコンソールからセカンダリIPアドレスを割り当てます

割り当て前と比べて「セカンダリプライベートIPv4アドレス」に付与されたことを確認します


↓↓↓↓↓

OS上からNICに付与されているIPアドレスを確認します

# ip addr show ens5
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 00:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff
    inet 192.0.2.20/24 brd 192.0.2.255 scope global dynamic ens5
       valid_lft 3541sec preferred_lft 3541sec

インスタンスメタデータからセカンダリIPアドレスが付与されていることを確認します

# curl http://169.254.169.254/latest/meta-data/network/interfaces/macs/00:11:22:33:44:55/local-ipv4s
192.0.2.20
192.0.2.67

取り合えず何も対策していない状態でnetworkを再起動してみます

# systemctl restart network

残念ながら、セカンダリIPアドレスは付与されていません

# ip addr show ens5
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 00:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff
    inet 192.0.2.20/24 brd 192.0.2.255 scope global dynamic ens5
       valid_lft 3596sec preferred_lft 3596sec

ec2-net-utilsのソースをクローンするためにgitをインストールします

# yum -y install git

ec2-net-utilsのソースをgitからクローンします

# git clone https://github.com/aws/ec2-net-utils
Cloning into 'ec2-net-utils'...
remote: Enumerating objects: 255, done.
remote: Counting objects: 100% (227/227), done.
remote: Compressing objects: 100% (138/138), done.
remote: Total 255 (delta 96), reused 164 (delta 66), pack-reused 28
Receiving objects: 100% (255/255), 91.82 KiB | 0 bytes/s, done.
Resolving deltas: 100% (98/98), done.

ec2-net-utilsのソースをmakeコマンド使ってデプロイします

# cd ec2-net-utils/

# make
#-----
cd /root/ec2-net-utils/tests && PARAMS=/root/ec2-net-utils/tests/params-eth0-basic.sh ETCDIR="./test-output/eth0-basic/etc" ./test-ec2ifup 2> /root/ec2-net-utils/tests/test-output/eth0-basic/ec2ifup.out
cd /root/ec2-net-utils/tests && PARAMS=/root/ec2-net-utils/tests/params-eth0-basic.sh ETCDIR="./test-output/eth0-basic/etc" ./test-ec2dhcp.sh 2> /root/ec2-net-utils/tests/test-output/eth0-basic/ec2dhcp.sh.out
cd /root/ec2-net-utils/tests && PARAMS=/root/ec2-net-utils/tests/params-eth0-basic.sh ETCDIR="./test-output/eth0-basic/etc" ./test-ec2ifdown 2> /root/ec2-net-utils/tests/test-output/eth0-basic/ec2ifdown.out
diff -u /root/ec2-net-utils/tests/tdata/eth0-basic/ec2ifup.out /root/ec2-net-utils/tests/test-output/eth0-basic/ec2ifup.out
diff -u /root/ec2-net-utils/tests/tdata/eth0-basic/ec2dhcp.sh.out /root/ec2-net-utils/tests/test-output/eth0-basic/ec2dhcp.sh.out
diff -u /root/ec2-net-utils/tests/tdata/eth0-basic/ec2ifdown.out /root/ec2-net-utils/tests/test-output/eth0-basic/ec2ifdown.out
cd /root/ec2-net-utils/tests && PARAMS=/root/ec2-net-utils/tests/params-secondary-basic.sh ETCDIR="./test-output/secondary-basic/etc" ./test-ec2ifup 2> /root/ec2-net-utils/tests/test-output/secondary-basic/ec2ifup.out
cd /root/ec2-net-utils/tests && PARAMS=/root/ec2-net-utils/tests/params-secondary-basic.sh ETCDIR="./test-output/secondary-basic/etc" ./test-ec2dhcp.sh 2> /root/ec2-net-utils/tests/test-output/secondary-basic/ec2dhcp.sh.out
cd /root/ec2-net-utils/tests && PARAMS=/root/ec2-net-utils/tests/params-secondary-basic.sh ETCDIR="./test-output/secondary-basic/etc" ./test-ec2ifdown 2> /root/ec2-net-utils/tests/test-output/secondary-basic/ec2ifdown.out
diff -u /root/ec2-net-utils/tests/tdata/secondary-basic/ec2ifup.out /root/ec2-net-utils/tests/test-output/secondary-basic/ec2ifup.out
diff -u /root/ec2-net-utils/tests/tdata/secondary-basic/ec2dhcp.sh.out /root/ec2-net-utils/tests/test-output/secondary-basic/ec2dhcp.sh.out
diff -u /root/ec2-net-utils/tests/tdata/secondary-basic/ec2ifdown.out /root/ec2-net-utils/tests/test-output/secondary-basic/ec2ifdown.out
cd /root/ec2-net-utils/tests && PARAMS=/root/ec2-net-utils/tests/params-secondary-more-ips.sh ETCDIR="./test-output/secondary-more-ips/etc" ./test-ec2ifup 2> /root/ec2-net-utils/tests/test-output/secondary-more-ips/ec2ifup.out
cd /root/ec2-net-utils/tests && PARAMS=/root/ec2-net-utils/tests/params-secondary-more-ips.sh ETCDIR="./test-output/secondary-more-ips/etc" ./test-ec2dhcp.sh 2> /root/ec2-net-utils/tests/test-output/secondary-more-ips/ec2dhcp.sh.out
cd /root/ec2-net-utils/tests && PARAMS=/root/ec2-net-utils/tests/params-secondary-more-ips.sh ETCDIR="./test-output/secondary-more-ips/etc" ./test-ec2ifdown 2> /root/ec2-net-utils/tests/test-output/secondary-more-ips/ec2ifdown.out
diff -u /root/ec2-net-utils/tests/tdata/secondary-more-ips/ec2ifup.out /root/ec2-net-utils/tests/test-output/secondary-more-ips/ec2ifup.out
diff -u /root/ec2-net-utils/tests/tdata/secondary-more-ips/ec2dhcp.sh.out /root/ec2-net-utils/tests/test-output/secondary-more-ips/ec2dhcp.sh.out
diff -u /root/ec2-net-utils/tests/tdata/secondary-more-ips/ec2ifdown.out /root/ec2-net-utils/tests/test-output/secondary-more-ips/ec2ifdown.out
#-----

# make install
#-----
test -d /etc/dhcp/dhclient.d || install -d -o root -g root -m755 /etc/dhcp/dhclient.d
install -o root -g root -m755 ec2dhcp.sh /etc/dhcp/dhclient.d
test -d /etc/modprobe.d || install -d -o root -g root -m755 /etc/modprobe.d
install -o root -g root -m644 ixgbevf.conf /etc/modprobe.d
test -d /etc/sysconfig/network-scripts || install -d -o root -g root -m755 /etc/sysconfig/network-scripts
install -o root -g root -m644 ec2net-functions /etc/sysconfig/network-scripts
test -d /etc/sysconfig/network-scripts || install -d -o root -g root -m755 /etc/sysconfig/network-scripts
install -o root -g root -m755 ec2net.hotplug /etc/sysconfig/network-scripts
test -d  //usr/local/lib/udev/rules.d || install -d -o root -g root -m755  //usr/local/lib/udev/rules.d
install -o root -g root -m644  53-ec2-network-interfaces.rules.systemd  //usr/local/lib/udev/rules.d
mv //usr/local/lib/udev/rules.d/53-ec2-network-interfaces.rules.systemd \
  //usr/local/lib/udev/rules.d/53-ec2-network-interfaces.rules
test -d //usr/local/lib/udev/rules.d || install -d -o root -g root -m755 //usr/local/lib/udev/rules.d
install -o root -g root -m644 75-persistent-net-generator.rules //usr/local/lib/udev/rules.d
test -d //usr/local/lib/systemd/system || install -d -o root -g root -m755 //usr/local/lib/systemd/system
install -o root -g root -m644 ec2net-ifup@.service //usr/local/lib/systemd/system
test -d //usr/local/lib/systemd/system || install -d -o root -g root -m755 //usr/local/lib/systemd/system
install -o root -g root -m644 ec2net-scan.service //usr/local/lib/systemd/system
test -d //usr/local/lib/udev || install -d -o root -g root -m755 //usr/local/lib/udev
install -o root -g root -m644 rule_generator.functions //usr/local/lib/udev
test -d //usr/local/lib/udev || install -d -o root -g root -m755 //usr/local/lib/udev
install -o root -g root -m644 write_net_rules //usr/local/lib/udev
test -d //usr/local/sbin || install -d -o root -g root -m755 //usr/local/sbin
install -o root -g root -m755 ec2ifdown //usr/local/sbin
test -d //usr/local/sbin || install -d -o root -g root -m755 //usr/local/sbin
install -o root -g root -m755 ec2ifscan //usr/local/sbin
test -d //usr/local/sbin || install -d -o root -g root -m755 //usr/local/sbin
install -o root -g root -m755 ec2ifup //usr/local/sbin
test -d //usr/local/share/man/man8 || install -d -o root -g root -m755 //usr/local/share/man/man8
install -o root -g root -m644 ec2ifscan.8 //usr/local/share/man/man8
test -d //usr/local/share/man/man8 || install -d -o root -g root -m755 //usr/local/share/man/man8
install -o root -g root -m644 ec2ifup.8 //usr/local/share/man/man8
ln -fs ec2ifup.8 //usr/local/share/man/man8/ec2ifdown.8
#-----

※shellコマンドを実行して、ファイルの置き替えなどを行っているだけのようです。

ec2-net-utilsのデプロイが終わったらnetworkを再起動してみます

# systemctl restart network

無事にセカンダリIPアドレスが付与されました

# ip addr show ens5
2: ens5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc mq state UP group default qlen 1000
    link/ether 00:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff
    inet 192.0.2.20/24 brd 192.0.2.255 scope global dynamic ens5
       valid_lft 3517sec preferred_lft 3517sec
    inet 192.0.2.67/24 brd 192.0.2.255 scope global secondary ens5
       valid_lft forever preferred_lft forever

まとめ

  • Amazon Linux向けに提供されている「ec2-net-utils」ですが、CentOS7系でも使用することができました。
  • (パッとソースコードを見た限りでは)「ec2-net-utils」は、DHCPを使わずインスタンスメタデータからセカンダリIPアドレスを確認して、付与するといった挙動をしているようです。
  • 方法がないのであれば、セカンダリIPアドレスを直接NICに固定IPアドレスで付与するのでも良いとは思いますが、インスタンスコピー時やAMIからインスタンス作成時に状態が残ったままになることがあるので、可能な限り自動化して状態を持たないようにしましょう。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA