はじめてのAmazon VPC - 2. 外部インターネットと接続する(NATインスタンスを使う)

前回のエントリ「はじめてのAmazon VPC - 1. ルーターからVPCへVPN接続する」の続きです。(今更シリーズ)


Amazon VPCでは、各サブネットでのアクセスコントロールを柔軟に設定できたり、自ネットワークからVPNトンネルをはって接続できるなど、よりセキュアなネットワーク構成を意識できることもあり、VPC内で起動したサーバ(Amazon EC2インスタンス)は、場合によっては外部インターネットに出て行くことが出来ないケースがあります。

しかし、サーバから外部の必要なものをダウンロードしたり、外部リポジトリや外部APIアクセスしたい場合、Amazon S3等のVPC外のAWS各サービスに接続したい場合(パブリックネットワークからしかアクセスできない)などもあるでしょう。


もちろん、そこはVPCでの設定次第となりますので、今回は、前回作成したAmazon VPC網内で起動したEC2インスタンスから、外部インターネットに接続する方法を書いてみます。

おさらい

前回のエントリで、VPC内にPublic Subnet(パブリックサブネット)とPrivate Subnet(プライベートサブネット)の2つを作成しました。
外部との通信については、それぞれ以下のようなイメージです。

  • Public Subnetでは、デフォルトゲートウェイが、インターネットゲートウェイとなっている
    • Public IP Addressさえ付与されていてかつ、適切なセキュリティグループが設定されていれば外部インターネットとの通信は可能
    • アウトバウンドもインバウンドもOK
  • Private Subnetでは、基本的に外部インターネットとの通信はできない
    • 外部と通信を行うためには、後述のNATインスタンスを介す必要がある


というわけで、上記のPublic/Private Subnetそれぞれについて、オペレーションを含め、詳しく紹介してみます。

Public Subnetにインスタンスを配置する

まずは、Public SubnetにEC2インスタンスを配置するパターンです。
Public Subnetでは、上述の通り、Public IP Address(グローバルIPアドレス)を付与して、セキュリティグループを適切に設定すれば、In/Out双方とも外部インターネットと通信可能となります。

起動時にPublic IP Addressを割り当てる

前回のエントリと同様に、AWS Management Consoleを使ってみます。
ここでも、EC2のインスタンスの詳しい起動手順については(多くの紹介サイトがあるため)割愛します。


まず、Public Subnetのルーティングテーブルを確認します。

AWS Management Console上部の [Services] - [VPC] から、VPCのダッシュボードを開き、サイドメニューから"Route Tables"をクリックします。


Public Subnet用のルーティングテーブルには、上記のようにデフォルトルート(0.0.0.0/0)宛が、インターネットゲートウェイ(igw-xxxxxx)となっていることが確認できます。


次に、EC2インスタンスを起動します。


起動するAMIを選んだ後に、上部ウィンドウで、インスタンスを配置するサブネットを選択します。
ここでは、"Public Subnet"として設定しているサブネットを選択しましょう。


次のウィンドウでは、ネットワークインターフェースが設定できますが、ここで"Auto-assign Public IP"にチェックを入れましょう。
これで、Public IP Addressが自動で付与されます。


適切なセキュリティグループを割り当てます。
(↑は、あまり良い例(名前的に)ではありませんが、ここでは検証ってことで、PiblicSubnetという名前で設定していますw)

あとは、そのままEC2インスタンスを起動してしまえばOKです。


次に、Amazon VPCまわりのネットワークACLを確認します。
AWS Management Consoleの上部 [Services] - [VPC] から、VPCのダッシュボードを開き、サイドメニューから"Network ACLs"をクリックしてください。
デフォルトのままだと、ACLが1つだけあって、下記のようになっているかと思います。


デフォルトだと、このようにサブネットのACLレベルでは、全て許可されています。特に問題なければこのまま使うなり、適切に設定したりしましょう。


