AWS基礎

#前提
AWSについて学んだことを書いていきます。

#本題
インフラを知れば、自分で好きなように開発環境を整えることができるようになる。
また、課題が生じたときに、アプリケーション開発の枠組みから出て、システム全体で対応できるようになるのも大きなメリット。
例えば、リソース不足になったとき、アプリケーションの最適化だけで解決するのでなく、スケールアップやスケールアウトなどのインフラ計画まで踏み込むんだ包括的な対応ができるようになる。

##インフラ知識を身につけることのメリット
###障害に強くなる
システムにトラブルがあったときに、どこに問題があるか、切り分けられるようになる。

###システム全体での幅広い対応ができるようになる
システムを運用していると、リソース不足に陥ることがある。
インフラを知らなければ、アプリケーション開発の枠組みの範囲でしか対応できない。
例えば、プログラムを改良したり、実行されているプロセスの数を減らしたりするソフトウェア的な対応しかできない。
しかし、インフラを知っていれば、ネットワークやサーバーを増強して対策を取るなど、システム全体で対応できるようになる。

##Webサーバーとは
サーバーに対してWebの機能を提供するソフトウェアをインストールしたもの。
同様に、「データベースの機能を提供するソフトウェアをインストールしたもの」がデータベースサーバー、「メールの送受信機能を提供するソフトウエアをインストールしたもの」がメールサーバ。
そもそも、サーバーというのは「Linux」や「Windows Server」など、サーバー用のOSをインストールしたコンピュータのことに過ぎない。
サーバーにどのようなソフトウェアをインストールするかで、サーバーの役割が決まる。
※サーバーには、複数のソフトウェアをインストールすることもできる。
　例えば、「Webサーバーソフト」と「データベースソフト」の両方をインストールしたときは、「Webサーバー兼データベースサーバー」となる。

・サーバー構築に必要な知識
１、サーバーOSのインストール方法
LinuxやWindows ServerなどのサーバーOSのインストール、そして各種の設定方法。

２、各ソフトフェアのインストールや設定方法
Webサーバーソフトやデータベースサーバーソフト、メールサーバーソフトなど、様々な機能を提供するソフトウェアのインストールや設定方法。
　例えば、Webサーバーとして機能させたいなら、「Apache HTTP Server」や「nginx」などのソフトウェアをインストールする。
　データベースサーバーとして機能させたいなら、「MySQL」や「MariaDB」「PostgreSQL」などのソフトウェアをインストールする。
　メールサーバーとして機能させたいなら、「Sendmail」や「Postfix」などのソフトウェアをインストールする。

###ネットワークの構成
構築したサーバーは、ネットワークに接続しないと通信できない。
インターネットと接続可能なネットワークでは、「TCP/IP」というプロトコルを使っている。
TCP /IPでは、それぞれのサーバーに「IPアドレス」という番号を振る。
また、インターネットに接続する場合には、通常「ルーター」と呼ばれる機器を使うが、各サーバーでは、そのルーターにデータが流れるように構成しておかないとインターネットに通信できない。
また、インターネットではドメイン名でアクセルする。
ドメイン名とは、サーバーのIPアドレスに付与する、人間が理解しやすい名前のようなもの。
ドメイン名を使うためには、「DNSサーバー」と呼ばれるサーバーの設定も必要。

・ネットワーク構築に必要な知識
１、IPアドレスに関連する知識
IPアドレスをどのように定めるのか。
そして、ルーターを介したインターネットとのデータの流れを、どのように制御するのかなどの知識。

２、DNSサーバーに関する知識
ドメイン名をIPアドレスとを結びつけるには、どのようにすればいいか。
どのようなやりとりで、ドメイン名とIPアドレスとは、相互に変換されているかなどの知識。


##「公開されたネットワーク」と「隠されたネットワーク」
###パブリックサブネット
インターネットに接続し、「公開」される。
ここにはWebサーバーを配置。

###プライベートサブネット
インターネットに直接、接続せず「隠されたネットワーク」とする。
ここにはDBサーバーを配置。
DBサーバーにはデータを保存するが、インターネットから直接接続して、いたずらされるのを防ぐため、インターネットからは隠そうという目論み。
とはいえ、DBサーバーが全くインターネットにアクセスできないのは困る。
なぜなら、ソフトウェアをインターネットからダウンロードしてインストールしたり、アップデートしたりできなくなるため。
そこで、「NAT」を導入する。

##NATについて
NATを導入すると、「片方向だけの接続を許す」ことが実現できる。
つまり、DBサーバーからはインターネットに接続できるが、逆にインターネットからDBサーバーには接続できないという環境を実現する。
もちろんDBサーバーから外部に通信した際の戻り（返事）の通信は通じてくれる。
このNATという仕組みにより、DBサーバーは外部からソフトウェアを安全にダウンロードできるようになる。

