インフラエンジニアに贈るAmazon VPC入門 #3 インターネット接続(前編)

2013.04.18

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

更新履歴
2013/04/21 22:43
[Elastic IPの応用]を追記しました。
シリーズ3本目です! 目次は<a href="https://dev.classmethod.jp/series/vpcfor-infra-engineer/">こちら</a>。

まずはお詫びから。今回、DNSを期待していた方、ごめんなさい。前回予告にDNSと書いてしまいましたが、私の記憶違いでした。今回はVPCからのインターネット接続を取り上げます!DNSは次回以降、タイミングを見てやりますんで、しばしお待ちを。

ルーティングの詳細

さて、シリーズ#1では、VPCは、全体のアドレス空間をサブネットに分割し、仮想ルータはサブネット間のルーティング情報を持つと紹介しました。ここでは、そのルーティング情報についてもう少し詳しく解説します。 ルーティング情報は一般のIPネットワークと同様、"宛先"、"経路"、"インターフェース"をエントリーとするルーティングテーブルで管理されます。VPCで扱うルーティングテーブルは、大きく分けて2種類あります。

  • 仮想マシンのルーティングテーブル
  • 仮想ルーターのルーティングテーブル

仮想マシンのルーティングテーブル

仮想マシンのルーティングテーブルは、シリーズ#2でご紹介したDHCPオプションにより仮想ルーターから各仮想マシンに設定されます。AWSドキュメントを見る限り、現状ルーティングを操作するオプションは見当たらないため、基本的には以下のエントリーで固定 *1です。しかし、VPC内および外部ネットワークとのルーティングは仮想ルーターでやってくれるため、これで必要十分です。

VPCサブネット 192.168.1.0/24の仮想マシンのルーティングテーブル例
宛先 経路(ゲートウェイ) インターフェース
192.168.1.0/24 * 仮想マシンのENI
0.0.0.0/0(デフォルトルート) 仮想ルータのIPアドレス 仮想マシンのENI


vpc_routing01

仮想ルーターのルーティングテーブル

仮想ルーターのルーティングテーブルは、サブネット間で通信するためのルーティングが設定済み、かつ固定です。VPCおよび仮想ルーターのネットワークトポロジーは公開されていないため、後述のルーティングテーブルの例は90%くらいが妄想でできていますが、理屈としては間違っていないと思います。多分。

また、シリーズ#1のVPCの概念図では、図を簡略化するためにVPC全体で仮想ルーターを1台だけ書きましたが、ルーティングテーブルはVPCサブネットごとに設定するため、概念としてVPCサブネットごとに仮想ルーターがあり、仮想ルーター同士が相互に接続していると妄想する方がわかりやすくなります。実装は見えないので知りません(キリッ。
というわけで、仮想ルーターのルーティングテーブルと構成イメージはこんな感じになります。

VPC:192.168.0.0/16、VPCサブネット:192.168.1.0/24の仮想ルーターのルーティングテーブル例
(VPC内には、他に192.168.2.0/24と192.168.3.0/24のサブネットがあると仮定)
宛先 経路(ゲートウェイ) インターフェース
192.168.1.0/24 * 192.168.1.0/24に接続するインターフェース
192.168.2.0/24 * 192.168.2.0/24の仮想ルーターに接続するインターフェース
192.168.3.0/24 * 192.168.3.0/24の仮想ルーターに接続するインターフェース


vpc_routing02

他のサブネットの仮想ルーターも、値こそ異なりますが、例と同様に自サブネットと他サブネットのエントリーを持つと考えられます。ちなみに、AWSの画面上では、インターフェースは省略、ルーティングテーブルのエントリーは1つにまとめてVPCの仮想ルーター共通で以下のように表示されます。

宛先 経路(ゲートウェイ)
192.168.0.0/16 Local

宛先がサブネットではなく、VPC全体のアドレスになっているのがポイントです。"Local"ってなんやねん!と突っ込みたくなりますが、これに先ほどの"各サブネットの仮想ルーター間でよろしくルーティングしてくれぃ!"という意味が込められています。

ルーティングの追加

さて、既定のルーティングを紹介しましたので、今度はルーティングの追加を見て行きます。仮想ルーターのルーティングテーブルにルーティングエントリーを追加するのは、外部ネットワークにアクセスするためです。外部ネットワークとして最初に思い浮かべるのは、そう、インターネット接続です。

インターネット接続ってそもそも要るの?

VPCを利用する目的は、ケースにより様々ですが、

「従来のオンプレミス環境の延長でVPCを使用するので、インターネットとの通信は必要ない。むしろその方がセキュアじゃない?

なーんて、妄想を抱きがちです。しかし、実際は多くのケースでインターネット接続が必要になります。
さらっと思いつくものだけでも、例えば以下があります。