さて、そろそろ先ほど起動したEC2インスタンスがアクティブ(利用可能)になった頃でしょうか。


EC2ダッシュボードで起動したインスタンスを選択し、上記のようにPublic DNS(Public IP Address)が割り振られていればOKです。


最後に、先ほどインスタンスに割り当てたセキュリティグループ(今回の例だとPublicSubnet)で、アウトバウンド通信のフィルタ状況(Outbound)を確認します。デフォルトだとこの通り、全てのアウトバウンド通信が通過するようになっているので、この状態であれば、もうインスタンスから外部インターネットへの通信ができる状態になっているはずです。


ちなみに、外部インターネットからのインバウンド通信も許可する場合は、セキュリティグループのInboundのところを設定しましょう。
上記例は、TCPの80番ポートのみ、どこからでも(0.0.0.0/0)受け付けるように設定しています。
(10.32.0.0/12, 10.96.0.0/16, 10.48.0.0/19 sourceの設定は、私の内部検証環境にあわせたものなので、気にしないでくださいw)

Elastic IPを割り当てる

あまりないとは思いますが、Public Subnetで既に起動されているインスタンスに対して、あとからPublic IP Addressを割り当てたくなった場合はどうするかというと、Elastic IPを割り当てます。

Elastic IPは、まずEC2のダッシュボードを開き、サイドメニューから "Elastic IPs" をクリックします。


まだ1度もElastic IPを取得したことがない場合は、上記のような画面だと思います。
"Allocate New Address"をクリックします。


確認ウィンドウが出るので、"Yes, Allocate"をクリック。


すると、Elastic IP(このように自由に使える固定グローバルIPアドレス)が自分用に払い出されます。
ここで、払い出されたIPアドレスにチェックが入っている(割り当てたいアドレス)のを確認して、"Associate Address"をクリックします。


次に、割り当てたいインスタンスID(もしくは割り当てたいネットワークインターフェース)を指定して、"Yes, Associate"をクリックします。
このタイミングで、指定したインスタンスに、先ほど取得したElastic IPが割り当てられているはずです。


これがBeforeで、、、


これがAfterです。Public DNSの部分に割り振られていることが確認できますね。
これで、外部との通信が可能な状態になっているはずです。

NATインスタンスを利用する

次に、外部インターネットとの通信ができないPrivate Subnetに配置されているインスタンスを、外部通信させるためには、どうすべきかという話です。



引用元: http://www.slideshare.net/AmazonWebServicesJapan/nat-20120719


上記は、AWS公式のプレゼン資料から、引用させていただいた画像ですが、上記のようにPublic SubnetにNATインスタンスと呼ばれる仲介役を配置して、Private Subnetから、インターネットにアクセスしてみたいと思います。

NATインスタンス用のセキュリティグループを作成する

まず、事前にNATインスタンス用のセキュリティグループを設定します。
サイドメニューの"Security Groups"をクリックし、"Create Security Group"をクリックします。


ここでは、任意の名前と説明を入れるだけです。入力後、"Yes, Create"をクリック。


そこから作成したセキュリティグループを選択すると、その下部からフィルタの設定ができます。
今回はサンプルとして、Private Subnetから、外部の HTTP/HTTPS 接続できるように設定してみたいと思います。


まずは、アウトバウンド。今回の例ではHTTP/HTTPSのプロトコルを通過させたいので、80, 443ポート宛は、すべて許可します。


次にインバウンド。VPC内のインスタンスからの80, 443ポート宛を受け付けるようにします。
(あとは、NATインスタンスへのSSH接続用等、適宜追加してください。)

NATインスタンスを起動する

NATインスタンスは、普通のEC2インスタンスですが、AWS公式のAMIがあるので、これを使います。


