【初心者向け】AWSの基礎知識

AWSでRailsアプリをデプロイしたのですが、その時に必要だと思った知識を整理しました。
初心者向けの基礎的な内容を浅く紹介しています。
# IPアドレス
`IPアドレス`とは通信先を特定するための番号です。アドレスという名前通り住所のようなものです。
インターネットに接続する時に使う`パブリックIPアドレス`とインターネットで使わない`プライベート IPアドレス`があります。
##ネットワーク部とホスト部
IPアドレスを表記する時前半部分を`ネットワーク部`後半部分を`ホスト部`と言います。
`ネットワーク部`は同じネットワークに属する限りは、同じ値です。
`ホスト部`は割り当てたいサーバーやクライアント、ネットワーク機器に対する連番となります。
またネットワーク部とホスト部は以下の方法で区別されます。
###クラスフルアドレス
クラスフルアドレスでは、クラスA~Cにおいて下記のようにネットワーク部とホスト部が区別されています。

```
数字がネットワーク部、Xがホスト部

クラスA : 123.XXX.XX.XXX
クラスB : 178.168.XXX.XX
クラスC : 203.56.162.XXX
```

###クラスレスアドレス（CIDR)
クラスレスアドレスの場合、IPアドレスのネットワーク部とホスト部の境界が定まっていません。なので、`サブネットマスク`を使用し、32ビットあるIPアドレスのうち、ネットワーク部とホスト部がどこからどこまでの範囲なのかを示します。
サブネットマスクではビット「1」でネットワーク部を表し、ビット「0」でホスト部を表します。

```
11111111.11111111.11111111.00000000
```

## サブネットマスク
`サブネットマスク`は、ネットワークの範囲を定義するために使用します。
IPアドレスとサブネットマスクを組み合わせることで、ネットワークの範囲（サブネット）を指定することができます。
##CIDR
 `CIDR : サイダー`は、クラスを使わないIPアドレスの割り当てを行う技術です。ネットワーク部とホスト部での説明の通り、クラスはIPアドレスのネットワーク部とホスト部を決められたブロック単位で区切ります。

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

##IPアドレスとサブネットマスクをまとめて表記する
サブネットマスクの設定が間違っていると、通信相手によってつながったり、つながらなかったりするという事態が生じるなど、さまざまなトラブルの元になります。
ここではIPアドレスとサブネットマスクの表記方法についてまとめます。

サブネットマスクとは、具体的には次のような形式で表示され

```
IPアドレス　　: 192.168.1.40
サブネットマスク　: 255.255.255.0 
```
###IPアドレスとサブネットマスクを組み合わせて表現する方法1
IPアドレスとサブネットマスクは常にペアで扱う必要があるので、簡単に表現できるように、特別な表記方法が用意されています。
方法はシンプルで次のように、IPアドレスとサブネットマスクの値を「/」記号で区切って並べるだけです。


```
IPアドレス　　: 192.168.1.40
サブネットマスク　: 255.255.255.0 

まとめた表記　: 192.168.1.40/255.255.255.0
```
###IPアドレスとサブネットマスクを組み合わせて表現する方法2
上記の方法は、IPアドレスとサブネットマスクがどのような値の組み合わせであっても表現できます。
ですが、現実のネットワークで利用されているサブネットマスクの値を考慮すると、さらに簡便な表現方法があります。

　例えばサブネットマスクの255.255.255.0という値は、32bitの2進数で考えると最上位から24bitが全部1、それ以外が0という値です。

```
10進数的表現 : 255.255.255.0
2進数的表現 　　:　11111111 11111111 11111111 00000000 
```
そこでこの255.255.255.0という値を/24と表記することにする。そうすると、先ほどのIPアドレスとサブネットマスクの組は次のように表現できる。

```
IPアドレス     :  192.168.1.40
サブネットマスク :  255.255.255.0

まとめた表記　   : 192.168.1.40/24
```
最初の方法と比べると、さらに短くコンパクトに表現できます。これが上記で述べた`CIDR：サイダー`です。


