AWS 基礎

#前提
AWS（Webサーバーソフトのインストール）について学んだことを書いていきます。

#本題
#Webサーバーソフトのインストール
サブネットのなかにサーバーを構築し、構築したサーバーにWebサーバーソフトをインストールすることでWebサーバーとしてインターネットに公開する。

##Apache HTTP Serverインストール
サーバーをWebサーバーとして機能させるには、Webサーバーソフトをインストールする。
すると、Webブラウザなどからの要求を受け取り、サーバー上のコンテンツを返したり、サーバー上でWebアプリケーションを実行したりできるようになる。
※Apacheはオープンソースで提供されている、世界で最も多く利用されているWebサーバーソフト。

###サーバーにApacheをインストール
１、インスタンスにログイン
インスタンスにSSHでログイン。

２、Apacheをインストール
下記コマンドを入力し、Apacheをインストール。

```
$ sudo yum -y install httpd
```

yumコマンドは、アプリケーションをダウンロードしインストールしたり、アンインストールしたりするときに用いる管理者コマンド。
ここで指定しているhttpdは、Apacheは構成する実行ファイル名。
つまり、このコマンドによって、Apacheがインストールされる。
なお、-yオプションはユーザーの確認なしにすぐにインストールする指定。
※sudoコマンドは、指定したコマンドを管理者権限（root権限）で実行するためのもの。
インスタンスには、ec2-userユーザーでログインする。
ec2-userユーザーは、管理者（rootユーザー）ではない。
そのため、管理者権限が必要な場合は、sudoコマンドをつけて実行する。

３、Apacheを起動する
以下のコマンドを入力してApacheを起動する。

```
$ sudo systemctl start httpd.service
```
systemctlコマンドは、指定したコマンド（ここではhttpdのためApache本体）を起動・停止・再起動するコマンド。
ここではstartを指定しているため、Apacheは起動する。

４、自動起動するように構成する
これでApacheは起動するが、サーバーを再起動するとまた停止する。
そこでサーバーが起動するときに、Apacheも自動的に起動するように構成する。
下記、コマンドを入力する。

```
$ sudo systemctl enable httpd.service
```
systemctlコマンドは、自動起動について設定（enable）、設定解除（disable）、設定の確認（list-unit-files）を指定するコマンド。
ここでは、httpdをenableに指定しているため、サーバーが起動したときにApacheが自動起動するように構成される。
※正しく構成されたかどうかは、下記コマンドを入力して確認できる。

```
$ sudo systemctl list-unit-files -t service
```
この結果において、httpd.serviceがenabledであれば自動起動が有効になっている。

###Apacheのプロセスを確認
Apacheをインストールし、その実行ファイルであるhttpdが起動したはず。
確認方法には、２種類ある。

１、Apacheはhttpdと言うファイルが実行コマンド。
もし実行中であるなら、このhttpdのプロセスがサーバー上に存在するはず。
Linuxシステムでは、psコマンドを使うと、実行中のプロセスを確認できる。

```
$ ps -ax
```
-axオプションは、-a（全てのプロセスを表示する）、-x（他の端末に結び付けられているプロセスも表示する）の組み合わせ。
-axオプションを指定して実行すると、サーバー上で動作している全てのプロセスが表示される。
httpdが存在するかを確認する。
※ps -ax |grep httpdと入力するとhttpdを含む行だけを出力することができる。

先頭に表示されている数字は、プロセス番号PIDと呼び、プロセスを区別するために自動的につけられる番号。
※プロセス番号は、プロセスを終了（killコマンドで終了できる）したり、プロセスに何か通知を送信したりするときに使われる。

２、ネットワークの待ち受け状態を確認する
エンドユーザーがWebブラウザを通じて、このサーバーにアクセスするとApache（httpd）はそれに対応するコンテンツを返す。
これを実現するため、httpdは、ポートを開けて待機する。
IPアドレスとポート番号で調査したのと同様にlsofコマンドを使って、ポートの状況を調べる。

```
$ sudo lsof -i -n -P
```
すると結果の中に、httpdが存在することがわかる。
TCP*:80と表示されていることから、Apacheはポート８０番で待ち受けていることがわかる。
ポート８０番は、Web通信で用いるHTTPのウェルノウンポート。

##ファイアウォールを設定する
Apacheをインストールし起動したため、このサーバーはWebサーバーとして機能している。
実際にWebブラウザを使ってアクセスしてみる。

###Webサーバーに接続する
WebブラウザからWebサーバーに接続するときには、接続先のパブリックIPアドレスを指定する。
現状だと、ブラウザにパブリックIPアドレスを入力しても接続できない状況です。

###ファイアウォールを構成する
接続できないのは、ポート８０番がファイアウォールによってブロックされているから。
EC2において、ファイアウォール機能を構成するのは、セキュリティグループという機能。
ファイアウォール設定変更し、ブロックされているポートで通信できるようにする操作を、ポートを開けるやポートを開く、ポートを通すなどと表現する。
※アパッチのデフォルトの構成では、/var/www/htmlディレクトリの内容がWebブラウザに出力される。
ただし、このディレクトリが空の場合は、/var/www/error/noindex.htmlが出力される。

