AWSの基本的なところをおさらい〜VPC/EC2の基本〜

#はじめに
AWSについての基本的なところをまとめたのでおさらいしていきます。
あと忘れない用に自分用としても使います。
引用文献　書籍　AWS〜基礎からのネットワーク＆サーバー構築　改訂第3版〜

#ネットワーク構築する
AWSではAmazonVPCを用てVPC領域を構築するとユーザー毎に隔離されたネットワークを構築することができます。
VPC=ユーザー毎に隔離されたネットワーク構築ができるようになるAWSが提供している機能の一つ。
インターネットで使われる「TCP/IP」というプロトコルでは通信先を特定するのに「IPアドレス」を用いる。これはいわゆる住所のようなもの。IPアドレスは32ビットで構成されている。
IPアドレスは「0.0.0.0」から「255.255.255.255」が範囲となる。
インターネットに接続する際に用いるIPアドレスは「パブリックIPアドレス」という。

VPCはそのまま使用するのではなく小さなCIDRブロックに分割して利用する。これを「サブネット」という。
・何故サブネットを分割するのか？
１．物理的に隔離することによって障害に強くなる
　２つにサブネットを分けた場合どちらかに障害が発生しても障害の影響が出にくい
２．セキュリティ上の理由
　それぞれに別のネットワーク設定ができるため、セキュリティを強化することができる。

#VPC領域にインターネット回線を引き込む
VPCで隔離された領域を作成したあとはサブネットをインターネットに接続する必要がある。
これには「インタネットゲートウェイ」を用いる。インタネットゲートウェイを用いて外部からのインターネット回線をVPC領域に引き込むイメージ。インターネットゲートウェイを作成し、VPCにアタッチすることで結び付けられる。

またネットワークにデータを流すためには「ルーティング情報」と呼ばれる設定が必要となる。ルートテーブルがないとデータの送信先が指定できないためインターネットの送受信ができない。
ルートテーブル＝宛先のIPアドレスの値がいくつの時はどのネットワークに流すべきかという設定のこと。
サブネットを作成した際にはデフォルトでルートテーブルが設定されている。このデフォルトの設定だとVPC領域のルーターにパケットを送信する設定が登録されているだけのため、これだけではインターネットと通信はできない。
そのため、転送先が何も設定されていない時のデフォルトの転送先を追加した、新たなルートテーブルを追加する必要がある。
新しいルートテーブルをサブネットとつなげるにはサブネットの関連付けから割当を行うことで保存することができる。

ここまでの設定で
「同VPC領域内の通信は内部でルーティング」「それ以外の通信はインタネットゲートウェイに転送する」という設定がなされたネットワーク構成のVPC領域を作成することができる。

#サーバーの構築をする
ここまでに作成したVPC領域に仮想サーバーを設置する。
仮想サーバーはAmazonEC2を用いて構築する。EC2で作成した仮想サーバーのことを「インスタンス」と呼ぶ。
ここではnginxをインストールし「WEBサーバー」として機能させる。
まずはインスタンスを作成していく。リージョンは「東京リージョン」となっていることを確認。
次にAMI（Amazon Machine Image）を選択する。今回は「Amazon Linux 2 AMI」を選択。これはAWSがサポート、管理をしているLinuxのイメージである。インスタンスタイプ（インスタンスのスペックのこと）は「t2.micro」というMicroインスタンスを選択する。これを作成したサブネットに設置するよう詳細設定を行う。
インターネットからこのインスタンスへアクセスできるようにするためパブリックIPアドレスを付与する。またプライベートIPアドレスも指定。ストレージはデフォルトのものを使用する。またインスタンスに対してセキュリティグループの設定を行う。

ここまで設定が終了したらキーペアを作成しダウンロードする。ダウンロードしたファイルは後でダウンロードし直すことはできないため注意が必要。これでインスタンスの作成が終了する。

#SSHで接続する
起動したインスタンスにインターネットからログインをして操作をする。この操作にはSSHというプロトコルを用いる。
パブリックIPアドレスを用いてSSHで接続をするにはMACであればターミナルが必要となる。
MACの場合、まずターミナルを起動
接続のコマンドを入力する。

