【Amazon Web Services 基礎からのネットワーク&サーバー構築 】に取り組む

<img width="300" alt="AWS_Fundarmental_Of_Network_and_Servers.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526723/512e3bec-ddf4-0490-7080-f2fea6dc9b2a.jpeg">
[Amazon Web Services 基礎からのネットワーク&サーバー構築](https://www.amazon.co.jp/Amazon-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-%E6%94%B9%E8%A8%823%E7%89%88/dp/4296105442/ref=sr_1_3?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&keywords=%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&qid=1582411768&sr=8-3)

この書籍ではWordPressでブログシステムを作りながら、サーバやネットワークの構築を学ぶ

初学者はネットワークやサーバに関する専門用語に不慣れなので、適宜用語の定義の確認も行う

また、AWSのユーザ設定など、AWSを始めるにあたっての必要事項についても、適宜参考URL等を貼るなどして補う


#サーバーとは
サーバー用のOSをインストールしたコンピュータのこと

どのようなソフトウェアをインストールするかによってサーバーの役割が決まる

(例)
 Webサーバーソフトをインストールするとwebサーバーになる

DBサーバーソフトを入れるとDBサーバーとなる

※DBサーバー : データベースが置いてあるサーバーのこと

※データベース : 後で使いやすい形に整理されたデータの集まり

#ネットワークとは
互いに接続されたコンピュータの集まりのこと

コンピュータなどの機器ごとにIPアドレス(住所)を割り当て、送受信が行えるようにしている

#IPアドレス
ネットワーク上で重複しない唯一無二の番号

いわゆる「住所」に相当するもの
####パブリックIPアドレス
インターネットで利用するアドレス

重複を避けるため、自由に値を決めることができない

ICANNという団体が一括管理している
####プライベートIPアドレス
インターネットで使われないIPアドレス

誰にも申請することなく自由に使えるので個人でネットワークの実験を行うような場合に利用できる

表１：プライベートIPアドレス範囲

|IPアドレス範囲| 
|---| 
|10.0.0.0 ~ 10.255.255.255| 
|172.16.0.0 ~ 172.31.255.255|
|192.168.0.0 ~ 192.168.255.255|
#IPアドレス範囲と表記法

ホストに割り当てるIPアドレスの範囲は「2のn乗個で区切る」という決まりがある

一般に良く使われる区切りが「256個」と「65536個」

「256」は8ビット(2の8乗)

IPアドレスの「ピリオドで区切られた一つの数字」が256個。(例えば192.168.1.0 ~ 192.168.1.255)

「65536」は16ビット(2の16乗)

IPアドレスの「ピリオドで区切られた数字二つ分」が65536個である。例えば192.168.0.0 ~ 192.168.255.255)

IPアドレスの値が固定された部分をネットワーク部といい、値が変化する部分をホスト部と呼ぶ

**ホスト(host)**とは、コンピュータやルーターなどのネットワーク機器など、IPアドレスをもつ通信機器の総称のこと




![IP_Address_and_Representation.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526723/75a6d011-ec6b-7c7e-3a15-d5bfec4b7e56.png)


$$図１ : IPアドレス$$
 
##CIDR(サイダー)表記とサブネットマスク表記
「192.168.1.0 ~192.168.1.255」という表現は長いので「CIDR表記」や「サブネットマスク表記」を用いてアドレスを表現する



###CIDR表記
IPアドレスの「 **ネットワーク部のビット長**」を「 **/ビット長**」として末尾に表記する

例.
「192.168.1.0 ~ 192.168.1.255」   &nbsp; &nbsp; &rarr; 192.168.1.0/24

「192.168.0.0 ~ 192.168.255.255」 &rarr; 192.168.0.0/16

CIDR : Classless Inter-Domain Routing

###サブネットマスク表記

IPアドレスの**ネットワーク部**をすべて**255で埋めた表記**を並べる

例.
「192.168.1.0 ~ 192.168.1.255」   &nbsp; &nbsp; &rarr; 192.168.1.0/255.255.255.0

「192.168.0.0 ~ 192.168.255.255」 &rarr; 192.168.0.0/255.255.0.0


 **ネットワーク部のビット長**を **プレフィックス(prefix)**と呼ぶ

###サブネット

分割したネットワークのこと

言い換えると、全体のネットワーク領域から一部の領域を切り出したもの

###パブリックサブネット

インターネットに繋がっているサブネット

WEBサーバーなどで用いる

###プライベートサブネット
インターネットに繋がっていないサブネット

DBサーバーなどで用いる



###ネットワークの構築
サーバーはネットワークに接続される

インターネットと接続可能なネットワークでは**TCP/IP**というプロトコルを使う

※TCP/IP : Transmission Control Protocol/Internet Procotol

※プロトコル : 情報を相互に伝達できるようにするため、あらかじめ決められた約束や手順のこと

インターネットに接続する際には**ルーター**という機器を使う

各サーバーはルーターにデータが流れるように構成しないとインターネットに接続できない

インターネットでは。「`http://www.example.co.jp/`」のようなドメイン名でアクセスする

