VPCサブネットでNeighbour Discovery

以前、EC2でブロードキャストができるようにするという記事を書きました。
EC2-VPCならL2のアドレスを書き換えてL3以上にタッチせずにフレームの宛先を変えられるので、それを利用して受信ノード数分フレームをコピーしてユニキャストで送るというトリックでEthernetブロードキャストを動かし、結果としてサブネット内のIPマルチキャスト・ブロードキャストを実現するという話です。

今更ながら、図に起こしたので貼っておきます。
ec2broadcast

となると、Ethernetブロードキャストをするには、まず同一サブネット内の他インスタンス(厳密に言うとそれにアタッチされたENI)のMACアドレスのリストが必要です。
通常のネットワークであれば、all IPホストグループ(224.0.0.1やff02::1など)にpingでも打てば良さそうなものですが、そもそもそのマルチキャストができないのだから本末転倒です。

なのでここはEC2に特化したネットワーク情報の取得方法を取ることにしましょう。
AWS上の操作や必要な情報の取得はAPIを通じて可能です。
サブネットに関する情報ももちろん取得可能。

例えば下記のようなスクリプトを動かせば、同一サブネットに接続されて、インスタンスにアタッチされているネットワークインターフェース(ENI)のリストを取得することができます。(Linux前提ですが)
これの出力を先日の擬似ブロードキャストを実現するスクリプトの引数として与えるようなスクリプトを用意すればMACアドレスを調べてわざわざ渡す必要なくブロードキャストが実現できます。

上記スクリプトは、

  1. 第一引数で受け取ったインターフェースが属するVPCサブネットのIDを取得
  2. 自分(インスタンス)が属するリージョンを取得
  3. describe-network-interfacesを実行して、VPCサブネットのID、インスタンスにアタッチされているかどうかでフィルタ

という感じのことをしています。

実際に使うときにはこれをたくさんのホストが実行するのは非効率なので、API取得結果をキャッシュするような仕組みを別途用意しておくのが吉かと思います。
例えばdescribe-network-interfacesの結果をDynamoDBに入れておいて、各インスタンスはそこに対して自分のサブネットの情報をQueryするとか。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中