##ドメイン名と名前解決
このようにWebブラウザにパブリックIPアドレスを入力することで、Webサイトにアクセスできる。
しかし、一般にWebサイトにアクセスするときに直接パブリックIPアドレスを指定することは、ほとんどない。
なぜなら、単なる数字であるIPアドレスは覚えにくいから。
ほとんどの場合、www.example.co.jpなどのドメイン名を用いてアクセスするはず。
では、ドメイン名を利用するには、どのようにすればいいか。

###ドメイン名の構造
ドメイン名は、IPアドレスと同様に、Webサーバーやメールサーバーなどのインターネット上の住所に相当するもの。
英数字で構成された名称でIPアドレスのような数字に比べて、簡単に覚えられる。
ドメイン名はIPアドレスと同様にサーバーなどを指し示すものため、一意性が保証される必要がある。

・ドメインの階層
ドメイン名は、ピリオドで区切られた構成をしている。
ピリオドで区切られた部分をラベルと言う。
最も右側のラベルをドップレベルドメインと呼び、左に向かって第２レベルドメイン、第３レベルドメインと呼ぶ。

```
www 第４レベルドメイン
example 第３レベルドメイン
co 第２レベルドメイン
jp トップレベルドメイン
```
ドメインの階層をツリーで表現すると、
一番上のルート（root）と呼ばれる部分を頂点とし、下の階層へと広がる。
ルートの直下にはjp、com、netなどのトップレベルドメインが配置される。
そのさらに下に、第２レベルドメイン、第３レベルドメインと続く。
あるドメインの下に、ドメインを新設する場合は、必ず、異なるラベルをつける。
そうすることで、ドメイン名空間を構成する全てのドメイン名は、一意性が保証される。

・ドメインの管理
ドメイン名は、IPアドレスと同様にICANNが統括管理しており、トップレベルのドメイン名ごとに、それぞれの業者が管理している。
例えば、トップレベルが「com」、「net」のドメイン名はVerisignが、「jp」のドメイン名は、JPRSが管理している。
これらの管理組織のことをレジストリと言う。
企業や個人などがドメイン名を利用するときには、これらのレジストリ配下の指定事業者に申請する。
すると、ドメイン名を利用できるようになる。

###DNSによる名前解決
TCP/IPの世界では、相手先を確認するのは、あくまでもIPアドレス。
ドメイン名でアクセスするときも最終的にIPアドレスに変換して接続する。
そのときに使われる仕組みがDNS（Domain Name System）。
DNSを用いて、あるドメイン名からそれに対応するIPアドレスを引き出すことを名前解決と呼ぶ。
IPアドレスとドメイン名を変換するのは、DNSサーバー。
DNSのシステムは、世界中に分散したDNSサーバー群で構成された、大きな分散型データベース。
それぞれのDNSサーバーは、自分が担当する範囲のIPアドレスとドメイン名の変換だけをする。
管轄外の名前解決が必要になったときは、他のDNSサーバーへと問い合わせを転送する。
DNSサーバーは、このようなドメイン名の名前解決をするため、DNSリゾルバ（resolver：解決の意味）と呼ばれることもある。
名前解決は、ルートDNSサーバーから始まり、トップレベルドメインのDNSサーバー、第２レベルのDNSサーバー、第３レベルのDNSサーバーというように、階層的に処理される。
このように階層的に処理することで、どのようなドメイン名であっても、最終的に変換先のIPアドレスがわかる。
ドメイン名は、DNSサーバーが解決することから、DNS名と呼ばれることもある。
また、サーバーやネットワーク機器など、通信可能なホストに名付けるために使われることから、ホスト名やDNSホスト名と呼ばれることもある。

###DNSサーバーを構成する
VPCには、VPN内の名前解決をするオプション機能があり、その機能を有効にするとインスタンスにDNS名が設定されるようになる。
DNS名には、パブリックDNSとプライベートDNSの２つがある。
前者は、インターネットから参照できるDNS名、後者はVPC内でしか参照できないDNS名。
※パブリックIPアドレスを割り当てていないときはパブリックDNSは空欄となり、プライベートDNSしか設定されない。

■Route５３サービスを用いて独自ドメイン名で運用する
独自ドメイン名を利用するには、まずレジストラと呼ばれるドメイン事業者から、利用したいドメイン名を取得する。
ドメイン名を取得したら、DNSサーバーを構成し、EC2インスタンスに向けるように構成する。
AWSでは、DNSサーバーを構成するためのRoute５３というサービスが提供されている。
Route５３サービスに、取得したドメイン名を設定すると、独自ドメイン名を利用できるようになる。
なお、Route５３を利用してドメイン名を取得することもできるようになっている。

###nslookupコマンドでDNSサーバーの動きを見る
いくつかのコマンドを使うと、DNSサーバーがどのように名前解決しているのかを知ることができる。
DNSの名前解決を調査する際に、最もよく使われているコマンドがnslookup。
nslookupコマンドは、WindowsやMac、そして多くのLinuxディストリビューションに標準でインストールされている。
※nslookupコマンドは昔ながらのコマンド。
最新のUNIX系の環境では、もっと詳細にDNSサーバーとのやりとりを確認できるdigコマンドを使うこともある。

・クライアントからnslookupする
まずは、WindowsやMacの環境で、どのように名前解決されているか確認。
プロバイダーを通じてインターネットに接続しているのであれば、Webブラウザを使ってアクセスするときにプロバイダーが提供しているDNSサーバーが名前解決している。