#VPC
AWSでは`VPC`という領域を作るとそこに自由なネットワークを作れます。
VPCを作る時には、どのようなIPアドレス範囲を使うか指定します。
##サブネット
VPCを作ったら、それをさらにいくつかに分割して利用します。
分割したネットワークのことを`サブネット`と言います。
###パブリックサブネット
インターネットからアクセスすることを目的としたサブネットです。
ここにWebサーバーを設置してインターネットからアクセスできるようにします。
###プライベートサブネット
インターネットから直接接続できないようにしたサブネットです。
ここにはデータベースなどインターネットから隔離しておきたいものを設置します。
##インターネットゲートウェイ
VPCであるサブネットをインターネットに接続するには、`インターネットゲートウェイ`を使います。
これは「自分のネットワークにインターネット回線を引き込む」というイメージの作業になります。
##ルートテーブル
ネットワークにデータを流すには`ルーティング情報`と呼ばれる作業が必要です。
この設定を`ルートテーブル`と呼びます。
この設定により宛先のIPアドレスを区別し、送信されたデータをどのネットワークに転送するかを決めることができます。
宛先アドレスを`ディスティネーション`と呼びデータを転送するネットワークを`ターゲット`と呼びます。
#仮想サーバー
AWSでは仮想サーバーは`EC2`を使って作成します。
作成した仮想サーバーのことを`インスタンス`と言います。
インスタンスにはパブリックサブネットでし使用可能なプライベートIPアドレスを割り当てます。
しかしプライベートIPアドレスではインターネットに接続できません。
なのでインスタンスを起動する時にはパブリックIPアドレスを設定する必要があります。
##EGPとIGP
インターネットではルーター同士が通信してルートテーブルの情報のやりとりをして、必要に応じて自動で更新するようにしています。
これはルーティングプロトコルという仕組みで実現されており、大きく分けて`EGP`と`IGP`の２つから成り立っています。
###EGP
AWSなどのある程度大きなネットワークはそのネットワークを管理する`AS番号`という番号を持っています。
EGPではこのAS番号をやりとりして、`どのネットワークの先に、どのネットワークが接続されているか`を大まかにやりとりします。
###IGP
上記の　EGP内部のルーターどうして情報のやりとりをします。
つまり、`詳細な情報のやりとり`を行います。
##ポート
TCP/IPで通信するサーバーなどの機器には、他のコンピューターと、データを送受信するためのデータの出入り口が用意されています。
これを`ポート(Port)`と言います。
このポートのおかげで、１つのIPアドレスに対して、複数のアプリケーションが同時に通信できます。
住所でいうとネットワーク部が市町村、ホスト部がマンション名、ポートが部屋番号です。
##ファイアーウォール
`ファイアーウォール`は`通してよいデータだけを通して、それ以外を遮断する機能`のことです。
その最も簡単な構造のものが、`パケットフィルタリング`です。
###パケットフィルタリング
パケットフィルタリングは、流れる`パケット（データ）`をみて通過の可否を決めす仕組みです。
パケットフィルタリングは、IPアドレスとポート番号などパケットに付属する各種情報をみて、通過の可否を決めます。
###セキュリティーグループ
実世界でのパケットフィルタリングを更生するのは、ルーターやサーバーもしくは専用のファイアーウォール機器です。
AWSでは、インスタンスに対して更生する`セキュリティーグループ`がこの機能を担当します。
###インバウンドとアウトバウンド
セキュリティーグループの設定には`インバウンド`と`アウトバウンド`の2つがあります。
前者が、 `外からインスタンスに接続する向き`後者が`このインスタンスから外側に接続する向き`です。
#Webサーバー
`Webサーバー`とはクライアント（Webブラウザ）のリクエストを解釈し、そのリクエストに応じたデータをクライアントへ返す機能を持ったサーバーのことです。また、このやりとりはHTTPプロトコル上で行われます。ブラウザーは、ユーザーから入力されたURLを元にWebサーバーへ接続し、要求された情報を取得して画面に表示します。
##Nginx
`Nginx（エンジンエックス）`とはオープンソースのWebサーバーです。
他の有名なWebサーバーである`Apache`と比べ処理が軽く大量のリクエストを処理するのに向いている
CPUリソースを多く消費する動的コンテンツの処理スピードはApacheの方が速いと言われている
#ドメイン
WebブラウザにパブリックIPアドレスを入力することで、Webサイトにアクセスできます。
しかし一般にWebサイトにアクセルする時には直接パブリックIPアドレスを入力することはほとんどありません。
なぜなら単なる数字であるIPアドレスは覚えずらいからです。
そのため、一般的には`www.example.co.jp`などの`ドメイン名`を使って、アクセスします。
##DNS
TCP/IPでは、相手先を確認するのは、あくまでもIPアドレスです。
ドメイン名でアクセスする時も最終的にIPアドレスに変換して接続します。
その時に使われる仕組みが`DNS`です。DNSを用いて、あるドメイン名からIPアドレスを引き出すことを`名前解決`と言います。
IPアドレスとドメイン名を変換するのは`DNSサーバー`です。
DNSのシステムは世界中に散らばったDNSサーバー群で構成され、それぞれのDNSサーバーは自分の担当する範囲でのみ、ドメインとIPアドレスの変換を行ないます。もし、担当する範囲外の名前解決が必要になった場合は、他のDNSサーバーへと処理を転送します。
#HTTP
Web通信では`HTTP`という通信プロトコルが使われています。
HTMLをはじめとするWebサービスに必要とされる情報を伝達するためのルールです。
HTTPはクライアント・サーバ型のアーキテクチャで2者間で`リクエスト`と`レスポンス`をやりとりする方式を定めています。
##リクエストの構成
リクエストは次の3つで構成されています。
###リクエストライン
リクエストラインは要求コマンドのことです`要求方法`と`要求するURL`が含まれる冒頭の1行です
###ヘッダー
`ヘッダー`はブラウザから送信する追加情報です。
・要求したいホスト名
・ブラウザの種類
・対応言語
・Cookiの情報
・直前に見ていたページのURL
上記のようなものが含まれており多くの場合複数行に渡ります。
###ボディ
`ボディ`はHTMLフォーム(form要素)やAjaxなどで、POSTメソッドを利用してデータをサーバーに送信する時に利用されます。
ヘッダーとボディは空行で区切られます。
##レスポンスの構成
レスポンスは次の3つで構成されます。
###ステータスライン
`ステータスラインは`その要求の成否ほを返す冒頭の1行です。
正常に修理すれば`200 OK`というステータスが返されます。他には大まかに下記のようなステータスが返されます。

