AWSでのサーバー構築に関する基礎知識

AWSでのサーバー構築についてもっと良く知りたいと思ったのですが、調べていくと理解しておかなければいけない基礎知識が結構たくさんあったのでまとめてみました。これからAWSを触り始める初心者の方向けの内容となっています。

# IPアドレス（Internet Protocol Address）
`IPアドレス`とは、インターネット上に接続された機器が持つ番号のことです。データをやりとりする際、対象となる相手に確実に届けるためにこのIPアドレスが利用されます。

## ネットワーク部とホスト部
IPアドレスは`ネットワーク部`と`ホスト部`に分かれています。そして、ネットワーク部とホスト部は、以下の方法で区別されています。

- クラスによる分類（クラスフルアドレス）
- サブネットマスクによる分類（クラスレスアドレス）

### クラスによる分類（クラスフルアドレス）
クラスフルアドレスでは、クラスA~Cにおいて以下のようにネットワーク部とホスト部が区別されています。

```
N => ネットワーク部
H => ホスト部

クラスA : NNN.HHH.HHH.HHH
クラスB : NNN.NNN.HHH.HHH
クラスC : NNN.NNN.NNN.HHH
```

### サブネットマスクによる分類（クラスレスアドレス）
クラスレスアドレスの場合、IPアドレスのネットワーク部とホスト部の境界が定まっていません。なので、サブネットマスクを使用し、32ビットあるIPアドレスのうち、ネットワーク部とホスト部がどこからどこまでの範囲なのかを示す必要があります。

このサブネットマスクによって柔軟に範囲を変えることで、アドレス空間の無駄使いを防ぐことができるのです。また、サブネットマスクはIPアドレスと同様に32ビットの整数値で表現され、ネットワーク部を表す部分のビットが1になり、ホスト部を表す部分のビットが0になります。

先頭25ビットをネットワーク部に、残り7ビットをホスト部に割り当てたい場合は以下の通り。

```
11111111.11111111.11111111.10000000
```

# CIDR（Classless Inter-Domain Routing）
`CIDR : サイダー`は、クラスを使わないIPアドレスの割り当てを行う技術です。`ネットワーク部とホスト部`での説明の通り、クラスはIPアドレスのネットワーク部とホスト部を決められたブロック単位で区切ります。

この考え方はとてもシンプルなのですが、それだとアドレス空間の利用に無駄が生じてしまうのです。これに対してクラスを使わないCIDRでは、任意のブロック単位で区切ることができるため、IPアドレス空間を効率的に利用することができます。

# VPC
`VPC（Virtual Private Cloud）`は、AWSにおけるユーザー専用のプライベートな領域のことです。このVPCを構築する事でサブネット単位、ホスト単位での柔軟なアクセス制御ができます。

## VPCが必要な理由
AWSではネットワーク構成を考えなくてもサーバを立ち上げることができるわけですが、それだとセキュリティー的にかなり弱いです。このアクセス制御を行うために、VPCが必要になります。

## VPCをサブネットに分割
VPCを作成することでプライベートなネットワーク空間が出来上がるのですが、この空間は他のユーザーからは見ることができません。そのため、VPC領域が持っているCIDR（サイダー）ブロックを、さらに`パブリックサブネット`と`プライベートサブネット`に分けます。これによって、ユーザーがアクセスできる空間とそうでない空間を分けることができるのです。

## パブリックサブネット
インターネットからアクセスすることを目的として用意するサブネットです。この領域にWebサーバーを設置してインターネットから外部の人がアクセスできるようにします。

## プライベートサブネット
インターネットから隔離したサブネットです。この領域に、データベースサーバーを設置します。

# インターネットゲートウェイ
Amazon VPCにおいて、サブネットをインターネットに接続するには`インターネットゲートウェイ`を用います。これにより、自分のネットワーク領域にインターネットワーク回線を引き込むことができるのです。

# ルーティング情報
ネットワークに情報を流すためには、` ルートテーブル（Routing Table）`と呼ばれるルーティング情報を設定する必要があります。この設定により宛先のIPアドレスを区別し、`送信されたデータ（パケット）`をどのネットワークに転送するかを決めることができます。

