AWSでサーバーとネットワーク構築を勉強してみた

サーバーサイドエンジニア2年生の私が、書籍「**Amazon Web Services 基礎からのネットワーク&サーバー構築**」でインフラの基礎を学び、アウトプットとしてまとめました。
「**この記事を読んだ後に実際にAWSに触ってみた時、何をやっているのかざっくりわかる**」ような記事を意識しました。
いろいろな方がお勧めしているとおり、ハンズオン形式でAWSだけでなくインフラの基礎も学べます。
**インフラ＆AWS初心者**の方はぜひ！

# はじめにざっくり理解
**ネットワーク構築**とは、コンピュータ同士を安全に接続するためにいろいろな設定をする作業
【やること】

- VPC領域を作る
- ルーティング情報を設定する
- デフォルトゲートウェイを設定する

**サーバー構築**とは、サーバーを用意して、安全かつ安定したサーバーになるようにいろいろな設定をする作業
【やること】

- EC2インスタンスを作る
- サーバーにセキュリティを設定する

セキュリティ強化のために行われる当たり前のサーバー構築手法

- 踏み台サーバーを作る
- NAT(Network Address Translation)サーバーを作る


## 前提知識
今回利用するサービスは、VPCとEC2です。2つだけ。
VPCはネットワーク構築、EC2はサーバー構築に関するサービスです。
はじめに、AWSの専門用語2つと、IPアドレス、サーバーについて整理します。

### リージョン(Region)
これはAWSの専門用語。
世界で10か所のデータセンター群があり、その一つ一つのデータセンター群の事をリージョンという。
たとえば、「オレゴンリージョン」「東京リージョン」がある。
実際に運用する時は、エンドユーザに近いリージョンを選ぶとよい（レスポンスがよくなる）。
2020年5月現在、日本のリージョンは「東京リージョン」のみ。
AWS公式によると、「大阪リージョン」が近日開始するとのこと。[^1]

### アベイラビリティゾーン(Availability Zone:AZ)
これもAWSの専門用語。
リージョンがさらに分割された区域のこと。耐障害性のために、リージョンの中に分散している。
たとえば、「ap-northeast-1(アジアパシフィックの東京)」「ap-northeast-2(アジアパシフィックのソウル)」「us-east-1(米国東部のバージニア北部)」などがある。
実際に運用する時は、耐障害性を高めるために、複数のアベイラビリティゾーンに同じサーバーを置いて負荷分散するとよい（AWS公式が推奨している）。

### IPアドレス
**ネットワークに繋がれているコンピュータやネットワーク機器に割り振られる、一意の番号のこと。**インターネット上の住所ともいえるよ。
IPアドレスは大きく2種類。
#### パブリックIPアドレス（グローバルIPアドレス）
- インターネットに接続するときにつかうIPアドレスのこと
- ICANN(Internet Corporation for Assigned Names and Numbers)という団体が管理している
- AWSでは「パブリックIPアドレス」という名称がつかわれているよ

#### プライベートIPアドレス
- インターネットで使われないIPアドレスのこと
- だれも管理してないから、自由に使っていい
- 例えば、社内LANを構築する時に使ったり、個人の学習用として使える
- **だいたいは**、10, 172, 192 のどれかからはじまる

### サーバー
LinuxとかWindows ServerとかのサーバーOSがインストールされたコンピューターのこと。
サーバーOSとは、サーバー用に作られたOSのこと。
たくさんのユーザ（=クライアント）からの接続要求に答えたり、常時安定した稼働を実現するなど、クライアントに対してサービスを提供することに特化している。
サーバーに専用のソフトウェアをインストールすることで、「Webサーバー」とか「DBサーバー」が出来上がる。
もう少し具体的な例を図にしてみた。
<img width="906" alt="スクリーンショット 2020-04-12 18.01.50.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413104/7317e7c1-19dc-a451-944f-f38a41b704e8.png">

ちなみに、Webサーバー用のソフトとDBサーバー用のソフトをインストールすることで、「Webサーバー兼DBサーバー」も作れるよ。


# ネットワーク構築って何をするの
ネットワーク構築とは、ざっくりいうと、**コンピュータ同士を安全に接続するための設定をいろいろすること**。

## VPC領域を作る
実世界でいうと、ルータやハブなどを用意して環境を整える作業にあたる。
### VPC(Amazon Virtual Private Cloud)
ひとことで言うと、AWS上の**ネットワークの範囲**のこと。
**パブリックサブネット**（インターネットに接続することを目的としたサブネット）と、**プライベートサブネット**（インターネットから隔離したサブネット）の２種類を作ることが多い。
こうすることで、セキュリティを高めることができる。
たとえば、DBサーバーをプライベートサブネットに配置することで、外部から攻撃を受けにくくなる。
(プライベートサブネットはインターネットから隔離してあるから)

VPC領域を作った直後は、デフォルトのルートテーブルが作られる。
サブネットを作った時も、そのサブネットのデフォルトルートテーブルが作られる。

少し踏み込んだ内容になりますが…
はじめてサブネットを作成するとき、[Availability Zone]は「No Presence」でよい。
　→ランダムなアベイラビリティゾーンが自動で割り当てられるから
２つめ以降を作るときは、1つめに作ったアベイラビリティゾーン以外のアベイラビリティゾーンを選択するとよい。
　→片方のアベイラビリティゾーンに障害があったときに、影響が出にくくなるから