| コード | 意味 |
|:-:|:-:|
| 100番台  | 処理中  |
| 200番台  |  リクエスト成功 |
| 300番台  |  リダイレクト |
| 400番台  |  クライアントエラー |
| 500番台  |  サーバーエラー |

###ヘッダー
`ヘッダー`は追加情報を返すために利用されます。よく利用されるものとしてボディの種類を示す`Content-Typeヘッダー`やボディの長さを示す`Content-Lengthヘッダー`などがあります。
多くの場合複数行に渡ります。
###ボディ
`ボディ`は要求されたURLに対するコンテンツです。HTMLのテキストや画像など、要求されたコンテンツデータそのものです。
ヘッダーとボディは空行で区切られます。

##HTTPメソッド
`HTTOメソッド`とはコンテンツに対する操作コマンドのことです。多くの場合は`GET`や`POSTを使います。

| メソッド | 意味 |
|:-:|:-:|
|  GET |  リソースを取得する |
|  POST | リソースにデータを送信したり、子リソースを作成したりする  |
|  HEAD | リソースのヘッダーの情報だけを得る(更新日時などステータスだけ取得したい時など用いる)  |
|  PUT | リソースを更新したり、作成したりする |
|  DELETE | リソースを削除する  |
|  OPTIONS | サーバーがサポートしているメソッドを取得する  |
|  TRACE | 自分宛にリクエストメッセージを返してループバックする  |
|  CONNECT | プロキシ動作のトンネル接続を変更する  |

#プライベートサブネット
上記で`プライベートサブネット`について簡単に書きましたが、ここではもう少し詳しく書こうと思います。
##プライベートサブネットの利点
上記で書いたWebサーバーではパブリックアドレスを割り当て、パブリックサブネットに配置しました。
パブリックサブネットはインターネットゲートウェイを経由してインターネットに接続されています。
つまりパブリックサブネットに配置したWebサーバーは、インターネットから`SSH`や`Webブラウザ`でアクセスできます。
しかしシステムを構築するサーバー群の中には、インターネットから直接アクセスして欲しく無いものもあります。
データベースなどはその典型的な例です。
隠したいサーバーは`インターネットから接続できないサブネット`に配置します。このサブネットが、プライベートサブネットです。
プライベートサブネットを構築することで、サーバーを隠すことができ、セキュリティを高められます。
#データベース
Webアプリケーションに構築されるデータは`データベース(DB)`に格納されます。
そしてデータベースと普段呼んでいいるものは下記のように分けられます。

| 名前| 説明 |
|:-:|:-:|
|データベース（DB）   | データを入れる箱ですデータが入ります  |
|  リレーショナルデータベース（RDB) | データベースの種類、データを表形式で扱うデータベース  |
|  データベースマネージメントシステム（DBMS） |  データベースを管理するシステム |
|  リレーショナルデータベースマネージメントシステム (RDBMS) |  リレーショナルデータベースを扱うための道具 |

これらを一般的にはデータベースと呼んでいます。
##データベースサーバー
データベース管理システム(DBMS)を搭載したサーバーなどを`データベースサーバー`と呼びます。
プライベートサブネットを構築したら、その中にデータベースサーバー構築します。
##RDS
`RDS`はAWSのフルマネージド型データベースサービス。
サーバーやOSの管理なしに、リレーショナルデータベース（RDB）を利用できます。主要なRDBMS製品と互換性があるため、既存のデータベースの移行も可能です。EC2よりも、さらに簡単にデータベースを運用できます。
#SSH
`SSH`とはリモートコンピュータと通信するためのプロトコルです。
認証部分を含めネットワーク上の通信がすべて暗号化されるため、安全に通信することができます。
SSHでは`公開鍵暗号`を利用し、共通鍵を暗号化して鍵交換を行っています。かつ、通信自体は高速な共通鍵暗号を用いているため、速度低下を抑えています。
## 秘密鍵と公開鍵
ネットワークの世界では、データを暗号化したり、元に戻したりするために必要なデータを`鍵`と呼んでいます。そのうち、全員に公開される鍵を`公開鍵`、自分以外知らない鍵を`秘密鍵`と言います。
このような管理の仕方を`公開鍵暗号方式`と言います。
ネットワーク上でやり取りされるデータは、公開鍵を使って暗号化すると対応する秘密鍵でしか復元できません。逆に、秘密鍵を使って暗号化すると、対応する公開鍵でしか復元できません。
#アプリケーションサーバー
`アプリケーションサーバー`はWebサーバ-から受け取ったリクエストを受け取り、Javaやphp、Rubyなどのサーバーサイド・プログラムを実行し、そのデータを加工したり、データベースのデータを検索・加工した後、Webサーバーに応答を返すます。
##Unicorn
 `Unicorn`は、Railsなどでつくられたアプリケーションを動かすアプリケーションサーバです。
Unicorn Workerというものを使ってリクエストに対応しており、サーバのダウンタイムなしでデプロイできます。
またUnicornは　`Rack Webサーバ`に分類されます。
###Rack
`Rack`とはRubyの様々なフレームワークとRubyを動かすための様々なWebサーバーの間を取り持つライブラリです。
そしてRubyアプリケーションとWebサーバーをつなぐための中間サーバーを`Rack Webサーバ`と言います。
Rack Webサーバーを挟むことで、RubyアプリケーションなどをWebサーバー上で動作させることができます。
#NAT
プライベートサブネットに配置したサーバーは、インターネットから接続できないため安全です。しかしインターネットと一切通信できないためサーバーのアップデートやソフトウェアのインストールの時不便です。この問題を解決するのが`NAT`です。
NATは`プライベートサブネット⇨インターネット`の向きの通信だけを許可します。
##NATの仕組み
NATはIPアドレスを変換する装置で、2つのネットワークインターフェースを持ちます。
片方のインターフェースには、一般に`パブリックIPアドレス`を設定し、インターネットに接続可能な構成にしておきます。もうか途方のインターフェースには`プライベートIP`を設定し、プライベートサブネットに接続します。

プライベートサブネットに接続するホスト(サーバーやクライアント)が、インターネットにパケットを送信しようとした時、NATはパケットの送信元IPアドレスを自身のパブリックIPアドレスに置換します。こうすることで、送信元がプライベートIPアドレスではなくNATが持つパブリックIPアドレスに変わるため、インターネットに出ていくことができます。

パケットの送信元IPアドレスが置換されているので、接続先からはNATが接続してきているように見えます。そのため応答パケットは、このNATに戻ってきます。NAT戻ってきた応答パケットの宛先を、元のホストのIPアドレスに置換してプライベートサブネットに転送します。
このようにNATがIPアドレスを置換することによって、プライベートサブネットに存在するホストは、インターネットと通信するようになります。

NATを用いるとプライベートサブネットからインターネットサブネットに接続することができますが、逆にインターネットからサブネットの方向に接続できません。
そのため、サブネットにパブリックIPアドレスを割り当ててインターネットに通信を許すよりセキュリティーが高められます。

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

・IPアドレスだけを置換するもの(NAT)
・IPアドレスとポート番号の両方を置換するもの(NAPT)

どちらも一般的にNATと呼ばれます。
##NATインスタンスとNATゲートウエイ
AWSでNATを構成する場合、次の2つの方法があります。
###NATインスタンス
NATソフトウェアがあらかじめインストールされたAMIから起動したEC2インスタンスを使う方法です。
###NATゲートウェイ
NATゲートウェイは、NAT専用に構成された仮想的なコンポーネントです。配置すサブネットを選ぶだけで構成できます。

#AWSのサービス
今まで、AWSのを使うのに必要な基本的な知識をまとめてみましたが、ここではそのほかに調べたAWSのサービスをいくつか書こうと思います。
## S3
`S3`とはクラウド型の`オブジェクトストレージサービス`です。
###オブジェクトストレージ
`オブジェクトストレージ`とは、オブジェクト（ファイルなど）単位で出し入れが可能なストレージです。各地の物理的なデータセンターに分散して保存されていることで障害に強かったり、オブジェクト単位でのバージョンを残すことが出来ます。
###ストレージ機能
S3の一般的な使い方は、ファイルをS3に保存するストレージ機能を使うことです。
ファイルのバックアップや、ファイル処理の加工前、もしくは加工後のファイルを保存する、画像ファイルやCSSなどWebで使う静的なファイルをS3に置いて配信することができます。

S3は事前に保存容量を決める必要は無く、入れた分だけ課金されますので、ストレージの空きを気にする必要がありません。
##Elastic Beanstalk
`Elastic Beanstalk`はアプリケーションのデプロイ・管理サービスです。
実態はEC2やS3、RDSやなどをプロビジョニングするサービスです。
これはEC2やネットワークの存在を強く意識することなく、アプリケーションのデプロイと管理ができます。

#まとめ
以上で一通り調べたことをまとめ終わりました。
なにか間違っているところなどあればご指摘ください！