## パケット
インターネットで使われる`TCP/IPプロトコル`において、細切れにされたデータを`パケット`と呼びます。パケットは、`ヘッダー情報`と`データの実体`を含んでいて、ヘッダー情報の中に宛先IPアドレスが存在しています。

## ルートテーブルの設定
ルートテーブルの設定は、

宛先アドレス  データを転送するネットワークのルーター

という形で行います。`宛先アドレス`は、一般的にディスティネーションと呼ばれ、`データを転送するネットワーク`はターゲットと呼ばれています。

# デフォルトゲートウェイ
デフォルトゲートウェイとは、通信の出入り口になるもので、通信先が設定されていない時のデフォルトの転送先のことです。インターネットに接続するためには、デフォルトゲートウェイをインターネットゲートウェイとして設定する必要があります。

# 仮想サーバ構築
AWSにおける仮想サーバは、`EC2`を用いて作成します。この仮想サーバのことを、AWSではインスタンスと呼びます。このインスタンスには、パブリックサブネットで利用可能な`プライベートIPアドレス`を割り当てます。

ただし、プライベートIPアドレスはインターネットとの接続には利用できないので、`パブリックIPアドレス`も同時に設定する必要があります。パブリックIPアドレスには、AWSに割り当てられているIPアドレスブロックの適当な値が使用されます。

最終的に、作成したインスタンスは、VPC内で使用するためのプライベートIPアドレスと、インターネットで使用するためのパブリックIPアドレスを持つことになります。インスタンスにインターネット側からアクセスするには、パブリックIPアドレスを使用します。

## AMI（Amazon Machine Image）
`AMI`とは、インスタンスを起動する際に用いるイメージファイルのことです。このイメージは、OSがインストールされて初期アカウントの設定までが済んだもので、選んだ内容がそのままコピーされ、インスタンスが作成されます。

# EGP（Exterior Gateway Protocol）
`ISP（インターネットサービスプロバイダー）`やAWSなどの、ある程度の規模があるネットワークでは、そのネットワークを管理するために`AS（Autonomous System）番号`を持っています。EGPでは、このAS番号をやりとりして、どのネットワーク先にどのネットワークが接続されているのかをやりとりします。

## IGP（Interior Gateway Protocol）
EGPの内部のルーター同士で、ルートテーブルの情報のやり取りをします。つまり、AWSやプロバイダーでの詳細なやり取りに使われます。

## EGPとIGPの区別
ざっくりいうと、大まかな情報に関してはEGPで情報交換し、細かい情報に関してはIGPで情報交換するということです。この仕組みにより、インターネット上のルーティング情報は末端まで更新されているため、新たにネットワークが追加されてもIPアドレスさえわかればパケットを送信できるわけです。

# ポート
TCP/IPで通信するサーバーなどの機器には、他のコンピュータとデータを送受信するためのデータの出入り口が用意されていて、これを`ポート`と呼びます。ポートは、`0~65535`まであります。このポートのおかげで、1つのIPアドレスに対して複数のアプリケーションが同時に通信できるようになります。

ポートには、相手にデータが届いたことを保証する`TCP（Transmission Control Protocol）`と、高速だけど確認せずにデータを送信する`UDP（User Datagram Protocol）`の2種類があります。

## ウェルノウンポート（Well Known Port）
SSHで使用されている`ポート22番`といったように、代表的なアプリケーションが良く使用するポート番号のことを`ウェルノウンポート`と言います。ウェルノウンポートは`0~1023`までの番号を取り、以下のように値が決まっています。

- 22 : SSH（システム間の安全な通信を行うためのプロトコル）
- 25 : SMTP（メールの送受信に使用されるプロトコル）
- 80 : HTTP（暗号化されていないWeb通信）
- 443 : HTTPS（暗号化されたWeb通信）

クライアントが接続先のポート番号を指定しなかった場合、このウェルのウンポートが優先して使用されるので、明示的に指定する必要がないというわけです。