##物理的なネットワークとAWS
ネットワークやサーバーを構築するには、「インターネットに接続された回線」と「各種サーバー」、そして、それらを接続するハブやルーターなどの「ネットワーク機器」を用意しなければならず、手軽に試せない。
　そこで検討したいのが、「仮想的にネットワークやサーバーを構築する」という方法。
代表的なのが、AWSですね。

##リージョンとアベイラビリティーゾーン
AWSは、世界２２箇所の分散されたデータセンター群で構成されている。
###リージョン
それぞれの地域に存在するデータセンター群のこと。
例えば、「バージニアリージョン」、「オレゴンリージョン」、「東京リージョン」などがある。
　それぞれのリージョンはさらにアベイラビリティーゾーン（AZ）に分割されている。
それぞれのアベイラビリティーゾーンは、物理的に距離が相当離された、独立したファシリティを用いている。
つまり、あるアベイラビリティーゾーンが地震や洪水などで被害を受けても、他のアベイラビリティーゾーンが影響を受けないようにする、耐障害性を高める概念。
AWSで仮想的なネットワーク（VPC）や仮想的なサーバー（EC2）を構築する場合、それを「どのリージョンの、どのアベイラビリティーゾーンに置くのか」を決めなければなりません。
AWSを使って実運用する際には、「エンドユーザーに近いリージョンを選ぶとレスポンスが良くなる」とか「耐障害性を高めるために、異なるアベイラビリティーゾーンに同じ構成のサーバーを立てて負荷分散する」など、いろいろと考慮すべきことがある。
通常、AWSではデータセンター全停止などの大きな障害に備えて、複数のアベイラビリティーゾーンにEC2インスタンスを配置して、耐障害性を高めることを推奨している。

##ネットワークとVPC
AWSでは、VPCと呼ばれる領域を作ると、そこに自由なネットワークを作ることができる。
VPCを作るときには、「どのようなIPアドレス範囲を使うか」を指定する。
VPCを作ったら、それをいくつかのネットワークにさらに分割して利用する。
分割したネットワークのことを「サブネット」という。
サブネットの中には、サーバー（EC2インスタンス）を配置できる。

###サーバーとEC2インスタンス
AWSでは、EC2というサービスを使ってサーバーを作る。
起動された各サーバーの個体はインスタンスと呼ばれる。
インスタンスを作るときは、CPUのスペックやディスクの容量などを決めれる。

#ネットワーク構築
##ネットワークで用いるIPアドレス範囲を定める
AmazonVPCを用いてVPC領域を構成すると、ユーザーごとに隔離されたネットワークを作れる。
作ったネットワークには、任意のネットワークが設定でき、ルーターなどの仮想的なネットワーク機器も配置できる。
早速、VPC領域を作っていきたいところだが、まずVPC領域に対して割り当てる「IPアドレス範囲」の設定が必要。

###パブリックIPアドレスとプライベートIPアドレス
インターネットで使われているTCP/IPというプロトコルでは、通信先を特定するのにIPアドレスを用いる。
IPアドレスはネットワーク上で互いに重複しない唯一無二の番号で、「住所」に相当する。
IPアドレスは、３２ビットで構成される。
192.168.1.2のように、8ビットずつ１０進数に変換したものを「.」（ピリオド）で区切って表記する。
それぞれのピリオドで区切られた数字は「０」〜「２５５」まで。
つまり、IPアドレスは「0.0.0.0」から「255.255.255.255」までとなる。

***パブリックIPアドレス***
インターネットに接続する際に用いるIPアドレスのこと。
パブリックIPアドレスは、プロバイダーやサーバー事業者から貸し出しされる。

***プライベートIPアドレス***
インターネットで使われないIPアドレス。
プライベートIPアドレスは、誰にも申請することなく自由に使える。
社内LANを構築するようなときなど、このIPアドレスを用いるようにする。