```
$ ssh -i my-key.pem ec2-user@________→ここにIPアドレスを入力
＃my-keyはキーペア名、ec2-userは[Amazon Linux 2 AMI]で設定されているデフォルトのユーザー名
↓
＃ここでWARNING: UNPROTECTED PRIVATE KEY FILE!と出た場合以下を入力
$ chomd 400 my-key.pem
↓
＃初回の接続に限りThe authenticity of host〜〜とメッセージが出るので「yes」と入力
これで接続が完了する。各種コマンドが入力できる状態になる。

```
ターミナルでSSH接続する際は接続先として「相手先のIPアドレス」を入力した。このIPアドレスについての情報交換を行う際にインターネットではルーター同士が通信してルートテーブルの情報のやり取りを行い、自動的に更新できるようにしている。これはルーティングプロトコルと呼ばれる仕組みで実現されており、大きく分けて「EGP」と「IGP」という２つの種別から成り立っている。
①EGP
ISP（インターネットサービス・プロバイダー）やAWSなどの「ある程度大きなネットワーク」はそのネットワークを管理する「AS番号」という番号を持っている。EGPではこのAS番号をやりとりして「どのネットワークの先に、どのネットワークが接続されているかを」大まかにやり取りする。

②IGP
上記の①の内部のルーター同士でルートテーブルの情報のやり取りを行う。つまりプロバイダーやAWSの内部での詳細なやり取りに使われる。

この２つの仕組みによって相手のIPアドレスさえわかればパケットを届けることができる。
ターミナルを使用してSSHで接続するとサーバー内でユーザーからのコマンドを処理するソフトが働く。このプログラムを「sshd」という。

TCP/IPで通信するサーバーなどの機器には「他のコンピュータとデータを送受信するためのデータの出入り口」が用意されており、これを「port」という。ポートは0から65535まである。ポートによって、１つのIPアドレスに対して複数のApplicationが同時に通信できる。

ポートには「相手にデータが届いてことを保証するTCP」と「確認せずに送信するUDP」の２種類がある。
どのポート番号でどのプログラムが待ち受けているのかはlsofコマンドを使って調べられる。SSHで接続したら

```
$ sudo lsof -i -n -P
＃と入力する。最後のPは大文字である点に注意。
この結果のうち「LISTEN」と書かれているのが他のコンピュータからの待受けをしているポート
「ESTABLISHED」と書かれているのが相手と現在通信中のポートを示す。
```

#webサーバー（nginx）のインストール
ここでは構築したサーバーにWebサーバーソフトをインストールすることでWebサーバーとしてインターネットに公開する。
ウェブサーバーソフトであるnginxをインストールすることでWEBブラウザからの要求を受け取り、サーバー上のコンテンツを返したり、サーバー上でWEBアプリケーションを実行したりできるようになる。
書籍ではApacheをインストールする内容となっていたがここでは練習もかねてnginxをインストールすることとした。
しかし

```
$sudo yum install nginx
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
パッケージ nginx は利用できません。
エラー: 何もしません
nginx is available in Amazon Linux Extra topic "nginx1.12"or"nginx1.00"

To use, run
# sudo amazon-linux-extras install nginx1.12

Learn more at
https://aws.amazon.com/amazon-linux-2/faqs/#Amazon_Linux_Extras
```
このエラーがでてしまいインストールできなかった。どうやら自分が指定したAMI（Amazon Linux 2）ではyumでNginxが提供されてなかったらしい。
よって上記にも書かれているようにamazon-linux-extrasにて再度インストールする。

```
$ sudo amazon-linux-extras install nginx1.12
```

これによりインストールが完了する。

```
$ nginx -v
nginx version: nginx/1.12.2
```
成功。
プロセスを確認するには

```
$ ps -ax
これで確認ができる。
$ sudo lsof -i -n -P
ここから「TCP*80」の記載を発見することができる。ここからnginxがポート番号８０で待ち受けている事がわかる。
```

#ファイヤウォールを設定する
nginxをインストールし起動させたため、このサーバーはWEBサーバーとして機能しているはずだがこのままだとまだ、アクセスすることはできない。それはポート８０番がファイヤウォールによってブロックされているからである。
EC2設定からセキュリティグループでファイヤウォールの機能の設定を行える。
ここでポートを開くことによってアクセスが成功する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599304/d3c3a578-f9be-a7aa-ed5c-c8a11b0b3980.png)

成功した場合上記の画面がでる。
今日はここまで。