## エフェメラルポート（ephemaral ports）
エフェメラルポートは、サーバーと接続している間だけ使用され、切断すると解放されるポートです。TCP/IPプロトコルのポート番号は、サーバー側だけではなくクライアント側にも存在し、クライアント側のポート番号は未使用のランダムなものが適用されます。このように、一時的に使用されるランダムなポート番号のことをエフェメラルポートと呼ぶわけです。

エフェメラルポートは、サーバーからクライアントに向けてデータを送信する際に必要です。これにより、クライアント上でたくさんのアプリケーションが起動していても、目的のアプリケーションに正しくデータを送信することができるわけです。

# ファイアウォール
ファイアウォールとは、通していいデータだけを通し、それ以外は遮断するという機能の総称です。セキュリティーを高めるには、このファイアウォールを設けることが重要です。特定のデータだけを通す機能のうち、もっとも単純な構造のものが`パケットフィルタリング`です。

## パケットフィルタリング（Packet Filtering）
パケットフィルタリングとは、流れるパケットを分析し、通過の可否を決める仕組みです。パケットには、`IPアドレス`と`ポート番号`という情報が含まれているのですが、パケットフィルタリングではそれらのパケットに付随する情報を確認し、通過の可否を決めます。

そのため、IPアドレスを判定して接続元を制限したり、特定のポートを制限してアプリケーションへのアクセスを不可能にしたり、といったことができます。

## セキュリティーグループ
AWSでは、インスタンスに対してセキュリティーグループを構成することができます。このセキュリティーグループが、インスタンスにおけるパケットフィルタリングを可能にします。

# Apache
オープンソースで提供され、世界で最も多く利用されているWebサーバーソフトです。Apacheの大きな特徴は以下のようになります。

- 無償で誰でも利用可能
- 信頼性が高い
- データベースと連携がしやすい
- 昨日の拡張が可能
- Linux、Windowsなど複数のサーバOS上で拡張可能
- CMS(Contents Management System)を利用する際に簡単な設定で済む
- 技術情報が膨大にあるためトラブルシューティングしやすい
- レンタルサーバープランにあらかじめ組み込まれている場合が多い
- 公開ページを更に高速化表示する対策が行われている
- セキュリティ対策が随時更新されている

## Webサーバー
Webサーバーとは、クライアント（Webブラウザ）のリクエストを解釈し、そのリクエストに応じたデータをクライアントへ返す機能を持ったサーバーのことです。また、このやりとりはHTTPプロトコル上で行われます。ブラウザーは、ユーザーから入力されたURLを元にWebサーバーへ接続し、要求された情報を取得して画面に表示しています。

## URL
URLとは、インターネット上の住所のことです。URLは、プロトコル・ホスト名・ドメイン名・ファイル名で構成されています。

## ドメイン
ドメインとはURLを構成するもので、英数字で表現されます。また、ドメインはピリオドで区切られていて、その区切られた部分を`ラベル`と言います。一番右のラベルをトップレベルドメインといい、そこから左へと、第2レベルドメイン、第3レベルドメイン、第4レベルドメインとなっています。

```
www.hoge.co.jp

=> 第4.第3.第2.トップ
```

トップレベルドメインには以下の種類があります。

- jp
- com
- net

### ドメインの管理
ドメインはIPアドレスと同様にICANNが管理していて、トップレベルのドメインごとにそれぞれの事業者が管理しています。

ドメインの管理組織（レジストリ）

- com, net => Verisign
- jp => JPRS
- org => Public Interest Registry

# DNS（Domain Name System）
DNSとは、ドメインとIPアドレスを対応させるシステムのことです。TCP/IPの世界では、ドメインでアクセスするときも最終的にはIPアドレスに変換して接続を行うので、その時にDNSを使用します。また、ドメイン名に対応するIPアドレスを見つけることを`名前解決`と呼びます。実際にドメインをIPアドレスに変換するのは、DNSサーバーで行います。DNSのシステムは世界中に散らばったDNSサーバー群で構成され、それぞれのDNSサーバーは自分の担当する範囲でのみ、ドメインとIPアドレスの変換を行ないます。もし、担当する範囲外の名前解決が必要になった場合は、他のDNSサーバーへと処理を転送します。