NTPで時刻同期したい
AWSの仮想マシンであるEC2はXenベースの仮想マシンと言われますが、仮想マシンの運用でありがちなトラブルとして時刻のずれがあります。EC2に限らず、一般的な仮想マシンは、その処理の特性上物理マシンに比べ時刻がずれやすい傾向にあります。気づかないうちに時刻が目に見えるほどずれてしまい、ログの不整合や他のマシンとの同期処理の失敗などが誘発されます。
「じゃあ、NTPで同期すればいいじゃないか」となるわけですが、クラウド環境の根本的なウィークポイントとして"全ての仮想マシンがクラウド上では同じ条件に置かれる"点があります。今回の場合は、全てのEC2インスタンスで時刻がずれてしまう恐れがあるので、そのうちのどれかのEC2インスタンスにNTPで同期したとしても、みんなで一緒に誤った時刻を刻んでしまう、残念な結果になります。
現状では、VPC向けのNTPサービスは提供されていないため、インターネットなど外部のNTPサーバーのお世話にならなくてはなりません。
EC2環境でのNTPについては、都元さんの記事が詳しいです。
S3を筆頭に、インターネット経由でしかアクセスできないサービスがある
こちらは、かなり状況は流動的ですが、AWSで提供されるサービスのうちVPCに対応していない(VPC内にエンドポイントを持たない)サービスがそれなりにあります。
例えばS3は、VPCからアクセスする場合に一度インターネットを経由して、S3のエンドポイントにアクセスするしかありません。
ただ、かつてはVPCで使えなかったサービスが、ある日VPC対応になったというリリースがここ半年あられのように降ってきているため、状況は変わるかもしれません。OpsWorksはDefault VPCでのみVPCに対応する(Amazon VPC(仮想プライベートクラウド Amazon Virtual Private Cloud) | アマゾン ウェブ サービス(AWS 日本語) - [その他の注意事項])、という過渡期な状態のサービスもある状態です。VPC対応を望むのであれば、祈るか、見守るか、AWSサポートにリクエストを送りましょう(3つ目が一押しです)。

ちょっと極端な書き方をしてしまいましたが、実際には、VPCを利用する全ての仮想マシンが"直接"インターネットと通信できる必要はありません。サブネットごとにルーティングやセキュリティ機能を構成することで、十分なセキュリティ性を確保できるようになっています。

インターネットへのつなぎ方

では、今回の本題です。VPCでは、インターネットに出て行くためにインターネットゲートウェイを使用します。

インターネットゲートウェイとは

VPCには、あらかじめインターネットゲートウェイが用意されています。その名の通り、サブネットとインターネットを接続する唯一の仕組みです(厳密には、VPN経由という手もありますが)。従って、サブネットのルーティングテーブルに、インターネットゲートウェイへのエントリーを追加してインターネットに繋げられるようになるかってーと、残念ですがなりません!

なんで?

VPCとインターネットゲートウェイの関係は、家庭内LANとブロードバンドルータの関係とよく似ています。一般のブロードバンドルーターでは、家庭内LANとインターネットの接続の際にIPマスカレードというNAT処理の一種を動作させるものがほとんどです。ところが、VPCのインターネットゲートウェイはIPマスカレードをサポートしないため、それに代わる以下の2通りのどちらかで対応することになります。

  1. Elastic IP(仮想IP)
  2. Elastic IP(仮想IP) + NATインスタンス

(参考)IPマスカレードとは

<

div class="clear">

IPマスカレードは、ブロードバンドルーターがLAN内からインターネットに出て行くトラフィックに対して行うNAT(アドレス変換)処理です。以下の流れで変換処理を行います。

  1. ブロードバンドルーターは、IPトラフィックの送信元IPアドレス(LAN内のマシンのIPアドレス)を、ブロードバンドルーターのインターネット側のIPアドレスに書き換えます。こうすることにより、宛先IPアドレスからのレスポンスを、ブロードバンドルーターで受け取ることができるようになります。
  2. レスポンスが帰ってきたときには、今度はレスポンスの宛先アドレスをLAN内のマシンのIPアドレスに書き換え、LAN内のマシンにトラフィックを転送します。

<img src="https://cdn-ssl-devio-img.classmethod.jp/wp-content/uploads/2013/04/vpc_routing03-640x526.png" alt="vpc_routing03" width="640" height="526" size-medium wp-image-55519" />

IPマスカレードのポイントは、宛先からのレスポンスをブロードバンドルーターが受け取り、LAN内のマシンに転送できるところにあります。IPマスカレードが動作しない場合は、ルーティングによりインターネットにトラフィックを送信することはできますが、レスポンスを受け取ることができません

Elastic IP

