話題の記事

インフラエンジニアに贈るAmazon VPC入門 #2 IPアドレスとMACアドレスの管理

2013.04.13

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

更新履歴
2013/04/15 16:00
ENIの変更(デタッチ/アタッチ)は現状、仮想マシンの1つ目のENIでは不可のため、[ENIとは]の最後の説明と[ENIを変更するユースケース]の該当する説明文を修正しました。

シリーズ2本目行きます! 目次はこちら

前回は、AWSのネットワーク機能であるVPCの概要とサブネットの構成とルーティングの基礎を紹介しました。今回は、サブネットに接続する仮想マシン(EC2インスタンス)のネットワーク設定として仮想ネットワークアダプタ、アダプタに付与するIPアドレス、MACアドレスに注目していきます。

と、その前に...

今さらではありますが、このブログ記事は筆者が独自に調査、検証したものであり、AWSが公式に公開していない情報である場合もあります。ですので、ブログの内容を業務で利用する場合は自己責任でお願いします。また、調査はAWS Management Consoleで確認しているので、「できないって言ってるけど、AWS APIならできちゃうよ!」といったツッコミは大歓迎です。ページ最後のコメントでぜひご指摘ください。

VPCのIPアドレス設定は、DHCPがキホン!!

VPCサブネットに接続する仮想マシンのゲストOSでは、IPアドレスを固定設定(Static)ではなく、IPアドレスをDHCPサーバーから動的に取得するように設定します。 通常のTCP/IPネットワークでは、サーバー用途などでIPアドレスをマシンに固定で割り当てる場合、DHCPは無効が一般的ですが、VPCでは常にDHCP有効とするのがポイントです。

DHCPを使う理由

なぜDHCPを積極的に使うのかというと、私個人の考えでは仮想マシンの複製を簡単にするためかなぁと思っています *1。IPアドレスが固定設定の場合、その仮想マシンを複製すると同じIPアドレスを持つ仮想マシンができてしまうため、その都度IPアドレスの設定を更新しなくてはなりません。VMwareでは、複製時に自動でゲストOSをカスタマイズし、IPアドレスを設定する機能なんてのがありますが、AWSではVMwareと異なるアプローチとして、DHCPサービスを活用するわけです。DHCPであれば、DHCPサーバーがIPアドレスを集中管理するため、仮想マシンが複数動作する場合でもIPアドレスの衝突を回避することができます。

vpc03a

VPCのDHCPサービス

VPCでは、あらかじめDHCPサーバーが動作しているため、仮想マシンは初回起動時からDHCPでIPアドレスを取得することができます。一般的なDHCPサービスと同様、IPアドレスの他にDNSサーバーやデフォルトゲートウェイの情報も提供されるので、仮想マシンは、デプロイ後すぐに名前解決を行ったり、VPC内の他のサブネットと通信することができます。

また、DHCPサービスで伝えられる情報(DHCPオプション)は、変更することもできます。VPC内で独自のDNSサーバーを仮想マシンとして構築するときなどに有効です。具体的な変更方法は、AWSドキュメントを参照ください。

参考までに、デフォルトのDHCPオプションで得られる情報として、Amazon Linuxのdhclient.leasesの内容を貼っておきます。

lease {
  interface "eth0";
  fixed-address 172.20.11.195;
  option subnet-mask 255.255.255.0;
  option routers 172.20.11.1;
  option dhcp-lease-time 3600;
  option dhcp-message-type 5;
  option domain-name-servers 172.20.0.2;
  option dhcp-server-identifier 172.20.11.1;
  option interface-mtu 1500;
  option broadcast-address 172.20.11.255;
  option host-name "ip-172-20-11-195";
  option domain-name "ap-northeast-1.compute.internal";
  renew 6 2013/04/13 03:55:45;
  rebind 6 2013/04/13 04:24:48;
  expire 6 2013/04/13 04:32:18;
}

サーバーマシンはIPアドレスを固定したい!

DHCPは元々、LANに接続する不特定のマシンに動的にIPアドレスを割り当てる仕組みのため、DHCPサービスの性質上、毎回同じIPアドレスを取得できるとは限りません。そこで、DHCPでサーバーマシンなどIPアドレスを固定する必要がある場合には、MACアドレスをキーにIPアドレスを予約するDHCPの予約設定が一般に使用されます。

vpc04

ただ、従来のDHCPの予約設定は、マシンのMACアドレスをあらかじめDHCPサーバーに1台ずつ登録するという煩雑な作業が必要でした。VPCでは、より簡単にDHCPの予約設定を行うために、仮想マシンで使用する仮想ネットワークアダプタを管理するENI(Elastic Network Interface)という機能を利用します。

ENI(Elastic Network Interface)

直訳すると「弾力性のあるネットワークインターフェース」となりますが、"Elastic"は、AWSのサービスでよく出てくるキーワードで、エンタープライズでよく聞く"Scalable"と同じような意味合いで使われている気がします。Elastic自体はあまり気にせず、単に

仮想マシンが使用する仮想ネットワークアダプタを、VPC側で管理する仕組み

だと思ってください。AWS Management Consoleでは、EC2の管理メニューにある「Network Interfaces」で確認します。

