VPC内のEC2インスタンスに複数IPアドレスを割り当てる

EC2インスタンスに複数IPアドレスを割り当てる

先日、大きな注目の機能追加がありました。1つのインスタンスに複数のIPアドレスを割り当てられるようになったのです。パブリックIPとプライベートIPをセットにして割り当てることができます。これにより、IPベースのバーチャルホストなどを組むことができるようになります。

ENIって?

ENI(Elastic Network Interface)は、EC2インスタンスに挿す仮想のNIC(ネットワークカード)です。1つのNIC毎に最大で30IPまで設定でき、1つのインスタンス毎に最大で8枚のNICの設定できますので、240のIPアドレスを設定することができます。インスタンスタイプを大きく設定しなければいけませんが、何台もインスタンスを用意することなくたくさんのIPアドレスを使うことができます。

ENIを作成する

ENIを使って仮想NICを作成してみましょう。この仮想NICは、サブネットを指定する必要があります。たとえば、CIDR 10.0.0.0/24のサブネットを指定して、仮想NICに割り当てるIPアドレスとして10.0.0.100を指定します。このIPアドレスは、プライマリIPと呼ばれます。仮想NICは個別にセキュリティグループを指定することもできます。今まで、IPアドレスやセキュリティグループは、EC2インスタンスに付与する概念でしたが、これからは仮想NICに付与するという概念を持つ必要がありそうですね。

セカンダリIPを設定する

作成した仮想NICに2つ以上のIPアドレスを設定してみましょう。Manage Private IP Addressというメニューを選択して設定します。3つのセカンダリIPアドレスを設定しました。

パブリックIPに関連づける

インターネットから到達可能なパブリックなIPアドレスを取得するには、EIP(Elastic IP)を用います。管理コンソールから作成しましょう。ちなみに、EC2とVPCではEIPの管理が別となりますので作成時にVPCを指定してください。今回は新規に4つのEIPを取得します。

4つのIPアドレスを取得しました。

仮想NICにパブリックIPアドレスを設定する

仮想NICに設定したプライベートIPとEIPで取得したパブリックIPをペアにしたいと思います。Network Interfacesの管理画面からAssociate Addressを選択してIPアドレスを指定します。4回繰り返して全てのペアを作成します。

VPCインスタンスを起動する際にENIを指定する

インスタンスを起動する際に仮想NICを指定しましょう。まずはVPCを指定して仮想NICが属しているサブネットを指定します。

次に先ほど作成した仮想NICを指定します。これで設定は完了です。

Apacheを入れて動作確認をする

SSHでログインしてApacheをインストールします。プライマリIPを指定してSSHします。

$ sudo yum install httpd-devel -y
$ sudo service httpd start
Starting httpd: httpd: apr_sockaddr_info_get() failed for ip-10-0-0-100
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [  OK  ]
[ec2-user@ip-10-0-0-100 ~]$ sudo chkconfig httpd on

Apacheを起動するとホスト名が指定されていないと怒られます。そこで以下のように設定してアラートを消しました。

$ sudo vi /etc/hosts
127.0.0.1   localhost localhost.localdomain ip-10-0-0-100
$ sudo vi /etc/httpd/conf/httpd.conf
ServerName 127.0.0.1:80
$ sudo service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

ブラウザで確認してみましょう。ちゃんとApacheのデフォルトページが表示されました。

次にセカンダリのパブリックIPを指定して確認してみます。あれ?表示されません。これは期待通りの動きです。管理コンソール上で仮想NICの設定をしましたが、OS側で設定がされていないからです。

Linux側でNICの設定をする

ここからはLinuxのお話。NICの現在の設定を確認します。

$ ifconfig
eth0      Link encap:Ethernet  HWaddr 02:8D:71:1D:1F:2A  
          inet addr:10.0.0.100  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: fe80::8d:71ff:fe1d:1f2a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:23819 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7860 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:29957088 (28.5 MiB)  TX bytes:768788 (750.7 KiB)
          Interrupt:26 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

ルーティングも見てみましょう

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.0.0.1        0.0.0.0         UG    0      0        0 eth0
10.0.0.0        *               255.255.255.0   U     0      0        0 eth0
169.254.169.254 *               255.255.255.255 UH    0      0        0 eth0