ドメイン名とは数字とピリオドだけで表現されるわかりにくいIPアドレスに結びつけ、人が理解しやすい名前にしたもの

ドメイン名を使うには**DNSサーバー**の設定が必要

###NAT

片方向だけのインターネット接続を許す機能

サーバーからはインターネットに接続できるが、インターネット側からサーバーには接続できない

サーバーからリクエストした際の返事の通信は通してくれる

これによって、サーバーは外部からソフトウェアを安全にダウンロードできるようになる

#AWSのアカウント作成と初期設定

AWSのアカウント作成については以下のURLが参考になった

AWSアカウント作成の流れ
https://aws.amazon.com/jp/register-flow/

また、セキュリティやIAMユーザ作成などの初期設定を行う必要がある

以下の記事が参考になる

AWSアカウントを取得したら速攻でやっておくべき初期設定まとめ
https://qiita.com/tmknom/items/303db2d1d928db720888

AWSアカウントでのIAMユーザの作成
https://qiita.com/kzykmyzw/items/ca0c3276dfebb401f7d8


git-secretsがあれば、機密情報も怖くない
https://www.goriwaka.com/entry/2019/08/19/git-secrets%E3%81%8C%E3%81%82%E3%82%8C%E3%81%B0%E3%80%81%E6%A9%9F%E5%AF%86%E6%83%85%E5%A0%B1%E3%82%82%E6%80%96%E3%81%8F%E3%81%AA%E3%81%84

CloudTrailでAWS Free Tier limit alert が届いた話
https://qiita.com/heyheyww/items/b67d2bab58ee1cf6057e


#Amazon VPC

VPCはVirtual Private Cloudの略で、アマゾンのクラウド上に仮想的にネットワークを作成することができる

ネットワークのIPアドレス範囲を決め、下図のようにVPCの全体の領域の中にパブリックのサブネットとプライベートのサブネットを作成できる



![VPC_Public_and_Private.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526723/13c13c74-42d4-fa28-524b-4a143d0a57fd.png)

$$図２ :  VPCのアドレス範囲$$


####サブネットの分割
「10.0.0.0/16」のようなアドレス範囲のことをCIDRブロックと呼ぶ

実際のネットワークでは、割り当てられたCIDRブロックをさらに小さなCIDRブロックに分割して使う

このようにさらに細分化したCIDRブロックを **サブネット**と呼ぶ

例.
「10.0.0.0/16」を「/24」の大きさで切って256分割すると

「10.0.**1**.0/24」,「10.0.**2**.0/24」,「10.0.**3**.0/24」…「10.0.**255**.0/24」

と分かれる

分けられたサブネットそれぞれに対して、異なるネットワーク設定が行える

(例)
10.0.1.0/24をインターネットからアクセスできる「パブリックサブネット」として使い、
10.0.2.0/24をインターネットから隔離した「プライベートサブネット」として利用する

###インターネット回線とルーティング

Amazon VPCにおいて、あるサブネットをインターネットに接続するには**インターネットゲートウェイ(Internet Gateway)**を用いる

ネットワークにデータを流すためには、**ルートテーブル(Route Table)**と呼ばれる、ルーティング情報の設定が必要である


ルートテーブルは、データを送信する際、宛先のIPアドレスまでデータを流せるよう転送ルールを示す設定である


|宛先アドレス|流すべきネットワークの入り口となるルーター|
|---|---|
$$図３: ルートテーブル$$

宛先アドレスのことを**ディスティネーション(destination)**と呼ぶ

##仮想サーバーの構築 : Amazon EC2の利用

###Amazon EC2 インスタンス
Amazon EC2 : Amazon Elastic Compute Cloud　の略

AWS内ではEC2を使ってVPC領域内にサーバーを作る
起動された各サーバーの個体は**インスタンス**と呼ばれる

インスタンスには**プライベートIPアドレス**と**パブリックIPアドレス**を設定する

※プライベートIPアドレス : パブリックサブネット内で利用可能だがインターネットとの接続はできない

※パブリックIPアドレス : インターネットで通信するためのIPアドレス

####AMI

AMI(Amazon Machine Image) はインスタンスを起動する際に用いるイメージファイルのこと

OSがインストールされていて、初期アカウントの設定までが済んでいる

####インスタンスタイプ
仮想マシンのスペックのこと

####ストレージタイプ
インスタンスで使用する仮想ハードディスク(EBS:Elastic Block Store)を設定する

####セキュリティグループ
インスタンスにセキュリティを設定する機能

####キーペアの作成
キーペアは、インスタンスにログインする際に必要となる「鍵」である

#SSH(Secure SHell)
SSHは、リモートコンピュータと通信するためのプロトコル

認証部分を含めネットワーク上の通信がすべて暗号化されるため、安全に通信することができる

作成したキーペアファイルを用いて接続する

windowsではTera Termを使ってSSH接続する

#IPアドレスとポート番号
##ルーティングプロトコル
インターネットでは、ルーター動詞が通信してルートテーブルの情報をやりとりし、必要に応じて自動的に更新するようにしている
これを実現するのがルーティングプロトコルである