ENIとは

ENIは、仮想マシンで使用する仮想ネットワークアダプタの情報を、DHCP予約設定とセットで管理する仕組みです *2。VPCでは以下のテーブルのように、仮想マシンのMACアドレス、IPアドレスをENIのエントリーとして管理します。

ENI ID インスタンス(仮想マシン)ID MACアドレス IPアドレス
eni-12345678 i-11111111 00:11:22:33:44:55:66 192.168.1.101
eni-87654321 i-22222222 00:11:22:33:44:55:99 192.168.1.102
eni-5678abcd i-33333333 00:11:22:33:44:55:cc 192.168.1.103

仮想マシンにひもづくENIにより、DHCPサーバーから毎回同じMACアドレス、IPアドレスが付与されます。これは、仮想マシンの状態に依存しないため、仮想マシンを再起動しようと、一旦シャットダウンしてしばらくしてから起動した場合でも必ず同じアドレスが付与されます。通常は、仮想マシンを作成するときにENIも一緒に作成されるので、従来のDHCP予約設定と比べ、MACアドレスを意識する必要がないのがポイントです。

vpc05

MACアドレスは、ランダムな未使用のアドレスがENIの作成時に自動採番されます。IPアドレスは、サブネットから未使用のアドレスが自動採番されるほか、任意のアドレス *3をユーザーが指定することもできます。ただ、MACアドレスとIPアドレスは共に、ENI作成後変更することはできません。異なるIPアドレスを使うためには、以下の回避方法で対応します。

ENIにセカンダリIPアドレスを追加する
ENIには、2つ目のIPアドレス(セカンダリIPアドレス)を付与することができます。ただし、セカンダリIPアドレスはDHCPによる取得ができないため、仮想マシンのOSでIPアドレスを固定設定します。具体的な手順は、横田さんの記事が詳しいです。
同じデータを持つ新規仮想マシンを作成する
EC2のスナップショット、AMI機能を使用し、仮想マシンを複製するときに新しいIPアドレスを指定します。

ENIを変更するユースケース

仮想マシンが使用する仮想ネットワークアダプタを他のENIに変更するユースケースとして、以下があります。

MACアドレスの移行
ライセンスがMACアドレスとひも付くアプリケーションを仮想マシンで使用する場合、MACアドレスが異なる他の仮想マシンにアプリケーションを移行するためにはライセンスの更新などの対応が必要です。ENIを他の仮想マシンに変更することで、同一のMACアドレスを異なる仮想マシンに引き継ぐことができ、このような移行を容易に行うことができます。
IPアドレスの移行
ENIは同一のIPアドレスを異なる仮想マシンに引き継ぐことができるため、仮想マシンで実行するサーバーシステムを他の仮想マシンに移行するとき、システムにアクセスするクライアントの設定を変更せずに、仮想マシンから別の仮想マシンに容易に移行することができます。

vpc06

ENIの変更手順
  1. 仮想マシンのスナップショットおよびAMIを作成する
  2. ENIを残して仮想マシンを削除する(ENIの取り外し)
  3. AMIを元に仮想マシンを作成し、作成時にENIを指定する

ただし、ENIのやり取りができるのはVPCサブネット内のみです。IPアドレスは、サブネットによってネットワークアドレスが異なるのでしっくりくるのですが、MACアドレスを他のサブネットの仮想マシンに引き継ぎできない点は注意が必要かもしれません。

(参考)マルチENI

1台の仮想マシンに複数のIPアドレスを割り当てる方法として、セカンダリIPアドレスの追加を紹介しました。もう一つの方法として、1台の仮想マシンに追加のENIをひもづける、マルチENIを構成することもできます。セカンダリIPアドレスは同じサブネットのアドレスしか設定できないのに対して、マルチENIでは2つのVPCサブネットにまたがる仮想マシンを構成することができます。

ただ、実際にはルーティングの構成が思うように動かなかったり、ゲストOSによっては手動設定が追加で必要など、あまり使い勝手が良い実装にはなっていないのが現状です。ドキュメントなどを熟読の上、活用いただくのがいいと思います。このあたりは、@j3tm0t0さんのブログ記事が詳しいです。

まとめと次回予告

今回は、仮想マシンに割り当られるMACアドレス、IPアドレスの管理ということで、VPCではDHCPが活用されていること、それらを管理する仕組みとしてENIを利用することを紹介しました。VPCの機能の中でもかなり地味〜なところなのですが、後続のDNS、ルーティング、セキュリティのベースとなる部分なので、しっかり理解いただけると嬉しいです。

さて、次回はDNSの予定です。DNSも、Default VPCと同じタイミングで仕様変更があった、非常にホットなトピックです。ご期待くださーい!

参考文献

脚注

  1. AWSではAMI(Amazon Machine Image)という仕組みで簡単に仮想マシンを複製できます。
  2. DHCP予約設定のほか、Elastic IPとセキュリティグループも合わせて管理できますが、シリーズの今後の回でご紹介とし、今回の記事では割愛します。
  3. 前回記事に出てきたVPCサブネットの予約アドレスと使用済みアドレスを除く