今回は、AWS公式が出しているVPCのハンズオンを実際にやってみたのでまとめてみたいと思います。
インフラ素人でも「なんとなく」わかるをテーマにまとめていますので、何かの参考になれば嬉しいです。
参考として勉強元としたのはAWS公式ハンズオンです。本記事は、こちらの公式ハンズオンに沿って実施した内容をまとめたものになります。
AWS VPCとは
AWS VPCとは、クラウド内にプライベートネットワークを構築することができるサービス。
AWSクラウドの中に分離したNW領域を作成することができ、その空間(領域)内に仮想サーバー(EC2)やDBサービス(RDS)などのサービス(リソース)を配置し利用することができる。
ちなみに、オンプレミスサーバーとAWSの接続方法も次の2つの方法で可能。
①オンプレミスDCとインターネットVPNサービスを使ってAWSクラウドとつなぐ方法
②オンプレミスDCと専用線(AWS DirectConnect)を使ってAWSクラウドとつなぐ方法
VPC作成とインターネット接続環境の構築
VPC・サブネット・インターネットゲートウェイ 結論
・AWSクラウド内にネットワーク空間VPCを作成する。
・VPCにはインターネットゲートウェイをアタッチすることで、インターネットゲートウェイを介して外のインターネットと通信が可能になる。
・VPCはサブネット空間に更に分割することができ、外のインターネットと通信する領域をパブリックサブネット、通信できない領域をプライベートサブネットとして定義する。
・インターネットと通信できるかできないかは、それぞれのサブネットに関連付けするルートテーブルによって決定される。
VPC・サブネット・インターネットゲートウェイ 概要
今回作成するVPC空間のイメージはこんな感じ。
何をしているところなのか、イメージすることが重要。
VPC作成 実践
さっそく先ほどの結論と概要を頭に入れたうえで、手を動かしていく。
①サービスの中から「VPC」を選択
②デフォルトのVPCが存在していることを確認
「172.31.0.0/16」はデフォルトVPC。なにか検証用のEC2を配置したりするときに使える。今回は使わない。
③「VPCを作成」を押下し、ハンズオン用のVPCを作成する。
VPCが作成される。
サブネット作成 実践
④続いてサブネットを作成する
画面右上の「サブネットを作成」から順に作成する。
作成できたら「サブネットを作成」を押下して、4つ分サブネットを作成(概要図の通りに作成)。
インターネットゲートウェイ設定 実践
⑤インターネットゲートウェイを設定
画面右上の「インターネットゲートウェイを作成」から順に作成する。
ただ、作成しただけではDetached状態のため、このインターネットゲートウェイ(IGW)をVPCに割り当てる必要がある。
VPCにアタッチを選択し、VPCにIGWをアタッチする
作成したIGWがAttachedになっていればOK。
ルートテーブル 概要
さて、サブネットとしてパブリックとプライベートを作成したが、ここまでの作成で意図的になにか、パブリックかプライベートかを分けるような設定はしていない。
実際にはルートテーブルを定義することで、パブリックサブネットとプライベートサブネットを定義することができる。
ここで、パブリックサブネットとプライベートサブネットの定義を確認しておく。
パブリックサブネット(Public) | ・ルートテーブルにインターネットゲートウェイへの登録があり、インターネットに対してIN/OUTのアクセスが可能 |
プライベートサブネット(Private) | ・ルートテーブルにインターネットゲートウェイへの登録はなく、インターネットから直接アクセスできない |
そこで、ルートテーブルの設定によってパブリックかプライベートかをコントロールすることになる。
ルートテーブルとは、ネットワークトラフィックの経路を決定するルートと呼ばれる一連のルールが定義されたテーブル情報のこと。各サブネットにルートテーブルを関連付けすることで、サブネットのネットワークルーティング(通信経路)が決定。このルートテーブルに、インターネットゲートウェイ(IGW)を登録するかどうかで、パブリックかプライベートを制御する。
ルートテーブル設定に関する実践についは次の章にて。
ルートテーブルの設定と関連付け
ルートテーブル設定 結論
・VPCの各サブネットには1つのルートテーブルが関連付けされる。
・1つのルートテーブルに異なる複数のサブネットを関連付けすることができる。
・ルートテーブルにはメインが存在する。ルートテーブルを明示的にサブネットに関連付けしない場合、そのサブネットにはメインのルートテーブルが関連付く。
・ルートテーブルの経路選択は最長プレフィックス一致にて経路選択される。
ルートテーブル設定 概要
作成するルートテーブルのイメージはこんな感じ。
0.0.0.0/0とは、デフォルトゲートウェイと呼ばれ、すべての通信を指す。つまり、送信先がすべての通信である場合は、Internet Gatewayに向かうことを意味しており、すべての通信はインターネットにつながることとなる。
また、ルートテーブルに関する優先度の考え方は以下のような考え方となる。
送信元・・・「何を」:どこのIPアドレスに対する通信か。パケットに指定された宛先IP。
ターゲット・・・「どこに」:その通信をどこに転送するのか。
つまり、とあるIPアドレスの範囲に向けた通信は、ターゲットで指定した場所へ転送するということ。
送信元とターゲットについてはこの記事を参考にすると理解深まった。
ルートテーブル設定 実践
①ルートテーブル作成
パブリック用のルートテーブルを作成する。
②続いて作成されたルートテーブルを編集する。
③プライベート用のルートテーブルを準備する。
今回のハンズオンではVPCを作成した時に自動で準備されるルートテーブルをそのままプライベートルートテーブルとする。そこで明示的にわかるようにするために名称だけ変更しておく。
④パブリックサブネットにルートテーブルを関連付け(アソシエート)させる
このルートテーブルを関連付けたいサブネットを選択する。
⑤プライベートサブネットにルートテーブルを関連付けさせる
Private subnet-aとPrivate subnet-cは明示的にどのルートテーブルとも関連付けされていない。その時は、メインルートテーブルに関連付けされる。
現在、メインテーブルは、Private Route Table。そのため、結果的にこれら2つのサブネットはPrivate Route Tableに関連付けされていることとなる。
とはいえ、ミスを防ぐために明示的に関連付けすることが通常の運用のため、今回も関連付けまで実施してあげる。これで、プライベートサブネットにも、プライベートルートテーブルが明示的に関連付けされた。
パブリックサブネットにインターネットからアクセスする
パブリックサブネットへのアクセス 結論
・パブリックサブネットにEC2を作成することで、EC2に払い出されるIPアドレスを使ってインターネットからアクセスが可能になる。
※EC2サーバの設定は今回の主ではないもののこの後利用するIAMロールの作成や設定なども含まれます。
パブリックサブネットへのアクセス 概要
今回、実現する構成図のイメージは以下の通り。
パブリックサブネット(a)にEC2サーバーを立てて、そこに対して手元のクライアントPCからアクセスすることを試みる。
IAM Role作成 実践
まずは、EC2サーバーからSSMにアクセスするための事前準備として、EC2に割り当てるIAM Roleを作成する。
インターネット構築とは直接関係ないのでわかる方は読み飛ばしてもらって構いません。
①IAMメニューから「ロールを作成」
どのようなロールを作成するかというと、後ほどAWS System ManagerからEC2を操作するための権限になる。
ロール名「handson-ssm」を付けて、ロールを作成を実行。
EC2サーバ作成 実践
続いて、EC2サーバを作成する。
②メニューからEC2を作成
インスタンスを起動を押して、実際にサーバを構築していく。
今回はEC2サーバーのハンズオンではないのでとりあえず動きそうなもので設定する。
インバウンドセキュリティグループとは、サブネットに入る時のファイアウォール(ブロックのための壁)としてどのような通信を許可するかというもの。ここでは、HTTP通信を許可する。なお、余談であるが、HTTP通信であればポート番号はデフォルトで80となっている。
ストレージの設定はそのままでOK。
高度な詳細設定を行う。
途中画像は省略。続いて、ユーザーデータ設定を行う。
次のようなスクリプトを入力する。今回の主ではないのでとりあえずコピペでOK。
#!/bin/bash
yum -y update
AWS Hands-on for Beginners – Network編#1
yum -y install httpd
systemctl enable httpd.service
systemctl start httpd.service
ちなみに、内容としては、次のようなイメージ。
#!/bin/bash ➡スクリプト実行のためにインタープリターが bash であることをシステムに伝える(おまじないなので気しないでOK)
yum -y update ➡パッケージマネージャーでシステム上のすべてのパッケージを最新に更新
yum -y install httpd ➡yum を使用して Apache HTTP サーバー(httpd パッケージ)をインストール
systemctl enable httpd.service ➡Apache HTTP サーバーのサービスを有効にし、システム起動時に自動的に起動するように設定
systemctl start httpd.service ➡Apache HTTP サーバーのサービスを直ちに開始
EC2が作成されるタイミングで実行され、EC2が起動した時点でWebサービスが立ちあがっていることを想定したスクリプトになっている。
ここまで来たら、「インスタンスを起動」を押下する。
②EC2サーバを確認
次のようなメッセージが出れば作成完了。
作成されたEC2サーバを確認。パブリックipアドレスが作成したEC2サーバに割り与えられたIPアドレスになる。
パブリックサブネットへ接続 実践
③Webブラウザからアクセスする
パブリックサブネットに配置したEC2サーバに、クライアントPCがアクセスすることができたことを確認。クライアントPC(手元のPC)のブラウザから、作成したEC2に割り振られたIPアドレスを入力することで接続を試みる。
無事に接続することができればOK。
プライベートサブネットからインターネットへアクセス
プライベートサブネットからのアクセス 結論
・プライベートサブネットからNATゲートウェイを経由してインターネットへの接続を行う。
・NATゲートウェイはあるサブネット内に配置され、固定IPアドレスを付与することで、プライベートサブネットからのプライベートIPアドレスでの通信を、外の世界でも通じるグローバルIPアドレスに変換してくれる。
プライベートサブネットからのアクセス 概要
今回の実施イメージはこんな感じ。
インターネットからプライベートサブネットへのアクセスは禁止したい。一方で、プライベートサブネットからインターネットへのアクセスは実現したい。例えば、OSのアップデートを1つとってもプライベートパブリックへのアクセスはする必要がある。
そこで、利用するのがNATである。(昔はNAT instanceで実現していたが、いまはNAT Gatewayが推奨。)
NAT(Network Adress Translation)とは、プライベートIPアドレスを外のインターネットでも通じるグローバルIPアドレスに変換してくれる仕組みのこと。そこで、プライベートサブネットから出た通信をグローバルIPアドレスに変換して、外のインターネットに接続できるようにする。
ただし、今回のハンズオンでは、外部サイトではなくVPCの外にあるSSMに接続できるかどうかという観点で確認を行う。実際、SSMの接続要件として、SSMにOutbound接続できることが挙げられるため、外部サイトに接続することと同等のテストとなる。
EC2サーバ作成 実践
パブリックサブネットのハンズオン時と同様にEC2インスタンスの作成を実施。
インスタンス名はなんでも可。
EC2にロールを割り当てる。
今回は、EC2上にApacheのWebサーバを立てないので、ユーザーデータの記載は不要。
問題なければ、先ほどと同様に「インスタンスを起動」し、EC2が起動することを確認。
NATゲートウェイ作成 実践
①VPCメニューからNATゲートウェイを作成する。
NATゲートウェイの設定を行う。
NATゲートウェイは、先ほども記載したように、プライベートサブネットから来た通信をパブリックIPアドレスに変換する必要がある。そのため、NATゲートウェイ自身のIPアドレスがコロコロ変わってしまってはいけない。そのため、固定IPアドレス(ElasticIP)をNATには持たせる必要がある。(有料)
次のように作成できていればOK。
ルートテーブル編集 実践
作成したNATゲートウェイをルートテーブルに記載し、NATゲートウェイとの通信を可能にする。
②ルートテーブルを編集する。
プライベートサブネットのルートテーブルを編集し、プライベートサブネットからNATゲートウェイに繋がるようにする。
③デフォルトゲートウェイを設定
デフォルトゲートウェイ(0.0.0.0/0)がNATゲートウェイになるように編集し、保存。
設定が完了すると、ルートテーブルに追加されたことが確認できる。
これによって、プライベートサブネットからNATゲートウェイに接続し、NATゲートウェイにてグローバルIPアドレスに変換され、プライベートサブネットからの接続ができるようになった。
プライベートサブネットへ接続 実践
①System Managerを使った動作確認を行う。
EC2インスタンスから「接続」を行う。
繋がることを確認。
つまり、このEC2サーバにセッションマネージャーを通じて、コンソール接続できているということ。(これを実現するためには、SSMにOutboud接続できている必要がある。つまり、接続できているので、Outboundできていることが確認できた。)
試しに、先ほど編集したプライベートサブネットに割り当てているルートテーブルにて、NATゲートウェイの接続を削除して、再び、セッションマネージャーに接続すると、接続ができないことがわかる。
これらの内容を踏まえると、前述したプライベートサブネットの定義は次の内容も付け加えることができる。
パブリックサブネット(Public) | ・ルートテーブルにインターネットゲートウェイへの登録があり、インターネットとインバウンド/アウトバウンドのアクセスが可能 |
プライベートサブネット(Private) | ・ルートテーブルにインターネットゲートウェイへの登録はなく、インターネットから直接アクセスできない ・パブリックサブネットに配置したNATやプロキシを経由することで、インターネットへのアウトバウンドのアクセスは可能 |
最後に
いかがでしょうか。
実際に手を動かしてみるとわかる部分も増えてきました。
何かの参考になれば嬉しいです。
コメント