次にNATインスタンスを起動します。
EC2でインスタンスをローンチしようとすると、AMIを選択する画面になりますが、ここでAll imagesを検索対象にして、「ami-vpc-nat」の文字列で検索します。
今時点では、↑の3つが該当しましたが、どれを使っても大丈夫そうです。今回は、一番新しいであろう"amazon/amzn-ami-vpc-nat-pv-2013.03.1.x86_64-ebs"(ami-5f840e5e)を選択してみました。


間違えないようにPublic Subnetを選択します。


先ほども書きましたが、外部インターネットに接続するためには、Public IP Addressが必要なので、ネットワークインターフェースの設定の部分で、"Auto-assign Public IP"にチェックを入れます。
ちなみに、外部インターネットに接続する際に、Source IPを固定アドレスにしたい場合は、Elastic IPを使いましょう


セキュリティグループの選択では、先ほど作成したNATインスタンス用のセキュリティグループを選択します。
こんな感じで、EC2でNATインスタンスを作成します。

NATインスタンス/ルーティングの設定

まず、EC2のダッシュボードのインスタンス一覧から、先程、起動したNATインスタンスを選択して右クリック(もしくはActionsボタンをクリック)して、"Change Source/Dest Check"をクリックします。
(これは、発信元/宛先が自分のIPアドレス以外の通信を行うための設定。通常は自分のIPアドレス宛/発信のみ処理。)


"Yes, Disable"をクリックします。(発信元/宛先が自分のIPアドレスの通信かのチェックを無効に。)


次にPrivate Subnetのルーティングテーブルを設定すべく、VPCのダッシュボードを開き、サイドメニューの"Route Tables"をクリックして、Private Subnetのルーティング設定を開きます。


初期設定では、localネットワークくらいしか入ってなかったと思うので、デフォルトルートを先程作成したNATインスタンスに向けます
具体的には、↑の例のように、"0.0.0.0/0"宛を、NATインスタンスのIDに向けて設定します。
(上記設定で、10.32.0.0/12とかVGWに向いているものは、VPNトンネル用なので気にしないでOKです。)

動作確認

これで、

[EC2インスタンス(Private Sunet)] => [NATインスタンス(Public Subnet)] => [インターネット]

といった通信が可能になったはずなので、Private Subnetに配置されているインスタンスから外部インターネット宛に通信してみてください。

PrivateSubnetInstance$ curl http://calculator.s3.amazonaws.com/calc5.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <META http-equiv="content-type" content="text/html; charset=UTF-8" />
        <script>var VersionDir="calc5_20130917";</script>
        <title>Amazon Web Services Simple Monthly Calculator</title>
        <META NAME="keywords" CONTENT="Calculator, calculate, estimate your costs,EC2,S3, Amazon Web Services, Web services,SimpleDB,SQS,RDS,VPC,CloudFront,AWS Premium Support" />
        <META NAME="description" CONTENT="The AWS Simple Monthly Calculator helps customers and prospects estimate their monthly AWS bill more efficiently. Using this tool, they can add, modify and remove services from their 'bill' and it will recalculate their estimated monthly charges automatically. The calculator also shows common customer samples and their usage, such as Disaster Recovery and Backup or Web Application." />

・・・・・省略・・・・・

例えば、グローバルのAmazon S3へリクエストしてみると、こんな感じでレスポンスが返ってきます。


と、こんな感じでAmazon VPC内のインスタンスから外部インターネットへの疎通ができました。
また長くなってしまったので、今日はこの辺まで。(続きは別のエントリにします。)

それでは!=͟͟͞͞(๑•̀=͟͟͞͞(๑•̀д•́=͟͟͞͞(๑•̀д•́๑)=͟͟͞͞(๑•̀д•́




まとめ


クラウドAMAZON EC2/S3のすべて (ITpro BOOKs)

クラウドAMAZON EC2/S3のすべて (ITpro BOOKs)

Amazon Web Services クラウドデザインパターン 設計ガイド

Amazon Web Services クラウドデザインパターン 設計ガイド