## 名前解決
名前解決は、以下のような順序で行われます。

1. ルートのDNSサーバー（トップレベルドメインのDNSサーバーに処理を振る）
2. トップレベルドメインのDNSサーバー（第2レベルのDNSサーバーに処理を振る）
3. 第2レベルのDNSサーバー（第3レベルのDNSサーバーに処理を振る）
4. 第3レベルのDNSサーバー（第4レベルのDNSサーバーに処理を振る）
5. 第4レベルのDNSサーバー（対応するIPアドレスを返す）

DNSは上記のように階層的に処理することによって、ドメインをIPアドレスに変換しています。

# HTTP（Hyper Text Transfer Protocol）
HTTPは、HTMLをはじめとするWebサービスの情報をやり取りするための規約で、クライアント・サーバー間のリクエスト、レスポンスをやり取りする方式を定めています。

## HTTPリクエストの構成
HTTPリクエストは以下の要素で構成されています。

- リクエストライン
- ヘッダー
- ボディ

### リクエストライン
リクエストラインは要求コマンドのことで、要求方法と要求するURLが含まれています。

### ヘッダー
ヘッダーはブラウザから送信される追加情報で、以下のような構成になっています。

- 要求したいホスト名
- ブラウザの種類
- 対応言語
- Cookieの情報
- 直前に見ていたページのURL

### ボディー
ボディーにはHTTPリクエストの補足情報が書かれています。HTMLやAjaxなどで、データをサーバーに伝えます。

## HTTPレスポンスの構成
HTTPレスポンスは以下の要素で構成されています。

- ステータスライン
- ヘッダー
- ボディ

### ステータスライン
ステータスラインは要求の成否を返すものです。何も異常がなければ、`200 OK`というステータスコードが返されます。

- 100番台 => 処理中
- 200番台 => リクエスト成功
- 300番台 => リダイレクト
- 400番台 => クライアントエラー
- 500番台 => サーバーエラー

### ヘッダー
HTTPヘッダはデータの状態を示す情報が入っている部分です。よく利用されるものとして、`Content-Type`があります。これは、ボティー部の情報を示します。

```
Content-Type: text/html;charset=UTF-8
```

Content-Typeは、HTMLなら`text/html`、画像なら`image/jpeg`、PDFなら`application/pdf`となります。また、このようなコンテンツの種類は`MIMEタイプ（Multipurpose Internet Mail Extension Type）`とも呼ばれています。

### ボディー
ボディーは、要求されたURLに対応するコンテンツです。HTMLや画像など、要求されたデータが該当します。

# プライベートサブネット
前の項目でも触れましたが、より詳しくプライベートサブネットについて学んでいきましょう。プライベートサブネットとは、インターネットから接続できないサブネットのことです。

ネットワークを構築する際は当然セキュリティー性を高めることが重要なのですが、インターネットに接続している限りは何かしらの攻撃を受ける可能性があります。そのため、プライベートサブネットを構築し、そこへデータベースサーバーなどを配置することによって、インターネットから隔離してセキュリティー性を高めることができるわけです。

プライベートサブネットに対し、パブリックサブネットはインターネットゲートウェイを経由してインターネットに接続されています。そのため、ここに配置したWebサーバーはインターネットからSSHやWebブラウザで直接アクセスが可能になります。

つまり、アクセスされても問題ないものはパブリックサブネットに配置し、アクセスされると困るものはプライベートサブネットに配置するというわけですね。

- Webサーバー => パブリックサブネット
- データベースサーバ => プライベートサブネット

# データベースサーバー
プライベートサブネットの構築が完了したら、その中にデータベースサーバーを構築することができます。`データベースサーバー`とは、名前の通りデータベースを管理するためのサーバーで、内部では`Oracle`や`MySQL`などのデータベース管理システムが動作しています。

一つのシステムにおいて、プログラムとデータベースを明確に役割分担したい時にデータベースサーバーを構築します。データベースサーバーは、クライアントからのリクエストに応じてデータベースを検索し、適したデータを返します。