## ルーティング情報を設定する
ネットワークにデータを流すために、ルーティング情報を設定する。
この設定を、「ルートテーブル」や「ルーティングテーブル」という。
具体的には、**宛先IPアドレスの値がいくつのときに、どのネットワークに流すべきかを設定**する。
<img width="504" alt="スクリーンショット 2020-04-13 0.31.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413104/ed668263-8d6d-c8d9-e44c-d865499edf48.png">

上の設定値の意味は、
>送信先が「10.0.0.0/16」に含まれるIPアドレスのパケットであれば、VPC領域のルーターに接続されている相手への通信と判断するよ。
だから、VPC領域のルータ(今回はlocal)にパケットを転送するよ。

## デフォルトゲートウェイを設定する
デフォルトゲートウェイとは、転送先が設定されてないときのデフォルトの転送先のこと。
「0.0.0.0/0」は、すべてのIPアドレス範囲を表す。
つまり、「0.0.0.0/0」に対するターゲットの設定は、デフォルトゲートウェイとして機能する。
このデフォルトゲートウェイを、インターネットゲートウェイに設定すれば、インターネットに接続できる。

先ほどの2工程、「ルーティング情報を設定」と「(インターネットゲートウェイとしての)デフォルトゲートウェイを設定」をすることで、インターネットに接続できる状態になる。


# サーバー構築って何をするの
サーバー構築とは、ざっくりいうと、**サーバーを用意して、安全かつ安定したサーバーになるように設定をいろいろすること**。
ただ作ればいいってもんじゃないの。

## EC2インスタンスを作る(立てる)
つまりサーバーを立てるってこと。
### EC2(Amazon Elastic Compute Cloud)
平たく言うと、**サーバー**のこと。
もう少し詳しくいうと、**AWSの仮想サーバー**のこと。
だからインスタンスのことは仮想サーバーと読み替えても問題ない。
AWSで作ったサーバーのことを**インスタンス**という。
「AWSで作ったサーバー」とざっくり言った理由は、EC2の他にもRDS(DB構築＆管理できるサービス)やEB(Elastic Beanstalk：アプリのデプロイや管理を自動でしてくれるサービス)などからもインスタンスが作成できるから。
インスタンスを作るときは、
　・CPUのスペック
　・ディスクの容量
　などが決められる。
高性能なインスタンスを作る場合は課金が必要。

## サーバーにセキュリティを設定する
AWSでは、「**セキュリティグループ**」で設定する
「Inbound」「Outbound」の2種類設定できる

- Inbound・・・外から、このインスタンス(仮想サーバ)に接続するときの設定
 →誰かが接続しようとしているのを排除するために設定する

- Outbound・・・このインスタンス(仮想サーバ)から、外側に出ていくときの設定
 →サーバーから、他のコンピュータに接続しようとするのを防ぐために設定する


## 踏み台サーバーを作る
踏み台サーバーとは、インターネット接続されていないサーバーにアクセスするための方法のひとつ。
これは、セキュリティ強化のための、クラウド・オンプレ環境の両方にある概念というか手法。
よくある構造は以下。
<img width="643" alt="スクリーンショット 2020-05-05 1.10.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413104/a401199f-b165-869b-2523-0e16a9cf262c.png">


言葉にすると、
>ローカル環境やインターネットから、Webサーバーにアクセスする
そして、WebサーバーからDBサーバーにアクセスして処理が行われる

このときのWebサーバーは、DBサーバーの「踏み台サーバー」になる。
どうしてわざわざ踏み台サーバーを作るか、というと、**セキュリティを強化できる**から。
→たとえば、踏み台サーバー以外のところからのアクセスは全て不正アクセスとする、とかできる。

でも、必要なアプリをインストールとかアップデートするときも、わざわざ踏み台サーバー経由するの手間かかるな、、、
そこでつかえる方法が、NATサーバー！
NATサーバーを利用すれば、プライベートサブネット内のサーバーからインターネットに接続できる。

## NAT(Network Address Translation)サーバーを作る
NATサーバーの役割は、IPアドレスを変換すること。
IPアドレスを変換することで、「プライベートサブネット→インターネット」の向きのみ許可する通信を実現できる。

もう少し具体的にいうと、2つの仕事をしている。

① プライベートサブネット内ホストのIPアドレスを自分(NATサーバー)のIPアドレスに変換して、プライベートサブネットからの要求を接続先へに伝える
② 接続先からの応答を受け取り、宛先をプライベートサブネット内ホストのIPアドレスに変換して、インターネットからの応答をプライベートサブネット内のホストに伝える

図解もしてみた。
<img width="886" alt="スクリーンショット 2020-05-05 1.47.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/413104/cd66e752-50f1-6f57-dc9e-7b5dea9d3831.png">

プライベートサブネット側からの送受信はできるが、インターネット側からの送受信はできない。
プライベートサブネットにパブリックIPアドレスを割り当ててインターネット接続する(つまりインターネット側からも送受信できる状態)よりも、セキュリティを高めることができる。

# 参考文献と註
- [Amazon Web Services 基礎からのネットワーク&サーバー構築] (https://www.amazon.co.jp/Amazon-Web-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89/dp/4822237443)
- https://www.kagoya.jp/howto/rentalserver/serveros/
- https://qiita.com/aaaaaayyymmm/items/ecf9c198b1520c0860e0

[^1]: https://aws.amazon.com/jp/about-aws/global-infrastructure/