###IPアドレス範囲と表記方法
ネットワークを構築する際には、まずそのネットワーク内で使うIPアドレスの範囲を定める。
IPアドレスの範囲を10個や15個、20個といったように、好きな数で区切ることはできない。
ホストに割り当てられるIPアドレスの範囲は、「2のn乗個で区切る」という決まりがある。
つまり、4個・8個・16個・32個・64個・128個・256個といった単位で区切る。
一般によく使われる区切りが、256個と65536個。
256個の区切りは最後から８ビット分（＝２の８乗）に相当し、ちょうどIPアドレスのピリオドで区切った先頭から3つまでを境に、左側の数字をホストに割り当てる。
例えば、「192.168.1.0〜192.168.1.255」は256個で区切った時の一例。
同様に、65536個の区切りは最後から１６ビット分（＝２の１６乗）に相当し、IPアドレスのピリオドで区切った先頭から2つまでを境に、左側の数字をホストに割り当てる。
例えば、「192.168.0.0〜192.168.255.255」は65536個で区切った時の一例。
IPアドレスは前半の部分を「ネットワーク部」、後半の部分を「ホスト部」という。
※ホスト（host）とは、コンピュータやルーターなどネットワーク機器など、IPアドレスをもつ通信機器の総称。

***CIDR表記とサブネットマスク表記***
「192.168.1.0〜192.168.1.255」や「192.168.0.0〜192.168.255.255」といった表現は長いため、通常IPアドレス範囲を示す時には、「CIDR表記（サイダー）」もしくは「サブネットマスク表記」のいずれかの表記を用いる。

１、CIDR表記
IPアドレスを２進数で表記したとき、「ネットワーク部のビット長」を「/ビット長」で示す方法。
このビット長のことを「プレフィックス（prefix）」という。
例えば、「192.168.1.0〜192.168.1.255」の場合、プレフィックスは２４ビット。
そこで「192.168.1.0/24」と記述する。
同様に、「192.168.0.0〜192.168.255.255」はプレフィックスは16ビットのため、「192.168.0.0/16」と記述する。
IPアドレス範囲をCIDR表記する場合、その範囲は「CIDRブロック」と呼ばれる。

２、サブネットマスク表記
サブネットマスクはプレフィックスのビット数だけ２進数の「１」を並べ、残りは「０」を記述した表記。
例えば、「192.168.1.0〜192.168.1.255」の場合、サブネットマスクは「255.255.255.0」なので、「192.168.1.0/255.255.255.0」と表記する。
同様に「192.168.0.0〜192.168.255.255」の場合、サブネットマスクは「255.255.0.0」で「192.168.0.0/255.255.0.0」と表記する。
CIDR表記やサブネットマスク表記は少し難しく感じるが、単純に「先頭からいくつ分のIPアドレス範囲を示しているか」を示す表記方法にすぎない。
多く用いるIPアドレス範囲は、「256個単位」もしくは「65536個単位」。
最初のうちは、以下の規則さえ覚えていれば十分。

１、CIDR表記「/２４」もしくはサブネットマスク表記「/255.255.255.0」
256個分の範囲を示す。
例えば、「AAA.BBB.CCC.0/24」もしくは「AAA.BBB.CCC.0/255.255.255.0」と表記された場合、「AAA.BBB.CCC.0〜AAA.BBB.CCC.255」。

２、CIDR表記「/１６」もしくはサブネット表記「/２５５.２５５.０.0」
65536個分の範囲を示す。
例えば、「AAA.BBB.0.0/24」もしくは「AAA。BBB.0.0〜AAA.BBB.255.255」。

これらは表記の決まりごとにすぎない。
例えば、
❶192.168.1.0〜192.168.1.255
❷192.168.1.0/24
❸192.168.1.0/255.255.255.0
は全て同じIPアドレス範囲を示している。
ネットワーク関係の多くのコマンドや設定では、❷や❸の表記しか受け付けない。
そのため、❷や❸の表記が出てきた時に、❶の範囲を示すのだとわかるかどうかが、ネットワークを理解するポイントになる。

###ネットワーク構成
実験用ネットワークでは、プライベートIPアドレス範囲を用いる。
プライベートIPアドレス範囲なら、どの範囲を用いても構わないが、VPC領域を作成するときに、プレフィックス長として「１６以上」を指定する必要がある。

##VPCの作成
今回は「10.0.0.0/16」のCIDRブロックでVPC領域を構成する。
AWSマネジメントコンソールを使ってVPC領域を作るには、次のようにする。
この作業は、実世界において、「ルーターやハブなどを用意して、環境を整える作業」に相当するもの。

***手順***
１、AWSマネジメントコンソールでVPCを開く
AWSマネジメントコンソールのホーム画面からVPCを選択する。

２、リージョンの設定
VPCの操作対象とするリージョンを右上から選択。（東京リージョン）
※AWSマネジメントコンソールでは、一度右上からリージョンを選択するとVPCだけでなく他のサービスに対しても、それがデフォルトとして設定される。

３、VPC領域を作成
VPCメニューをクリック。
すると、VPC領域の一覧が表示される。
VPCの作成をクリックして、VPC作成を開始。
名前タグには、作成するVPC領域につける名前を入力。
「IPv4 CIDRブロック」は使用するIPアドレス範囲。
作成をクリックすると、VPC領域が作られる。