VPCにおいて、IPマスカレードなしでインターネット接続を実現する方法として、Elastic IP(仮想IP)を利用することができます。Elastic IPは、AWSが持つパブリックIPアドレスをユーザーが取得し、それを仮想マシンに割り当てる機能で、先ほどのIPマスカレードに近いStatic NATによって提供されます。

Elastic IP ≒ Static NAT!!

IPアドレスの設定というと、仮想マシンのOSで構成するイメージを思い浮かべるかもしれませんが、Elastic IPでは、そのような設定は必要ありません。もっと言うと、仮想マシンのOSからは、Elastic IPの情報は一切見えません。なぜなら、Elastic IPは全ての構成がインターネットゲートウェイで行われるからです。

インターネットゲートウェイの設定ということで、これまたAWSユーザーからは見えない妄想の世界になります。インターネットゲートウェイで構成するStatic NATは、VPC内の仮想マシンのIPアドレスと、取得したパブリックIPアドレスをStatic NATテーブルとして1対1でひも付けて管理します。これを元に、インターネットとのトラフィック送受信時に仮想マシンのIPアドレスをパブリックIPアドレスに書き換えるはたらきがあります。例を以下に示します。

  1. インターネットゲートウェイは、IPトラフィックの送信元IPアドレス(仮想マシンのIPアドレス)を、パブリックIPアドレスに書き換えます。こうすることにより、宛先IPアドレスからのレスポンスを、インターネットゲートウェイで受け取ることができるようになります。 vpc_routing04_1a
  2. レスポンスが帰ってきたときには、今度はレスポンスの宛先アドレスを仮想マシンのIPアドレスに書き換え、仮想マシンにトラフィックを転送します。 vpc_routing04_2a

このように仮想マシンにElastic IPを設定することで、仮想マシンがインターネットに接続できるようになります。
Elastic IP(Static NAT)が前述のIPマスカレードと異なるのは、インターネット→仮想マシンのトラフィックが受信ができるところです。IPマスカレードの場合、仮想マシンごとのパブリックIPアドレスを持たないので、インターネットから受信したトラフィックをどの仮想マシンに届けるべきなのか区別することができません。そのため、IPマスカレード(後編で紹介するNATインスタンス)は、Webブラウザなどのクライアント向けの構成、Elastic IP(Static NAT)はインターネットに公開するサーバー向けの構成と使い分けると良いでしょう。

ちなみに、一般的なブロードバンドルーターでは、ポートフォワード機能が利用できるものが多いと思います。ポートフォワードはStatic NATとほとんど同様の機能で、IPアドレス単位ではなく、特定のポート単位でLAN内のマシンへトラフィックを転送するはたらきを持ちます。逆に言うと、Static NATはインターネットから受信するElastic IP宛の全てのトラフィックを仮想マシンに転送するため、仮想マシン側でのセキュリティ対策(セキュリティグループやOSのファイヤーウォールなど)が必須と言えます。

Elastic IPの応用

Elastic IPの設定は、一度設定したあとで他の仮想マシンに割り当てを変更することもできます。その性質を利用して、以下のように活用することもできます。

環境のステージング
現行の本番環境と新しい環境をVPC上に構築し、Elastic IPを付与する仮想マシンを切り替えることで新しい環境にスムーズに切り替えることができます。 新環境で動作不良が発生した場合に旧環境にロールバックすることもできるので、環境の切り替え(ステージング)が容易に行えます。
高可用性システム
本番環境と予備環境をVPC上に構築し、本番環境の動作不良が発生したときに、Elastic IPを予備環境の仮想マシンに切り替えることでサービスを継続することができます。 AWSでは、VPC内に複数のデータセンター(Availability Zone)をまたぐ構成ができるため、DR対策として構成することもできます。

しかも、Elastic IPの設定変更は管理者が手作業(Management Console)で行うほかに、API経由でアプリケーションから制御することもできます。そのためアプリケーションを作りこむことで、サービスを提供する環境を自律的に管理する仕組みを構築することもできます。

まとめと次回予告

インターネット接続(前編)ということで、VPCルーティングは仮想マシンのルーティング、仮想ルーターのルーティングを組み合わせるということ、インターネットに接続するためにElastic IPが利用できて、Static NATで実装されていることを紹介しました。 次回は後編として、VPCのもう1つのインターネット接続の方法、NATインスタンスについて紹介します。ご期待くださいー。

参考文献

ルートテーブル - Amazon Virtual Private Cloud VPC の IP アドレス指定 - Amazon Virtual Private Cloud 1週間で学ぶネットワークの要点 - NAT,IPマスカレード完全攻略:ITpro

脚注

  1. もちろん、仮想マシンのOSでルーティングテーブルのエントリーを追加することも可能です。