基本的なAWSネットワークの理解

# はじめに
AWSの基礎的な**ネットワーク**の構築ついて、AWSサービスである**VPC**を用いて、最もシンプルな構成から理解を深め、その後にクラウドアーキテクチャの設計原理に基づいて、どう**セキュリティ**を強化するのか、**可用性**を向上させるのかなど各条件についても整理したいと思います。手を動かすような作業ではなく、そもそもの概念的な部分について解説していきます。また今回はVPCを用いたネットワーク構築について書きたいため、AWS関連の用語についての説明は一部省いております。

# VPCとは
**Virtual Private Cloud**の略であり、言い換えると自分用のクラウド環境が作れるサービスです。つまりVPCを用いることで、誰でもプライベートなネットワーク空間が構築可能ということです。このようなネットワーク領域を構築することで、簡単にサーバーを配置することができます。次にVPCを用いた最低限のネットワーク構成を考えてみたいと思います。

# 最もシンプルなネットワーク構成
VPCを用いた最も簡単なネットワーク構成は以下のように構築できるかと思います。
![architecture_aws-simple architecture (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513383/8b3f9b63-3666-eb42-e28a-dfbfff3e4746.jpeg)
まずはAWSクラウドの中で、VPCを用いて**自分用のネットワーク空間**を構築します。その中にサーバーを配置するための箱の役割を果たすサブネットを配置し、その上に**EC2**（サーバー）を置いたという構成になります。加えて、**IGW**（インターネットゲートウェイ）を配置し、**インターネット**からサーバーにアクセスできるようにします。ここまで来ると、後はデプロイだけに思えてしまいますが、このネットワーク構成では多くの問題があります。
例えば一番最初に対策しなければならない問題として、セキュリティ面での問題が挙げられると思います。**EC2**（サーバー）からインターネットに出れること自体は良いのですが、上のネットワーク構成では、インターネットから自由に**EC2**（サーバー）に対して、アクセス出来てしまいます。言い換えると、勝手に中身を覗かれる、もしくは書き換えられてしまいます。例えばDBサーバーであれば問題です。そこで最低限のセキュリティ強化が必須となります。

# セキュリティの強化
以下の構成図が完成図です。外部から**EC2**（サーバー）にアクセスされないように、サブネットを分ける作業を行っています。
![architecture_aws-Page-2 (1).jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513383/2931baaf-2959-94cc-6fcb-bbeb277d3df2.jpeg)
仕組みとしては、外部からアクセスされたくないもの（EC2）を守る設計となっています。具体的には、**EC2**（サーバー）からインターネットにはアクセスできるが、外部（インターネット）からEC2にはアクセスできないようなネットワークを構築します。
これを実現するために最初にするべきことは、外部（インターネット）からアクセスされても良いインスタンス（AWSリソース）を入れる箱、外部からアクセスされたくないインスタンスを入れる箱を作成することです。つまりサブネットをもう一つ作成し、一つはインターネットと直接アクセスできるサブネット、もう一つはインターネットと直接繋がっていないサブネットを作成します。それが上の図にもある**パブリックサブネット**と**プライベートサブネット**です。ただのサブネットに対して、パブリックIPアドレスを割り当て、（ルートテーブルに）**デフォルトゲートウェイ**をIGWに設定することで、配置されたインスタンスにパブリックIPアドレスが付与され、インターネットと通信できるような**パブリックサブネット**を作成することが出来ます。またVPC内のみのプライベートなIPアドレスしか持たせないような**プライベートサブネット**も作成します。（各サブネットのルートテーブルはデフォルトでIGWに繋がっていないため、そのままデフォルトゲートウェイを触らないでオッケーです。）
次に使用しているAWSサービスのうち外部からのアクセスを避けたいものと、別にアクセスされても構わないものの二つに分類し、前者を**プライベートサブネット**、後者を**パブリックサブネット**に配置します。今回の場合、EC2は外部からアクセスされたくないため、プライベートサブネットに配置します。
最後にプライベートサブネットからインターネットまでの道を構築します。パブリックサブネットは既にパブリックIPアドレスを持ち、ルートテーブルのデフォルトゲートウェイにIGWを設定しているため、インターネットとの相互アクセスを実現しています。ただプライベートサブネットは、パブリックサブネットと違い、インターネット側からのアクセスは許可したくないという条件があり、ここで使えるのが**NATゲートウェイ**です。NATとは**Network Address Translation**の略であり、プライベートIPアドレスをパブリックIPアドレスに変換する機能を持つため、プライベートサブネット内のインスタンスが持つ、プライベートIPアドレスをパブリックなものに変換してくれます。したがって、IGWとの繋がりを持つパブリックサブネットに**NATゲートウェイ**を配置することで、**プライベートサブネット → インターネット**のみの道を構築することが出来ます。（ちなみにプライベートサブネットからインターネットまでは①〜⑤の順で通信します。）
更なるセキュリティ強化には、インスタンス単位のステートフルなファイヤーウォールである**セキュリティグループ**と、サブネット単位のステートレスなファイヤーウォールである**ネットワークACL**の二つの設定がありますが、今回は飛ばします。

# 可用性の向上
次に考えるべきことは**可用性**についてです。可用性とは、**システムが利用できる時間の割合**を示す言葉です。具体的に可用性が高いシステムとは、稼働時間が長いシステムのことを表します。ネットワークを構築する段階で、可用性のことを考えることは非常に大切であり、それを実現できるようなサービスもAWSは取り扱っています。
![architecture_aws-Page-4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513383/c58cc60e-d44b-f11b-cdb2-fcced1c9919b.jpeg)
ここで新しく追加されたコンポーネントは**ALB**（Application Load Balancer）と呼ばれるものです。名称から分かる通り、アプリケーションに対するアクセスの負荷分散装置（Load Balancer）です。具体的には**ALB**を通して、異なる二つのAZに存在するEC2インスタンスに負荷を分散させることで、システムの高可用性を実現する構成です。以下に上記のネットワークにおける、インターネットとの通信を示します。
![architecture_aws-Page-5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/513383/03f31289-1caf-f297-9144-0a1ca1dee778.jpeg)

# おわりに
ここまで読んでいただきありがとうございました。更に複雑な構成についても今後勉強する中で、残していこうと思います。誤字、修正すべき箇所がありましたら、お手数ですがコメント等でご連絡していただければと思います。