ルーティングプロトコルは大きく分けて**EGP**と**IGP**の2種類がある

###EGP(Exterior Gateway Protocol)
ある程度大きなネットワーク(AWSやインターネットサービスプロバイダーISPなど)は、そのネットワークを管理する**AS番号(Automous System)**という番号を持っている

EGPでは、このAS番号をやりとりして「どのネットワークの先に、どのネットワークが接続されているか」を大まかにやりとりする

###IGP(Interior Gateway Protocol)
EGP内部のルーター同士で、ルートテーブルの情報をやりとりするのに使われる

##ポート番号
###ポートとポート番号
TCP/IPで通信するサーバーなどの機器に用意された、**ほかのコンピュータとデータを送受信するためのデータの出入り口**のこと

ポートに対してポート番号が割り当てられる

ポート番号を使うことで一つのIPアドレスで同時に複数のアプリケーションが通信できる

###ウェルノウンポート番号
**ウェルノウンポート**(Well-known Port: 良く知られているポート)は**代表的なアプリケーションが使うポート番号**のこと

SSH通信では「ポート22番」がウェルノウンポートである

#ファイアウォール
**通してよいデータだけを通して、それ以外を遮断する機能**の総称

もっとも簡単な構造のファイアウォールが**パケットフィルタリング**である

###パケットフィルタリング
流れるパケットを見て、通貨の可否を決める仕組みのこと

パケットには、「IPアドレス」のほか「ポート番号」も含まれている

パケットフィルタリングではパケットに付随するこれらの情報を見て通過の可否を決める

#ドメイン名と名前解決
###ドメイン名
一般に、IPアドレスは数字の羅列で覚えにくいため、一般にブラウザからのアクセスには「`http://www.exampke.co.jp`」のようなドメイン名を用いる

###名前解決

ドメイン名を使って通信する場合、ドメイン名がどのパブリックIPアドレスなのかを知る必要がある

「ドメイン名とIPアドレス」との相互変換をすることを**名前解決**という
###DNS
DNS(Domain Name System)は、名前解決を行う仕組みのこと

DNSサーバーが行う

#HTTP
HTTP(Hyper Text Transfer Protocol)は、HTMLをはじめとするWebサービスに必要な情報を伝達するためのルール

WebサーバーとWebブラウザはHTTPを用いてデータをやりとりする

#TCP/IPによる通信の仕組み

TCP/IPはネットワーク状況に合わせて適切なデータ送信サイズを決めたり、エラーがあったときに再送したりするなど、より詳細な通信方法を定義している

IPアドレス、ポート番号、DNS、HTTPといった一連の処理は、TCP/IPモデルという役割ごとに4つの階層に分かれたモデルで構成されている

$$表 : TCP/IPモデルの階層$$

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


上記のように階層化させることで、上位の階層は下位の階層が何でもよく、下位の階層は上位の階層の内容はわからなくてもよい、という階層ごとに独立した構造になっている

###データのカプセル化
データに対して、下の階層で処理ができるようにデータを付与すること

一例として、DNSが名前解決する処理について考える

**1.名前解決リクエストの作成**
DNSサーバーに対して名前解決の処理を依頼するため、DNSプロトコルで定められたフォーマットに従い、名前解決のリクエストデータを作成する

**2.UDPでカプセル化(トランスポート層)**
作成した名前解決のリクエストデータに対して、中身に手を加えずに、さらに下の階層で処理ができるようにデータを付与する

トランスポート層のプロトコルはTCPかUDPであるが、DNSでは一般的にUDPを使うのでUDPに引き渡す

**3. IPでカプセル化(インターネット層)**

次にデータをインターネット層に渡す

IPでのカプセル化ではIPヘッダーが追加される

これによってIPアドレスが付き、実際にLANや電話回線などの配線上に流せるようになる

**4.Ethernetでカプセル化(インターフェース層)**

「それぞれの配線の規格」に準拠したヘッダーがいくつか付けられる

LANには「Ethernet」という規格がある

データの先頭と末尾にいくつかのデータが付与される

これを**Ethernetフレーム**という

![TCP_IP .png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/526723/1db13cfe-0191-486e-d1b5-dcbcb38065f6.png)

####UDP(User Datagram Protocol)

UDPは「ステートレスプロトコル」と呼ばれる、状態を持たないプロトコルのこと

データが送りっぱなしのプロトコルで、相手がパケットを受け取ったかどうかを確認する手段を持たない

UDPはやりとりが単純なので高速に送信できる

DNSサーバーへのリクエストのように、データが1パケットに収まる場合や、送信したパケットが前後しても良い場合、相手から返答がないときには再度処理すればよい場合などではUDPが適している

####TCP(Transmission Control Protocol)
TCPは双方向の通信が可能

TCPでは、自分と通信相手との間に「コネクション」を確立する

Webブラウザで入力したデータをHTTP経由でWebサーバーに送り、データベースに格納するような場合など、高い信頼性を必要とする場合に用いる