AWSでネットワーク入門

# はじめに

（学習メモです。）
私のように、令和になってから独学でプログラミングを学び始める人間にとって、圧倒的に不足しがち（だと思う）のはいわゆる「インフラ関係」の知識です。



そこで、今回の目的は、

- **AWSを実際に動かしながら、ネットワークの構築やそれに関わるサーバー、データベースの接続など、一通り全体を把握してみること**

です。


## 謝辞

今回の学習に当たってはudemyの*「[AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得](https://www.udemy.com/course/aws-and-infra/)」*が非常に参考になりました。

初学者の方に本当におすすめです。価格もボリュームの割に安価ですので、ぜひご覧ください。


加えて*AWS公式「AWSome Day」*の動画もおすすめです。



# 目標の成果物

- 「AWS：VPC」を利用し、クラウド上に仮想ネットワークを構築する
- 仮想ネットワーク上に「AWS：EC2」を利用しサーバーを立ち上げる
- 仮想ネットワーク上に「AWS：RDS」を利用しデータベースを立ち上げる
- EC2インスタンスにでWordPressサイトをホストする



# AWSマネジメントコンソールにアクセス

**====手順=====**

- AWSにログイン
- リージョンの確認（今回は「東京」に設定）


**====用語=====**

- リージョン：AWSのデータセンターがある地域（東京リージョン...など）
- アベイラビリティゾーン（AZ）：各リージョン内にある、個別のデータセンターのようなもの

各リージョン内には複数のAZが存在しており、物理的に離れた場所にある。
これによって、仮に1つのAZに障害が起きても、別のAZが稼働していることでサービスの可用性を担保している




# VPCの作成

VPCとは、「Amazon Virtual Private Cloud」の略です。
Virtual Private Cloud (VPC) は、AWS アカウント専用の仮想ネットワークで、つまり自分専用のネットワークを作るサービスです。


**====手順=====**

メニューから「VPC」-> 「VPCの作成」
（すでに1つのVPCがデフォルトで作成されているが無視する）


**====用語=====**

- 名前タグ: VPCの名前
- IPv4 CIDR ブロック: VPCのIPアドレス (今回は、10.0.0.0/16に設定)[プライベートIPアドレス](https://www.pc-master.jp/internet/private-ip-address.html)の中から設定する

- テナンシー： 「デフォルト」でOK

上記設定で「VPCの作成」する



# サブネットの作成

サブネットは、VPC の IP アドレスの範囲です。

VPCはリージョン全体に対して作成され、サブネットはAZに対して作成されます。

つまり、サブネットを作成すると言うことは、
先ほど作成したVPC内の、個別のAZに対してネットワークを構築することになります。


##「パブリックサブネット」と「プライベートサブネット」を作成する

**====用語=====**

パブリックサブネット：インターネットからアクセスできる
プライベートサブネット：インターネットからアクセスできない


### パブリックサブネットの作成

**====手順=====**

メニューから「サブネット」-> 「サブネットの作成」



**====用語=====**

- 名前タグ: サブネットの名前（設置するアベイラビリティゾーンも名前に含めておくとわかりやすい）

- VPC: このVPC内にサブネットが作成される（先ほど作成したVPCを選択）

- アベイラビリティーゾーン：このAZ内にサブネットが作成される

- IPv4 CIDR ブロック：VPC内の任意のIPアドレス（今回は10.0.10.0/24を設定）


上記設定で「VPCの作成」する


### プライベートサブネットの作成

**====手順=====**

メニューから「サブネット」-> 「サブネットの作成」


**====用語=====**

- 名前タグ: サブネットの名前（設置するアベイラビリティゾーンも名前に含めておくとわかりやすい）

- VPC: このVPC内にサブネットが作成される（先ほど作成したVPCを選択）

- アベイラビリティーゾーン：このAZ内にサブネットが作成される（今回はパブリックサブネットと同じAZに設定）

- IPv4 CIDR ブロック：VPC内の任意のIPアドレス（今回は10.0.20.0/24を設定）



# ルーティングの設定

先ほど「パブリックサブネットを作成する」と手順を踏みましたが、このサブネットはまだインターネットに接続されていません。そのためにルーティングを設定する必要があります。

VPCやサブネットなど、ネットワークには固有のIPアドレスがあり、ルーティングはそのIPアドレスの接続先の設定です。

ルーターはIPアドレスの行き先を管理する仕組みです。
VPCやサブネットは「ルートテーブル」を使用して、IPアドレスの接続先を調べます。


今回は、パブリックサブネットがインターネットに接続できるようにします。
つまり、パブリックサブネットに対してルーティングを設定することになります。



## インターネットゲートウェイの作成

パブリックサブネットのルーティングに「インターネットゲートウェイ」を追加することで、インターネットに接続できるようにしていきます。

インターネットゲートウェイは、あなたのVPCとインターネットの通信を可能にするためのコンポーネント（部品）です。



**====手順=====**

メニューから「インターネットゲートウェイ」-> 「インターネットゲートウェイの作成」

作成しただけでは、「detached」（どこにも接続されていない）なので、

「アクション」から、VPCにアタッチする




## ルートテーブルの作成

VPCでは「ルートテーブル」を使用して、IPアドレスの接続先を設定します。
ここで、各IPアドレスの接続先を設定する必要があります。

先ほど作成した「インターネットゲートウェイ」は、いわばあなたのネットワーク（VPC）の玄関になります。
インターネットゲートウェイにアクセスできるよう、ルートテーブルの設定をします。


**====手順=====**

メニューから「ルートテーブル」-> 「ルートテーブルの作成」


**====用語=====**

- 名前タグ：ルートテーブルの名前

- VPC: ルートテーブルを作成するVPC



--- 
作成されたルートテーブルは、指定したVPC内に存在しているだけで、まだどの接続先も設定されていません。
ここにサブネットを関連付けします。

**ルートテーブルは、サブネットかVPCに関連付けして使います**

**====手順=====**

タブメニュー「サブネットの関連付け」 -> 「サブネットの関連付けの編集」
先ほど作成したパブリックサブネットを関連付ける



---

さらに、デフォルトルートをインターネットゲートウェイに設定します。

現状、「ルートテーブルに存在しない送信先」へのアクセスは、ターゲットが存在しないため破棄されてしまっています。

これを、インターネットゲートウェイがターゲットになるよう設定します。


**====手順=====**

タブメニュー「ルート」 -> 「ルートの編集」 -> 「ルートの追加」



### デフォルトルートとは

0.0.0.0/0 のこと。
これはネットワーク上のどのルートにも一致しないIPアドレスであり、

つまり「あらゆるIPアドレス」ということです。


**====用語=====**

- 送信先：0.0.0.0/0

- ターゲット：先ほど作成したインターネットゲートウェイ

「ルートの保存」をする


ルートテーブル内の送信先に一致しない、全てのIPアドレスへの通信は、まずインターネットゲートウェイへと向かうようになりました。

これでパブリックサブネットからインターネットに接続できるようになっています。


# EC2の作成

EC2（仮想マシン）をパブリックサブネット内に設置します。
その後、OSとしてApacheをインストールし、Webサーバーとして使用します。


**====用語=====**

- インスタンス：EC2から立てられたサーバーのこと

- AMI: サーバーのテンプレート、OSのイメージ

- インスタンスタイプ：サーバーのスペック

- ストレージ：EBSと「インスタンスストア」の２種から選べる

- EBS：外部ストレージのようにマウントして使うので、他のインスタンスに移動できる、高可用性。

- インスタンスストア:付け替えできない。EC2インスタンスにひっついているので、EC2をstop/Tarminateするとクリアされてしまう


**====手順=====**

メニュー「インスタンス」 -> 「インスタンスの作成」

Amazon Linux 2 AMI (HVM), SSD Volume Type を選択

インスタンスタイプ：t2.micro（無料）を選択

「インスタンス詳細の設定」へ


## EC2を設置するネットワークを先ほど作成したVPC内のパブリックサブネットに設定する

**====手順=====**

自動割り当てパブリック IP：有効にすることで、インターネットから接続するためのパブリックIPアドレスが自動で割り当てられる

キャパシティーの予約：多量のアクセスがあった場合に、追加キャパシティが必要かどうか（今回はなし）


## ネットワークインターフェイスの設定

このEC2インスタンスに、パブリックIPアドレスだけでなく、プライベートIPアドレスも設定することができる。

サブネットに、今回作成したサブネットを設定（）し、そこでのプライベートIPアドレスを設定する

プライマリIPに「10.0.10.10」を設定する（サブネットのIPの範囲の中にあることを確認！）



## ストレージの追加

とりあえずこだわりないので汎用SSDでOK


## タグの追加

キーに「Name」、値に任意の名前を設定する


## セキュリティグループの設定

セキュリティグループ名：任意の名前

SSHでこのEC2に接続できるIPアドレスを指定する（今回は、どのIPからでも接続できるよう「0.0.0.0/0」デフォルトルートのまま続行する）


## 最終確認画面 -> 起動

キーペアの設定

SSH接続するための、SSHキーを設定する

「新しいキーペアの作成」する

キーペア（.pemファイル）は必ずダウンロードする




# SSHでサーバーにログインする

作成したVPC内のEC2に、SSHでログインする。

SSHはコンピュータを安全に遠隔操作するための仕組みです。

EC2インスタンスを遠隔操作して、最終的にはApache（マシンをWebサーバーとして使用するためのOS）のインストールをします。


**====用語=====**

- SSHクライアント：自分のローカルのコンピュータ（接続元）
- SSHサーバー：接続先のサーバー


## 公開鍵認証とは

SSHログインする時の認証は公開鍵認証によって行う。

**====用語=====**

- 公開鍵：サーバーが持っている暗号鍵🔒
- 秘密鍵：自分が使用する暗号鍵🔑


## 実際にSSHでEC2に接続する


ターミナルから以下のコマンドで、秘密鍵（`.pem`ファイル）が使用できるよう権限を変更する

```bash
$ chmod 600 .pemファイルへのパス
```


EC2のダッシュボードから、割り当てられたIPv4パブリックIPを確認し、クリップボードにコピーする

ターミナルから`ssh -i`コマンドを実行。以下は例。

```bash
$ ssh -i ~/Documents/ssh-key/yu-demy-sshkey.pem ec2-user@18.176.57.59
```

無事ログインできると、以下のようにロゴが表示される

```
       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
```


EC2にSSH接続した状態で、以下のコマンドを実行すると、ポートの一覧が表示される

```bash
$ sudo lsof -i -n -P
```

※`sudo（スードゥ）`は「ルート権限で実行する」コマンドです。


## EC2インスタンスにApacheをインストールする

まずはEC2インスタンスのライブラリをアップデートする

```
$ sudo yum update -y
```


Apacheのインストール

```bash
$ sudo yum -y install httpd # Apacheをインストール
```

Apache（OS）の起動

インストールしただけでは動いていないので、Apacheを起動させます。

```bash
$ sudo systemctl start httpd.service
```

ちゃんと起動したかどうか、状態の確認

```bash
$ sudo systemctl status httpd.service
```

プロセスの表示コマンドでも確認できる


```bash
$ ps -axu
```

表示結果の中でApache（httpd）だけ検索して表示させる


```bash
$ ps -axu | grep httpd
```

真ん中の縦棒は、「パイプ」と呼ばれ、左側のoutputを右側のコマンドに渡す


Apacheが自動起動するように設定する

```bash
$ sudo systemctl enable httpd.service
```



# ファイアウォールを設定する

ファイアウォール：セキュリテイのため、アクセスできる通信を限定します。


## EC2のセキュリティグループを設定する

EC2ではファイアウォールとして、「セキュリティグループ」を設定します。
デフォルトの設定で、アクセスが制限された状態になっているので、
今回は、アクセスを許可する作業をします。


**====手順=====**

作成したEC2のダッシュボードから「セキュリティグループ（EC2作成時につけた名前）」のリンクにアクセスする

タブから「インバウンドルール」を確認すると、

- ポート22番が開いていること
- さらに「0.0.0.0/0」つまりどのIPアドレスからでもアクセス可能になっていること

がわかる


### インバウンドルールを編集する

ブラウザからアクセスできるよう、Httpアクセスを許可するように設定する


**====手順=====**

「インバウンドルールの編集」 -> 「ルールの追加」


- type: http
- source: Anywhare（任意の場所）

これで「Anywhare」つまりどこからでもHttpアクセスを許可した状態になった。

ブラウザからEC2のパブリックIPにアクセスすると、Apacheのテストページが表示される



# ElasticIPでIPアドレスを固定する

EC2のパブリックIPアドレスは起動するたびに新しく割り振られます。

ElasticIPアドレスを使用することで、IPアドレスを固定することができます。

ただし、課金の対象になるのでインスタンスを使用しない時には「ElasticIPアドレスの解放」をしておくようにします。


**====手順=====**

EC2ダッシュボードから「ElasticIP」 -> 「Elastic IPアドレスの割り当て」

これで、固定アドレスを確保できる


Elastic IPアドレスがダッシュボードに表示されたら、「アクション」から「ElasticIPアドレスの関連付け」を選択肢、作成したEC2インスタンスに関連付ける


これで、発行したElastic IPアドレスがEC2インスタンスに関連づけられ、ブラウザからアクセスするとApacheのテストページが表示される


## Elastic IPアドレスの解放

インスタンスを停止した時には、課金されないようにElasticIPの解放をしておく方が良い

インスタンスを停止するなど、使用していない状態から

「アクション」->「Elastic IP アドレスの関連付けの解除」

ElasticIPのダッシュボードから、当該のIPアドレスを「解放」する



# RDSの作成

Amazon Relational Database Service (Amazon RDS) はAWSが提供するデータベースサービスの一つです。

1番の特徴はその高可用性で、Multi-AZ（マルチAZ）と呼ばれる、複数AZに設置されるバックアップです。

RDSは複数のAZに設置することができ、それによって１つのAZで仮に障害が起きても、自動で別のAZにあるバックアップに運用を切り替えることができます。

また、メインとバックアップは常に完全に同期されているので、切り替えのタイミングでデータにズレが発生しません。

この高可用性を活かすために、今回は2つのAZにまたがる形でRDSを運用していきます。



## もう一つプライベートサブネットを作成

先ほど作成したプライベートサブネットに加えて、今回もう一つ、今度は別のAZにサブネットを作成します。
これで、2つのAZに1つづつ、合計2つのプライベートサブネットを作成することになります。

2つのサブネットに1つづつ、メインとバックアップのRDSを設置し、可用性の高い構成にします。
なお、このバックアップのことを**Slave**と呼びます。


## RDSの作成準備

今回はセキュリティのため、インターネットからはデータベースにアクセスできない構成にします。
データベースへのアクセスは、EC2からのみに限定します。

まずは、RDS用にEC2でセキュリテイグループを新たに設定します。


### セキュリティグループの設定

EC2のダッシュボードから、「セキュリティグループの作成」

**====用語=====**

- セキュリティグループ名：任意の名前
- 説明：任意の説明文
- VPC：先ほど作成したVPCを選択

#### セキュリティグループのルールを設定

今回はMySQLでDBへのアクセスを許可したいと思います。

そのため、インバウンド（受け付ける入力）のルールをまずは追加します。
セキュリティグループをインバウンドルールのソースから許可することで、そのセキュリティグループ内のインスタンスからアクセスできるようになります。
 
**====用語=====**

- タイプ：MySQL/Aurora
- ソース：先ほど作った、接続元のEC2が存在するセキュリティグループ



### サブネットグループの作成

マルチAZで、複数のサブネットにまたがってRDSを設置するので、それらのサブネットをまずグルーピングしておきます。



**====手順=====**

コンソールからRDSダッシュボードへ
メニューから「サブネットグループ」->「DBサブネットグループの作成」


**====用語=====**

- 名前：任意の名前
- 説明：任意の説明文
- VPC：作成したVPC
- サブネットの追加：作成した2つのプライベートサブネットを追加する



### パラメータグループの作成

DBの設定は直接編集できず、このパラメータグループで設定を行います。


**====手順=====**

メニューから「パラメータグループ」->「パラメータグループの作成」


**====用語=====**

- パラメータグループファミリー：使用したいDBのエンジンを指定する
- グループ名：任意の名前
- 説明：任意の説明文


作成したパラメータグループの「アクション」->「編集」から設定を変更できる



### オプショングループの作成

DBの機能部分のオプション設定を行う


**====手順=====**

メニューから「オプショングループ」->「オプショングループの作成」


**====用語=====**

- 名前：任意の名前
- 説明：任意の説明文
- エンジン：任意のエンジン
- エンジンのバージョン：エンジンのバーション


 

## RDSを作成

**====手順=====**

「RDS」のメニューから「データベース」 -> 「データベースの作成」



**====用語=====**

- 先ほど作成したDB設定にあわせた内容を選択する。

- DBのIDやパスワードは、ワードプレスの初期設定にも必要になる値になる。
- DBインスタンスサイズ（「インスタンスサイズ」とはスペックのこと）は練習で作成するなら一番安い「バースト可能クラス」「t2micro」を選択
- マルチ AZ 配置：今回は「スタンバイインスタンスを作成しないでください」を選択
- 接続：VPCとサブネットグループを設定する
- パブリックアクセス可能：DBへは同一VPC内のEC2からのみアクセスできるようにしたいので、パブリックアクセスは不可にする
- 追加設定：先ほど作成した「DB パラメータグループ」と「オプショングループ」を設定する

その他の各項目を設定し、「データベースの作成」

これで、RDSの作成が完了です。



# RDSに EC2から接続する

**====手順=====**

- EC2のダッシュボードからEC2インスタンスのIPアドレスを確認しておく
- ターミナルからEC2インスタンスにSSH接続する


EC2にMySQLをインストールする

```
$ sudo yum -y install mysql
```

MySQLでデータベースに接続する

RDSのダッシュボードからエンドポイントを確認しておく

```bash
$ mysql -h {エンドポイント} -u {データベースのユーザID} -p
```


# RDSにワードプレス用のデータベースを作成する

**====手順=====**

RDSにMySQLで接続する

データベースを作成する

```sql
CREATE DATABASE DBの名前 DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
```

作成されたDBを確認する

```sql
SHOW DATABASES
```

ワードプレス用のユーザーを作成する

```sql
CREATE USER 'ユーザ名ー'@'%' IDENTIFIED BY 'password';
```

作成したユーザーに権限を付与する

```sql
GRANT ALL ON DBの名前.* TO 'ユーザー名'@'%';
```

変更した権限の設定を反映させる

```sql
FLUSH PRIVILEGES
```


# ワードプレスをEC2にインストールする

**====手順=====**

EC2インスタンスにphpをインストールする

```bash
$ sudo amazon-linux-extras install -y php7.2
```

関連ライブラリのインストール

```bash
$ sudo yum install -y php php-mbstring
```


ワードプレスのダウンロード

```bash
$ wget https://ja.wordpress.org/latest-ja.tar.gz
```

ダウンロードされた圧縮ファイルを解凍する

```bash
$ tar xzvf latest-ja.tar.gz
```

解凍した`wordpress`ディレクトリに移動して
全てのファイルをApacheの参照するルートにコピーする

```bash
$ cd wordpress
$ sudo cp -r * /var/www/html/
```

ファイルの所有権をApacheにする（Apacheがwordpressを参照できるようにする）

```bash
$ sudo chown apache:apache /var/www/html/ -R
```

apacheを再起動して変更を適用する

```bash
$ sudo systemctl restart httpd.service
```


# Wordpressの設定をする

EC2のIPアドレスにアクセスし、Wordpressの初期設定画面が表示される


ホスト名は、RDSのエンドポイントを入力する

あとは、通常のWordPressの設定を進める


# 完成

- VPC（自身のネットワーク）を作成: リージョン
- その中に複数のサブネットを作成: 複数のAZ
- ファイアウォール（セキュリティゾーン）を設定：サブネット
- WebサーバーとなるEC2を作成：パブリックサブネット
- データベースとなるRDSを作成：プライベートサブネット