##VPCをサブネットに分割
以上の作業で、「10.0.0.0/16」というCIDRブロックを持ったVPC領域という名前をもつVPC領域、すなわち、プライベートなネットワーク空間が出来上がる。
このネットワーク空間は、作成したユーザーが自由に扱うことができる空間で、他のユーザーからは全く見えない。

###サブネットの考え方
実際のネットワークでは、割り当てられたCIDRブロックをそのまま使わずにさらに小さなCIDRブロックに分割して利用することがほとんど。
このように、さらに細分化したCIDRブロックのことをサブネットという。
例えば、今回は「10.0.0.0/16」というCIDRブロックをVPC領域に割り当てたが、これをさらに、「/24」の大きさで切って256分割する。

サブネットに分割するとその部分でネットワークを分けることができる。
分けたい主な理由として、次の❷点があげられる。

1、物理的な隔離
社内LANを構築する場合、「１階と２階とで、別のサブネットに分けたい」というように物理的に分けたいことがある。
サブネットにわけておくと、万一、どちらかのサブネットが障害を起こした時も、もう片方にその影響が出にくくなる。

２、セキュリティ上の理由
サブネットを分ければ、それぞれに対して、別のネットワークの設定ができる。
例えば、「経理部のネットワーク」だけを分離して、他の部署からはアクセスできないようにしたいというのは、よくあるセキュリティの要求。
また、社内にサーバーを持っている場合は、「サーバー群だけを別のサブネットにして、そのサブネットとの通信を監視したり一部しかデータを通さないように構成したりすることでセキュリティを高めるとか、インターネットに接続するサーバーだけを別のサブネットにして、社内LANから隔離するという構成もよくとられる。

###VPC領域をサブネットに分割する
１、パブリックサブネット（10.0.1.0/24)
インターネットからアクセスすることを目的としたサブネット。
この領域には、Webサーバーを設置し、インターネットからアクセスできるようにする。

２、プライベートサブネット（10.0.2.0/24）
インターネットから隔離したサブネット。この領域には、データベースサーバーを設置する。

「インターネットからアクセスできる箇所」と「インターネットからはアクセスできない箇所」に分離するのは、セキュリティを高める時に、よく用いられるネットワーク構成。
プライベートサブネットに配置するデーターベースサーバーは、インターネットから直接アクセスできないため、セキュリティを高められる。

##パブリックサブネットをインターネットに接続
VPCにおいて、あるサブネットをインターネットに接続するには、インターネットゲートウェイを用いる。
これは自分のネットワークにインターネット回線を引き込むというイメージの作業になる。
※複数のVPC領域を作る場合は、どのVPCに結びつけるかを選択する必要がある。VPC領域にはIDが割り振られているため、この番号で区別する。

###ルーティング情報
ネットワークにデータを流すためには、ルーティング情報と呼ばれる設定が必要。
この設定は、ルーティングテーブルやルートテーブルと呼ばれている。
インターネットで使われている「TCP/IP」というプロトコルでは、データを細切れにしたパケットという単位で、データが送受信される。
パケットは様々なヘッダー情報とデータの実体を含んでいる。
ヘッダー情報の１つに、宛先IPアドレスがある。
TCP/IPでは、ネットワーク機器であるルーターがこの宛先IPアドレスを見ながら、もっとも宛先IPアドレスに近い方のネットワークへと次々とパケットを転送していき、最終目的地までパケットを到達させる。
この仕組みでは、ルーターがどちらのネットワークが、より宛先IPアドレスに近いかを事前に知っていないとうまく機能しない。
設定によっては、パケットが行ったり来たりしてしまい、相手に届かないこともある。
この問題を解決するための宛先IPアドレスの値が、いくつの時には、どのネットワークに流すべきかという設定こそが、ルートテーブルである。
それぞれのルーターには、ルートテーブルを設定しておき、パケットが到着した時には、そのルートテーブルの定義に従って次のネットワークへとパケットを転送する。
ルートテーブルは宛先アドレス流すべきネットワークの入り口となるルーターという書式で設定する。
宛先アドレスのことは、ディスティネーションと呼ぶ。
流すべきネットワーク先はネクストホッピやターゲットなどという名称で呼ぶ。

###VPCでルートテーブル設定
VPCではサブネットごとにルートテーブルを設定できる。
サブネットやインターネットゲートウェイの間に、ルーターの役割を果たすソフトウェアが動いている。

・デフォルトのルートテーブル
VPC領域を作った直後は、デフォルトのルートテーブルが作られる。
サブネットを作成した時には、そのデフォルトのルートテーブルが適用されている。