AWSでのサーバー構築で設定する項目は以下の通りです。

- ネットワーク
- サブネット
- IPアドレス
- サーバー名
- セキュリティーグループ

また、各種設定が終了したら、データベースサーバーがWebサーバーからアクセスできるかどうかを確認する必要があります。

## ping
`ping`コマンドを実行すると、ネットワーク疎通を確認したいホストに対して`ICMPエコー要求`というパケットを送信します。そのパケットを受け取った側は、送信元に対して`ICMPエコー応答`というパケットを返信します。pingコマンドでは、これらのパケットをやり取りすることによって、ネットワーク疎通を確認します。

## データベースソフトのインストール
pingによりネットワークの疎通が確認できたら、データベースソフトのインストールを行う必要があります。その際、データベースサーバーへはSSHでログインします。しかし、通常、データベースサーバーはインターネットから接続することはできません。

そのため、SSHログインしたとしても本来であれば接続することができないのです。そのため、SSHログインしてからデータベースサーバーへ接続するには以下の経路を辿ります。

1. SSHログイン
2. Webサーバーへアクセス
3. Webサーバーからデータベースサーバーへアクセス

## SSHログインと秘密鍵
Webサーバーを経由してデータベースサーバーへSSHで接続するには、「秘密鍵」というものが必要です。なので、Webサーバーには秘密鍵を置いておく必要があります。

### 秘密鍵と公開鍵
秘密鍵の説明をするには、公開鍵の説明も必要なので一緒に。ネットワークの世界では、データを暗号化したり、元に戻したりするために必要なデータを`鍵`と呼んでいます。そのうち、全員に公開される鍵を`公開鍵`、自分以外知らない鍵を`秘密鍵`と呼ぶわけです。また、このような鍵の管理方法を、`公開鍵暗号方式`と言います。

ネットワーク上でやり取りされるデータは、公開鍵を使って暗号化すると対応する秘密鍵でしか復元できません。逆に、秘密鍵を使って暗号化すると、対応する公開鍵でしか復元できません。この仕組みにより、公開鍵で暗号化されたデータに関しては特定の秘密鍵でしか復元できないため、たとえ公開鍵の情報が漏れたとしてもデータが盗まれる心配がなくなるというわけです。

# NAT（Network Address Translation）
NATとは、プライベートサブネット内のサーバーからインターネットへの接続を可能にする装置で、IPアドレスを変換することができ、2つのネットワークインターフェースを持ちます。

片方のインターフェースにはパブリックIPアドレスを設定してインターネットに接続できるようにし、もう片方のインターフェースにはプライベートIPアドレスを設定してプライベートサブネットに接続できるようにします。

プライベートサブネット内にあるデータベースサーバーがインターネットにパケットを送信しようとした時、NATはデータベースサーバーに割り当てられているプライベートIPアドレスを、自身が持つパブリックIPアドレスに置換します。こうすることによって、送信元のプライベートIPアドレスがパブリックIPアドレスに変わるため、インターネットに接続できるようになるわけです。

次に、NATから送信された要求パケットに対する応答パケットは、当然NATに返ってきます。そうすると、NATは返ってきた応答パケットをプライベートIPアドレスに変換し、送信元にパケットを転送します。これにより、プライベートサブネット内にあるデータベースサーバーからインターネットに接続し、データベースソフトをインストールすることが可能になります。

## NATの種類
NATには2種類あります。

1. IPアドレスだけを置換するもの
2. IPアドレスとポート番号の両方を置換するもの

## NATインスタンスとNATゲートウェイ
AWSでNATを構成する場合、`NATインスタンス`と`NATゲートウェイ`という2つの方法があります。

### NATインスタンス
NATソフトウェアがあらかじめインストールされたAMIから起動したEC2インスタンスを使う方法です。NATはLinux OSなので、EC2インスタンスに別のソフトウェアをインストールすることも可能です。

### NATゲートウェイ
NATゲートウェイは、NAT専用に構成された仮想的なコンポーネントで、配置するサブネットを選ぶだけで構成できます。