セカンダリのIPアドレスが設定されていないことが分かりました。そこで、NICの設定を追加します。Linuxの再起動時に自動で設定させる方法が2つあります。ifconfigコマンドを起動時のスクリプトに入れておく、または、sysconfigに書いておくです。まずはsysconfigの設定をやってみましょう。

$ sudo vi /etc/sysconfig/network-scripts/ifcfg-eth0:1
DEVICE=eth0:1
BOOTPROTO=static
BROADCAST=10.0.0.255
IPADDR=10.0.0.101
NETMASK=255.255.255.0
NETWORK=10.0.0.1
ONBOOT=yes

設定を保存したらネットワークサービスを再起動します。次にifconfigコマンドでNICが設定されているか確認します。

$ sudo service network restart
Shutting down interface eth0:                              [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:  
Determining IP information for eth0... done.
                                                           [  OK  ]
                                                           
$ ifconfig
eth0      Link encap:Ethernet  HWaddr 02:8D:71:1D:1F:2A  
          inet addr:10.0.0.100  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: fe80::8d:71ff:fe1d:1f2a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:24216 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8116 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:29986248 (28.5 MiB)  TX bytes:814068 (794.9 KiB)
          Interrupt:26 

eth0:1    Link encap:Ethernet  HWaddr 02:8D:71:1D:1F:2A  
          inet addr:10.0.0.101  Bcast:10.0.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:26 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

いいかんじですね。それでは、追加したNICのプライベートIPとペアとなっているパブリックIPを使ってブラウザから動作確認してみてください。Awesome !!

次にifconfigコマンドでNICを追加したいと思います。

$ sudo ifconfig eth0:2 10.0.0.102 netmask 255.255.255.0 broadcast 10.0.0.255
$ ifconfig
eth0      Link encap:Ethernet  HWaddr 02:8D:71:1D:1F:2A  
          inet addr:10.0.0.100  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: fe80::8d:71ff:fe1d:1f2a/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:25441 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8801 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:30078650 (28.6 MiB)  TX bytes:918650 (897.1 KiB)
          Interrupt:26 

eth0:1    Link encap:Ethernet  HWaddr 02:8D:71:1D:1F:2A  
          inet addr:10.0.0.101  Bcast:10.0.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:26 

eth0:2    Link encap:Ethernet  HWaddr 02:8D:71:1D:1F:2A  
          inet addr:10.0.0.102  Bcast:10.0.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:26 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

ちゃんと追加されていましたね。追加したプライベートIPとペアであるパブリックIPで接続できるかブラウザから動作確認を忘れずに

IPベースのバーチャルホストを設定する

IPベースのバーチャルホストは、1台のインスタンスで複数のサイトを運営することができます。まずはじめにRoute53でドメインとパブリックIPの関連づけを行います。

次に、Apacheの設定を変更します。ドメイン毎にプライベートIPアドレスを指定してください。

$ sudo vi /etc/httpd/conf/httpd.conf
<VirtualHost 10.0.0.101:80>
    ServerAdmin webmaster@www1.akari7.net
    DocumentRoot /var/www/www1/
    ServerName www1.akari7.net
    ErrorLog logs/www1.akari7.net-error_log
    CustomLog logs/www1.akari7.net-access_log common
</VirtualHost>

<VirtualHost 10.0.0.102:80>
    ServerAdmin webmaster@www2.akari7.net
    DocumentRoot /var/www/www2/
    ServerName www2.akari7.net
    ErrorLog logs/www2.akari7.net-error_log
    CustomLog logs/www2.akari7.net-access_log common
</VirtualHost>

Apacheを再起動してブラウザからドメイン名で確認すると振り分けられていることが確認できます!

$ sudo service httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

まとめ

VPC内でENIとEIPを組み合わせて仮想NICに複数のパブリック&ブライベートIPアドレスを付与できる事が分かりました!既存のシステムが複数IPで動いていることによって、AWSクラウドを使えなかった企業も多いのではないでしょうか。これからはご安心を。1台で複数IP設定できます!例えばメールの送信元IPをたくさん設定できそうですね!今日から君をNIC NICにしてあげる♪(アキバモード)

参考資料

Multiple IP Addresses