この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
はじめに
こんにちは。クラウド事業本部の龍岡です。
AWSの学習を始めたときに最初につまずく? Amazon VPC の構築を初心者に向けて丁寧に解説したいと思います。
ネットには色々なハンズオンの記事がありますが、VPC、サブネット、インターネットゲートウェイ、ルートテーブルなどの設定は、前提条件としてさらっと流していたりします。
自分もはじめて構築をしてみようと思ったときに、「え?そもそもVPCってどうやって作るの?」と、いきなり困ってしまいました。
今後の学習をスムーズにするためにも、まずは基本をしっかりと理解しようと考え、記事にまとめていこうと思います。
目的
- Amazon VPC の基本を理解する
- Amazon VPC を使ってAWS上にプライベートネットワーク空間を作成する
- Amazon VPC とインターネットの接続をコントロールする方法を理解する
基本的な用語を説明
公式ドキュメントからの引用に自分なりの簡単な説明を加えています。
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/how-it-works.html
公式ドキュメントは難しく、取っつきにくいですが、サービスについて調べるときは必ず公式ドキュメントも確認したほうがいいと思ってます。
Amazon VPC(以下、VPC)
仮想プライベートクラウド (VPC) は、AWS アカウント専用の仮想ネットワークです。
VPC は、AWS クラウドの他の仮想ネットワークから論理的に切り離されています。
VPC の IP アドレス範囲を指定して、サブネットを追加し、ゲートウェイを追加して、セキュリティグループを関連付けます。
VPCはAWSの中にある自分専用のネットワーク空間で、基本的に外部(インターネット)との通信はできない様になっています。
それに色々な設定をすることでインターネットへ接続ができるようになります。
私たちはこの自分専用の空間の中にAmazon Elastic Compute Cloud (Amazon EC2、以下EC2)や、Amazon Relational Database Service (Amazon RDS、以下RDS)といったリソースを配置して、様々なサービスを構築することができます。
サブネット
サブネットは、VPC の IP アドレスの範囲です。Amazon EC2 インスタンスなどの AWS リソースを VPC サブネット内部で起動します。
サブネットをインターネット、他の VPC、および独自のデータセンターに接続し、ルートテーブルを使用してサブネット間でトラフィックをルーティングできます。
サブネットはVPC内を複数のブロックに分けることで、ネットワークを分割しています。
ネットワークAは、WEBサーバーを稼働するのでインターネットから接続可能で、ネットワークBは、データベースを稼働するのでインターネットに接続できない状態にする。
といった様に、用途を分けることができます。
インターネットゲートウェイ
インターネットゲートウェイは、VPC とインターネットとの間の通信を可能にするVPC コンポーネントであり、冗長性と高い可用性を備えており、水平スケーリングが可能です。
IPv4 トラフィックおよび IPv6 トラフィックをサポートしています。ネットワークトラフィックに可用性のリスクや帯域幅の制約が発生することはありません。
インターネットゲートウェイを使用すると、リソースにパブリック IPv4 アドレスまたは IPv6 アドレスがある場合、
パブリックサブネット内のリソース (EC2 インスタンスなど) がインターネットに接続できるようになります。
同様に、インターネット上のリソースはパブリック IPv4 アドレスまたは IPv6 アドレスを使用してサブネット内のリソースへの接続を開始できます。
例えば、インターネットゲートウェイを使用すると、ローカルコンピュータを使用して AWS の EC2 インスタンスに接続できます。
初めに説明したように、VPCはそれ自体では外部との通信はできない閉鎖空間です。
そこにIGW(インターネットゲートウェイ)という入口を取り付けることで、外部(インターネット)との通信が可能になります。
通信をするにはIPアドレスが設定されている必要があります。
ルートテーブル
ルートテーブルには、サブネットまたはゲートウェイからのネットワークトラフィックの経路を判断する、ルートと呼ばれる一連のルールが含まれます
テーブル内の各ルートは、送信先とターゲットを指定します。
例えば、サブネットがインターネットゲートウェイ経由でインターネットにアクセスできるようにするには、サブネットルートテーブルに次のルートを追加します。
ルートテーブルは、通信の宛先が書いてある表です。
これをサブネットに関連付けることで、そのサブネット内のリソース(EC2など)が別のネットワークと通信できるようになります。
つまり、宛先をインターネットゲートウェイにすれば、インターネットにアクセスできるようになるということです。
IPアドレスとCIDR
IP アドレスは、VPC のリソースの相互通信とインターネット上のリソースとの通信を有効にします。
Classless Inter-Domain Routing (CIDR) 表記は、IP アドレスとそのネットワークマスクを表す方法です。
IPアドレスはネットワークで通信するための住所で、使用するIPアドレスの範囲を表すのがCIDRブロック(IPアドレスの後についている/16や/28など)です。
AWSではVPCやサブネットを作成するときに使えるCIDRブロックが、/16(65536個のIPアドレス)~/28(16個のIPアドレス)の間と決まっています。
また、RFC1918という「インターネット関連の技術に関する使用をまとめた文書」にて、プライベートIPv4アドレス範囲からのCIDRブロックを指定することを進められています。
CIDRブロックの値が大きいと、使えるIPアドレスが少なくなります。
実際の環境を構築するときは、サービスの規模を考えて、IPアドレスが枯渇しないように設定する必要があります。
一度設定したCIDRブロックのサイズは増減できません。
細かいルールがたくさんあるので、詳しくは公式ドキュメントを参照してください
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-cidr-blocks.html
構成
ハンズオンの流れ
- VPC、サブネット、インターネットゲートウェイ、ルートテーブルを作成する
- サブネット内にEC2インスタンスを作成し、WEBサーバーとして稼働する
- パブリックサブネットとプライベートサブネットの違いを理解する
ハンズオン
前置きが長くなりましたが、ハンズオンを始めていきましょう。
1-1.VPCを作成する
マネジメントコンソールを開きます。
今回は東京リージョンで作業していくので、もしリージョンが違えば変更します。
(デフォルトは「バージニア北部」とかになってる可能性が高い)
右上のメニューをクリックし、アジアパシフィック(東京)を選択します。
左上のサービスからVPCを選択します。
サービスが多くて見つからない場合は、検索欄に「VPC」と入力してください。
メニューの「お使いのVPC」、もしくはリージョン別のリソースの「VPC」を選択します。
作成されているVPCの一覧が表示されます。
検索欄でフィルタリングすることで目的のVPCが探せます。
今は何も作成していないので空欄です。
右上の「VPCを作成」を選択します。
VPCの設定は以下の通りです。
CIDRブロックを 192.168.0.0/16 とすると
IPアドレスの範囲は 192.168.0.0 ~ 192.168.255.255
となり、2の16乗である65,534個のIPアドレスがあります。
(AWSで予約されてる5個は使えないので、実際に使用できる数は65,529個)
タグは、今回のハンズオンには関係ありませんが、リソースを管理するのに重要です。
AWSは従量課金制なので、使用しているリソースにしたがって課金されます。
検証用に作ったリソースを消し忘れて、高い料金を請求される可能性もあります。
また、他人のリソースをうっかり消さないためにも、必ずタグは付けたほうが良いと思います。
今回のハンズオンで作成するリソースにはすべて
キー: User
値: 自分の名前
というタグを追加でつけようと思います。
「VPCを作成」をクリックして、作成は完了です。
VPCの一覧画面でも確認できます。
1-2.サブネットを作成する
左のメニューから「サブネット」を選択します。
右上の「サブネットを作成」を選択します。
サブネットの設定は以下の通りです。
サブネットの名前は機能などが識別しやすいように名づけましょう。
この後の設定で、サブネット1をパブリックサブネット、サブネット2をプライベートサブネットにする予定です。
サブネットの名前にわかりやすくpublic, privateと付けます。
アベイラビリティゾーンを1aにしたので、名前にもaを付けました。
ここでpublicと名づけたからと言って、インターネットに接続できるようになるわけじゃありません。
サブネットは同時に作成できるので、
一つ目を入力したら「新しいサブネットを追加」をクリック。
「サブネットの作成」をクリック。
サブネットの作成が完了しました。
名前から、どんな機能で、どのアベイラビリティゾーンに作ってあるのかわかります。
利用可能なIPv4アドレスが251個になっています。簡単に説明します。
IPv4アドレスは32bitです。
CIDRブロックが/24なので、ホスト部は32-24で8bitです。
2の8乗が256であり、そのうちAWSに予約されている5を引くと251個になります。
IPアドレスやホスト数に関する知識は一般的なネットワークの知識なので、わからない場合は調べてみましょう。
解説サイトはたくさん出てきます。
1-3.インターネットゲートウェイを作成する
続いて、IGWを作成します。
左のメニューから「インターネットゲートウェイ」を選択し、右上の「インターネットゲートウェイの作成」をクリックします。
設定は名前タグとタグしかありません。
名前はわかりやすければなんでもいいです。
入力したら「インターネットゲートウェイの作成」をクリック。
IGWは作成されましたが、状態が「Detached」になっています。
初めに説明した通り、IGWは入口です。
VPCに入口をくっつける(アタッチ)ことでインターネットに接続できるようになります。
先ほど作ったVPCにアタッチしましょう。
「アクション」から「VPCにアタッチ」を選択します。
作ったVPCを選択します。
「インターネットゲートウェイにアタッチ」をクリック。
IGWがアタッチされました。
1-4.ルートテーブルを作成する
インターネットに接続するためのルートテーブルを作成します。
左のメニューから「ルートテーブル」を選択します。
すでに一つルートテーブルが存在しますが、
これはVPCを作成した時点で自動で作成される、メインルートテーブルです。
ほかのルートテーブルに明示的に関連付けられていないすべてのサブネットのルーティングを制御します。
今は無視して先に進みます。「ルートテーブルを作成」をクリックしてください。
ルートテーブルの設定は以下の通りです
設定内容がわかりやすい名前にしましょう。
ここでpublicと名づけたからと言って、インターネットに接続できるようになるわけじゃありません。
ルートテーブルが作成されました。
ルートを確認すると、以下の設定が存在します。
送信先: 192.168.0.0/16
ターゲット: local
ターゲットの「local」とは、「VPC内」を表します。
「宛先のIPアドレスが192.168.0.0/16の範囲の場合は、VPC内に通信を転送する」
という意味になります。
ここに、インターネットに接続できるようにルートを設定します。
「ルートを編集」をクリックしてください。
「ルートを追加」をクリックします。
送信先に「0.0.0.0/0」を選択する。
ターゲットに「インターネットゲートウェイ」から先ほど作ったIGWを選択する。
「変更を保存」をクリックします。
新しくルートが追加されました。
送信先: 0.0.0.0/0
ターゲット: igw-*****(先ほど作ったIGW)
送信先の、0.0.0.0/0とは「すべての通信」を表します。
「すべての通信はインターネットゲートウェイに通信を転送する」
という意味になります。
これで、このルートテーブルを設定したサブネットはインターネットに接続できるようになりました。
自動で作成されていたメインルートテーブルにも名前を付けて識別しやすくしておきます。
「Name」にカーソルを当て、ペンのマークをクリックすると名前を変更できます。
このメインルートテーブルはプライベートなので、privateと付けておきます。
二つのルートテーブルが確認できます。
privateと名づけた、インターネットに接続できないルートテーブル(以下、PrivateRouteTable)
publicと名づけた、インターネットに接続できるルートテーブル(以下、PublicRouteTable)
「明示的なサブネットの関連付け」を見ると、何も関連付けられていません。
サブネットを関連付けて、サブネットがインターネットに接続できるようにしましょう。
「サブネットの関連付けを編集」を選択してください。
関連付けるのはpublicと名づけた方のサブネットです。
設定が完了しました。
「明示的なサブネットの関連付け」の方にpublicと名づけたサブネット
「明示的な関連付けがないサブネット」の方にprivateと名づけたサブネット
※明示的に関連付けてないサブネットは、メインルートテーブルに関連付けられることになっています。
(画像の緑枠の部分に書いてあります)
このままでもいいのですが、privateのサブネットも明示的にプライベートにしておきます。
PrivateRouteTableの、「明示的なサブネットの関連付け」から「サブネットの関連付けを編集」をクリックします。
「privateと名づけたサブネット」を選択して、変更を保存します。
PrivateRouteTableに「privateと名付けたサブネット」が明示的に関連付けられました。
プライベートサブネットとパブリックサブネット
先ほどから、「プライベートサブネット」ではなく「Privateと名付けられたサブネット」と回りくどい表現をしていますが、理由があります。
1-2.で作成したサブネットは、作成した時点で「プライベートサブネット」だったり「パブリックサブネット」なわけではありません。
管理しやすいから「private」とか「public」と名前の語尾に付けただけです。
パブリックサブネットとは、関連付けた「ルートテーブル」に「インターネットゲートウェイ」への経路があり、「インターネットとアクセスが可能」なサブネットであり、
プライベートサブネットは、関連付けた「ルートテーブル」に「インターネットゲートウェイ」への経路がなく、「インターネットとアクセスが不可能」なサブネットなわけです。
関連付けたルートテーブルの設定によって、パブリックかプライベートかが決まるので、これまでは回りくどい言い方をしていました。
これ以降は、それぞれのサブネットを以下のように呼びます。
PrivateRouteTableに関連付けたサブネット:プライベートサブネット
PublicRouteTableに関連付けたサブネット:パブリックサブネット
ルーティングの優先度
複数のルートが存在する場合、ルートテーブル内に定義された最も具体的なルートが優先されます。
「最長プレフィックス一致」、「ロンゲストマッチ」というルールです。
現在のルートテーブルで、送信先が192.168.10.1の通信を行った場合、ターゲットは「local」が選択されます。
2-1.EC2を作成し、WEBサーバーを起動する
サブネットが作成できたので、次はWEBサーバーを動かします。
EC2インスタンスを作成し、その中でApacheというWEBサーバーを起動します。
上のメニューの「サービス」から「EC2」を選択します。
「インスタンスを起動」を選択します。
EC2の設定は以下の通りです。
表を参考に値を入力してください。
送信元が0.0.0.0/0のルールを指定すると、すべてのIPアドレスからインスタンスにアクセスが許可される。
この後、自分のパソコンからアクセスするため、すべてのIPアドレスを許可しておく。
ユーザーデータに入力したスクリプトは、EC2インスタンス起動時に実行されます。
パッケージのアップデートやインストールを自動で行いたいときに入力します。
#!/bin/bash
dnf -y update
dnf -y install httpd
systemctl enable httpd.service
systemctl start httpd.service
スクリプトの説明
#!/bin/bash
ユーザーデータのシェルスクリプトは、#! の記号と、スクリプトを読み取るインタープリタのパス (通常は /bin/bash)) から始める必要があります。 https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/user-data.html
dnf -y update
- dnfはLinuxのパッケージ管理コマンド
- updateでインストールされてるパッケージをアップデートする
dnf -y install httpd
- Apacheのインストール
systemctl enable httpd.service
- Apacheを自動起動するように設定
systemctl start httpd.service
- Apacheを起動
すべて入力したら「インスタンスを起動」をクリック。
インスタンスが作成されました。
はじめはインスタンスの状態は「保留中」ですが、ちょっと待つと起動します。
インスタンスの状態が「実行中」になりました。
「システムステータスのチェック」はインスタンスが実行されているAWSシステムのモニタリングします。
「インスタンスステータスのチェック」は個々のインスタンスのソフトウェアとネットワークの設定をモニタリングします。
ステータスチェックが完了しました。
これで、EC2インスタンスの中でWEBサーバー(Apache)が稼働しているはずです。
2-2.WEBサーバーの動作確認
EC2インスタンスの中で起動しているWEBサーバーにアクセスできるか試します。
インスタンスの詳細からパブリックIPv4アドレスをコピーし、ブラウザのURL欄に入力してアクセスできるかを試します。
「It works!」と表示されたのでApacheは正常に動いています。
「保護されていない通信」となっているのはhttpで通信しているからです。
もしこの段階で以下の画像のようにApacheにアクセスできない場合は、URL欄をクリックしてhttps通信になっていないか確認してください。
EC2インスタンスの設定をしたときに、セキュリティグループを設定したと思います。
そこでインバウンドルールとして許可したプロトコルはHTTPだけですので、httpsだとセキュリティグループに拒否されて通信ができません。
これで無事にWEBサーバーが起動しており、インターネットからアクセスができることが確認できました。
3.ルートテーブルの設定を変更し、WEBサーバーにアクセスできなくなることを確認する
ルートテーブルの設定によってインターネットに通信ができていることを証明するために、あえて、ルートテーブルの設定を変更してみましょう。
PrivateRouteTableに「パブリックサブネット」を関連付けます。
(もうこの時点でパブリックサブネットとは呼べないのだと思います)
もう一度、パブリックIPアドレスでアクセスしてみます。
WEBサーバーにアクセスできなくなりました。
PrivateRouteTable関連付けたサブネットは、たとえ名前にpublic・・・とついていてもインターネットに接続することはできません。
ルートテーブルの設定によって、インターネットに接続できていたことが証明できました。
まとめ
VPCの基本を理解して、構築することができました。
ルートテーブルによってインターネットの接続をコントロールする方法が理解できました。
画像をたくさん使い、はじめてマネジメントコンソールを操作する人でも問題なく操作できたと思います。
今回は、パブリックサブネットのEC2インスタンスがインターネットへ通信できる設定をしました。
次回は、プライベートサブネットのEC2をセキュアにインターネットへ接続する方法をまとめたいと思います。