# TCP/IPモデル
TCP/IPモデルとは通信モデルのことで、役割ごとに4つの階層に分けられています。各層には、その役割を果たすプロトコルが設けられています。

|層|役割|プロトコル|
|---|---|---|
|アプリケーション層|ソフトウェア同士が通信する|HTTP, SSH, DNS, SMTP|
|トランスポート層|信頼性を高めたデータの転送を制御する|TCP, UDP|
|インターネット層|IPアドレスの割り当て、ルーティングを行う|IP, ICMP, ARP|
|インターフェース層|ネットワーク上で接続されている機器同士で通信する|Ethernet, PPP|

このように階層化することで、それぞれの階層が独立し、依存関係を最小限に止めることができます。そのため、インターフェース層をEthernetにしようが、PPPにしようが、上の階層はそれを意識することなく利用することができます。つまり、変更に強いネットワークを構築できるというわけです。

TCP/IPで接続する場合、アプリケーションのデータを届けるには`UDP`と`TCP`の2通りがあります。

## UDPでのデータ通信
UDPは状態を持たないプロトコルで、`ステートレスプロトコル`とも呼ばれています。UDPの構造は以下のようになります。

- 送信元ポート番号
- 宛先ポート番号
- データ長フィールド
- チェックサム

UDPは送りっぱなしのプロトコルで、相手がパケットを受け取れなかったとしても再送することはありません。相手がパケットを受け取ったかどうか判断する仕組みがないので、受け取られなかったデータはそのまま破棄されます。また、パケットの到着順序も保証されないため、後から送信したものが先に届くなど、送信したパケットの順序が逆転することもあり得ます。

ただし、やり取りが単純なため、パケットを高速に送ることができます。そのため、データが1パケットに収まる場合や、送信したパケットが前後してもいい場合では、UDPが適しています。

### 送信元ポート番号
UDPパケットの送信元のアプリケーションを識別するための番号です。宛先ポート番号を元にパケットを送信した後、応答をもらうために送信元ポートを宛先に届けます。

### 宛先ポート番号
宛先ポート番号とは、宛先となるアプリケーションが待ち受けしているポート番号です。`0~65535`までのポート番号が利用でき、用途別に利用範囲が決められています。

|範囲|名前|意味|
|---|---|---|
|0~1023|Well Known Port|特権ユーザーや管理者モードで動作するサービスが利用するポート|
|1024~49151|Registerd Port|登録されたサービスが利用するポート|
|49152~|Dynamic Port/Private Port|動的なアプリケーションで利用するポート|

### データ長フィールド
データ長フィールドとは、UDPパケットの長さを表すフィールドです。UDPヘッダとUDPで送信するデータ部分の長さを加えたバイト数がセットされています。

### チェックサム
チェックサムとは、データの総和を計算しデータに誤りがないか調べる仕組みのことです。チェックサム計算の対象となるデータは、`UDP擬似ヘッダ（12bytes）`、`UDPヘッダ（8bytes）`、`UDPペイロード`の3つの部分から構成されています。


## TCPでのデータ通信
TCPは、転送コントロールをするためのプロトコルで、高い信頼性を必要とする通信に適してます。TCPはUDPとは異なり、双方向の通信が可能となっています。TCPは、仮想的な通信経路である`コネクション`を確立し、通信相手との疎通を確認します。その際、`SYN`と`ACK`というフラグを使用します。

- SYN => 通信を開始したことを示す
- ACK => 受領の合図を示す

TCPは通信を始める際に、クライアントとサーバー間で`SYN`、`SYN/ACK`、`ACK`、という3つのパケットをやり取りします。そして、そのやりとりのことを3ウェイハンドシェークと言います。


# まとめ
いろいろ調べた事をざっとまとめました。これからどんどんインフラ側の理解にも力を入れていこうと思います。基礎から学ぶとかなり面白いですね。ネットワーク構築からアプリ開発まで、全て網羅できるプログラマー目指してさらに勉強していきます。

知識がたまり次第更新をかけていくので、不明な点や誤字、脱字、間違った理解などがあればご指摘いただけると嬉しいです。宜しくお願いいたします。