スケーラブルWebシステム構築

# はじめに
EC2やRDSを使用した基本的なスケーラブルWebシステム構築をハンズオン形式で行います。

# 完成イメージ
![スクリーンショット 2023-12-24 190608.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/8e894efd-9bf9-0826-3485-abb52d8454c6.png)

# アジェンダ
Step1. VPCの作成
Step2. EC2の作成
Step3. RDSの作成
Step4. ELBの作成
Step5. WordPressの初期設定
Step6. AMIの作成と2つ目のEC2インスタンスを作成
Step7. RDSのマルチAZ配置

# Step1. VPCの作成
アベイラビリティゾーン1aと1cに、パブリックサブネットとプライベートアブネットを1つずつ作成します。
## VPCを作成
VPCのコンソール画面に遷移し、`VPCを作成`を押下します。
### VPCの設定
#### 作成するリソース
`VPCなど`を選択します。
#### 名前タグの自動生成
##### 自動生成
・自動生成にチェックを入れ、`handson-user1`と入力します。
##### IPv4 CIDR ブロック
`10.0.0.0/16`のままにしておきます。
##### IPv6 CIDR ブロック
`IPv6 CIDR ブロックなし`のままにしておきます。
##### テナンシー
`デフォルト`のままにしておきます。
#### アベイラビリティゾーン (AZ) の数
`2`のままにしておきます。
`▼AZのカスタマイズ`を押下します。
##### 第 1 アベイラビリティーゾーン
`ap-northeast-1a`になっていることを確認します。
##### 第 ２ アベイラビリティーゾーン
`ap-northeast-1c`になっていることを確認します。
#### パブリックサブネットの数
`2`のままにしておきます。
#### プライベートサブネットの数
`2`のままにしておきます。
`▼サブネット CIDR ブロックをカスタマイズ`を押下します。
##### ap-northeast-1a のパブリックサブネット CIDR ブロック
`10.0.0.0/24`に変更します。
##### ap-northeast-1c のパブリックサブネット CIDR ブロック のパブリックサブネット CIDR ブロック
`10.0.1.0/24`に変更します。
##### ap-northeast-1a のプライベートサブネット CIDR ブロック
`10.0.2.0/24`に変更します。
##### ap-northeast-1c のプライベートサブネット CIDR ブロック
`10.0.3.0/24`に変更します。
#### NAT ゲートウェイ ($)
`なし`のままにしておきます。
##### VPC エンドポイント
`なし`のままにしておきます。
#### DNS オプション
`DNS ホスト名を有効化`にチェックが入っていることを確認します。
`DNS 解決を有効化`にチェックが入っていることを確認します。
※`追加のタグ`は今回触らないのでそのままでOKです。

ここまで入力出来たら`VPCを作成`を押下します。

## VPC・サブネットの名称変更
### VPC名の編集
左カラムから`お使いのVPC`を押下します。
一覧画面の`handson-user1-vpc`にカーソルを合わせると、ペンシルアイコンが表示されるので、それを押下します。
`handson-user1`に修正し、`保存`を押下します。

![スクリーンショット 2023-12-23 183927.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/283a14e2-ad55-16f4-1cf8-b5b6d0da734b.png)
### サブネット名の編集
左カラムから`サブネット`を押下します。
一覧画面の`handson-user1-subnet-public1-ap-northeast-1a`にカーソルを合わせると、ペンシルアイコンが表示されるので、それを押下します。

`パブリックサブネット-1a`に修正し、`保存`を押下します。

![スクリーンショット 2023-12-23 190012.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/06265de4-1c90-22c3-5281-6b0a0e9ed7e7.png)
同じ要領で他３つのサブネットの名称も変更します。
`handson-user1-subnet-public2-ap-northeast-1c`　→　`パブリックサブネット-1c`
`handson-user1-subnet-private1-ap-northeast-1a
`　→　`プライベートサブネット-1a`
`handson-user1-subnet-private2-ap-northeast-1c
`　→　`プライベートサブネット-1c`

ここまでで、VPCの作成が完了しました。

# Step2. EC2の作成
EC2インスタンスをパブリックサブネット-1a上に作成します。
## EC2インスタンスの作成
EC2のコンソール画面に遷移します。
`インスタンスを起動`を押下します。
### インスタンスを起動
#### 名前とタグ
##### 名前
`webserver#1-user1`と入力します。
#### Application and OS Images (Amazon Machine Image) 
##### Amazon マシンイメージ (AMI)
`Amazon Linux 2`を選択します。
※デフォルトではAmazon Linux 2023になっているので注意
#### インスタンスタイプ
##### インスタンスタイプ 
`t2.micro`が選択されていることを確認します。
#### キーペア (ログイン) 
##### キーペア名 - 必須
今回は不要であるため、`キーペアなしで続行`を選択します。
#### ネットワーク設定
`編集`を押下します。
##### VPC 
`(handson-user1)`と書かれているVPCを選択します。
##### サブネット
パブリックサブネット-1aに作成するため、`パブリックサブネット-1a`を選択します。
##### パブリック IP の自動割り当て
`有効化`を選択します。
##### ファイアウォール (セキュリティグループ)
`セキュリティグループを作成`を選択します。
##### セキュリティグループ名
`web-user1`を入力します。
##### 説明
`web-user1`を入力します。
##### インバウンドセキュリティグループのルール
SSHのルールはデフォルトで設定されています。
![スクリーンショット 2023-12-23 193243.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/34e0eae9-9290-b846-ec6e-7658f1463957.png)
HTTPアクセスを許可するルールを追加します。
`セキュリティグループルールの追加`を押下し、下記画像のように編集します。
![スクリーンショット 2023-12-23 193450.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/d5da660f-a0eb-2b85-d5d8-c6ab8201b12e.png)

##### ストレージを設定
デフォルトのまま進みます。

#### 高度な詳細 
ユーザーデータの項目以外はデフォルトのまま進みます。
##### ユーザーデータ
ユーザーデータとは、EC2起動時に実行されるスクリプトのことです。
ここにWordPressの初期設定を行うスクリプトを行うことで、自動的にインストールと立ち上げを行うことができます。
下記をコピーしてユーザーデータ欄に貼り付けます。
```
#!/bin/bash

yum -y update
yum -y install php httpd mysql

PHP_VERSION=`php -v | head -n 1 | awk '{print $2}' | awk -F "." '{print $1}'`
while [  ${PHP_VERSION} -ne 7 ]
do
amazon-linux-extras install php7.4 -y
PHP_VERSION=`php -v | head -n 1 | awk '{print $2}' | awk -F "." '{print $1}'`
done

yum -y install php-mbstring php-xml

wget http://ja.wordpress.org/latest-ja.tar.gz -P /tmp/
tar zxvf /tmp/latest-ja.tar.gz -C /tmp
cp -r /tmp/wordpress/* /var/www/html/
chown apache:apache -R /var/www/html

systemctl enable httpd.service
systemctl start httpd.service
```

ここまでできたら`インスタンスを起動`を押下します。

## WordPressにアクセス
EC2インスタンスの一覧画面に移動します。
`webserver#1-user1`にチェックを入れると詳細が表示されます。
パブリック IPv4 アドレスをコピーし、新規タブに貼り付けます。
![スクリーンショット 2023-12-23 194603.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/de7420ed-e066-4403-2472-4c920c62ddcd.png)
※オープンアドレスのリンクを押下でもOKです。

画像のように表示されれば成功です。
![スクリーンショット 2023-12-23 194902.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/30a7051b-edf5-b011-28a5-6d8b559bda44.png)

これで、EC2が稼働していること、WordPressが稼働していることが確認できました。

# Step3. RDSの作成
RDSのDBインスタンスをパブリックサブネット-1a上に作成します。
## 事前準備①
### DB用のセキュリティグループの作成
EC2コンソール画面の左カラムの`セキュリティグループ`を選択します。
`セキュリティグループの作成`を押下します。
#### 基本的な詳細
##### セキュリティグループ名
`db-user1`と入力します。
##### 説明
`RDS for MySQL`と入力します。
##### VPC
作成した`handson-user1`のVPCを選択します。
#### インバウンドルール
`ルールの追加`を押下し、画像のように入力します。
ソースに関しては、Webサーバにアタッチされているセキュリティグループからのアクセスを受け入れるという設定をします。
※ソースに「web」と入力すれば表示されます。
![スクリーンショット 2023-12-23 195944.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/ce80d2b7-c910-4f80-9d47-2a2746ddfa97.png)
#### アウトバウンドルール
デフォルトのまま進みます。

`セキュリティグループの作成`を押下します。

## 事前準備②
### サブネットグループの作成
RDSのコンソール画面に遷移し、左カラムの`サブネットグループ`を押下します。
`DBサブネットグルプの作成`を押下します。
![スクリーンショット 2023-12-23 200404.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/3d7f95dc-b40e-e098-d0e3-5cf92ff20651.png)
#### サブネットグループの詳細
##### 名前
`db-subnet-user1`と入力します。
##### 説明
`RDS for MySQL`と入力します。
##### VPC
作成した`handson-user1`のVPCを選択します。

#### サブネットを追加
##### アベイラビリティーゾーン
`ap-northeast-1a`と`ap-northeast-1c`を選択します。
##### サブネット
ap-northeast-1cは末尾が`10.0.3.0/24`のものを選択します。
ap-northeast-1aは末尾が`10.0.2.0/24`のものを選択します。

ここまでできたら`作成`を押下します。

## RDS　DBインスタンスの作成
### データベースの作成
左カラムの`データベース`を押下します。
`データベースの作成`を押下します。
![スクリーンショット 2023-12-23 201148.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/7210b286-189d-d036-69c3-66d4d51c3472.png)
#### データベース作成方法を選択
`標準作成`を選択します。
#### エンジンのオプション
##### エンジンのタイプ
`MySQL`を選択します。
##### テンプレート
`無料利用枠`を選択します。
##### 可用性と耐久性
デフォルトのまま進みます。
##### 設定
##### DB インスタンス識別子
`rds-user1`と入力します。
##### マスターユーザー名
`admin`のまま進みます。
##### マスターパスワード
任意のパスワードを入力します。
例：amazon1234
※後で使いますので、絶対にメモしておいてください。

#### インスタンスの設定、ストレージ
デフォルトのまま進みます。

#### 接続
##### Virtual Private Cloud (VPC)
`handson-user1`を選択します。
##### DB サブネットグループ
先ほど作成したサブネットグループ（`db-subnet-user1`）を選択します。
##### パブリックアクセス
`なし`が選択されていることを確認します。
##### VPC セキュリティグループ (ファイアウォール)
`既存の選択`が選択されていることを確認します。
##### 既存の VPC セキュリティグループ
`db-user1`を選択し、`default`は削除します。
##### アベイラビリティーゾーン
`ap-northeast-1a`を選択します。
#### データベース認証
デフォルトのまま進みます。
#### モニタリング
`拡張モニタリングの有効化`が選択されていないことを確認します。
#### 追加設定
押下すると、項目が表示されます。
##### 最初のデータベース名
`wordpress`と入力します。
##### バックアップ
`自動バックアップを有効にします`のチェックを外します。

残りの項目はデフォルトのまま進み、`データベースの作成`を押下します。

データベースが正常に作成されると、一覧画面が移ります。
ここで、作成した`rds-user1`を選択します。
後で使用しますので、下記エンドポイントのURLをメモしておきます。
![スクリーンショット 2023-12-23 203652.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/7a9ef729-2825-82db-2bb3-3c43c3ca01fb.png)

# Step4. ELBの作成
## 事前準備①
### ELB用のセキュリティグループの作成
EC2コンソール画面の左カラムの`セキュリティグループ`を選択します。
`セキュリティグループの作成`を押下します。
#### 基本的な詳細
##### セキュリティグループ名
`elb-user1`と入力します。
##### 説明
`elb-user1`と入力します。
##### VPC
作成した`handson-user1`のVPCを選択します。
#### インバウンドルール
`ルールの追加`を押下し、画像のように入力します。
ソースに関しては、すべてのIPv4アドレスからのアクセスを受け入れるという設定をします。
![スクリーンショット 2023-12-24 091608.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/9013625d-1de4-d8fc-afaf-42c58da679dd.png)

#### アウトバウンドルール
デフォルトのまま進みます。

`セキュリティグループの作成`を押下します。

## 事前準備②
### ターゲットグループの作成
EC2のコンソール画面左カラムの`ターゲットグループ`を押下します。
![スクリーンショット 2023-12-24 092018.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/c6e4e133-bbc8-aa90-5233-a31fd979f8f2.png)
#### 基本的な設定
##### ターゲットタイプの選択
`インスタンス`を選択します。
##### ターゲットグループ名
`target-user1`を選択します。
##### プロトコル : ポート,プロトコルバージョン,IPアドレスタイプ
デフォルトのまま進みます。
##### VPC
`handson-user1`を選択します。
#### ヘルスチェック
##### ヘルスチェックプロトコル
`HTTP`を選択します。
##### ヘルスチェックパス
下記を入力します。
```
/wp-includes/images/blank.gif
```

ここまでできたら`次へ`を押下します。

#### ターゲットを登録
##### 使用可能なインスタンス 
`webserver#1-user1`にチェックを入れたら、
`保留中として以下を含める`を押下します。
![スクリーンショット 2023-12-24 092848.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/706f54be-97a4-7c98-cf49-92bd2dcac239.png)
すると、ターゲットを確認の項目に、チェックしたEC2が追加されます。

ここまでできたら`ターゲットグループの作成`を押下します。

## ALBの作成
### ロードバランサーの作成
EC2のコンソール画面左カラムの`ロードバランサ―`を押下します。
`ロードバランサーの作成`を押下します。
![スクリーンショット 2023-12-24 093254.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/36c5b216-33a3-9452-d818-5ef12e4e70e2.png)

#### ロードバランサータイプ
##### ターゲットタイプの選択
`Application Load Balancer `の下にある`作成`を押下します。
`インスタンス`を選択します。
#### 基本的な設定
##### ロードバランサー名
`elb-user1`と入力します。
##### スキーム、IP アドレスタイプ
デフォルトのまま進みます。
#### ネットワークマッピング 
##### VPC
`handson-user1`を選択します。
##### マッピング
`ap-northeast-1a (apne1-az4)`にチェックを入れます。
サブネットが表示されるので、`パブリックサブネット-1a`を選択します。
`ap-northeast-1c (apne1-az1)`にチェックを入れます。
サブネットが表示されるので、`パブリックサブネット-1c`を選択します。
#### セキュリティグループ 
##### セキュリティグループ
`elb-user1`を選択します。
`default`は削除します。
#### リスナーとルーティング
先ほど作成したターゲットグループを選択します。
`target-user1`を選択します。

ここまでできたら`ロードバランサ―の作成`を押下します。

ELBの一覧画面に遷移し、作成した`elb-user1`を押下します。
![スクリーンショット 2023-12-24 094825.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/53c0fe38-c6b4-706b-2061-ad4a804d9a10.png)

すると詳細画面が表示されますので、`DNS 名`をコピーします。
![スクリーンショット 2023-12-24 095217.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/e8818546-84cc-ea98-a1b3-e91daf2ba8b6.png)

次にリスナーとルールタブのデフォルトアクションの項目にある`target-user1`を押下します。
![スクリーンショット 2023-12-24 095449.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/c654e893-65c9-cccd-e6b4-cf1e8a0ccebc.png)

登録済みターゲットを確認します。
①`webserver#1-user1`というEC2インスタンスがターゲットグループに登録されていること
②ヘルスステータスが`Healthy`であること
①、②を満たしていれば、EC2インスタンスが正常に動いている、ということが確認できます。

# Step5. WordPressの初期設定
## WordPressの設定画面にアクセス
### アクセスの確認
EC2のコンソール画面左カラムの`ロードバランサ―`を押下します。
`elb-user1`のDNS名をコピーし、新規タブに貼り付けます。
すると、画像ようにWordPressが表示されます。
![スクリーンショット 2023-12-24 100219.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/5517472f-4f97-6397-4d1e-6f72d9770801.png)
`さあ、始めましょう！`を押下します。
##### データベース名
`wordpress`を入力します。
##### ユーザー名
`admin`を入力します。
##### パスワード
`amazon1234`を入力します。
##### データベースのホスト名
メモしておいたRDSのエンドポイントを貼り付けます。
##### テーブル接頭辞
デフォルトのまま進みます。

ここまでできたら`送信`を押下します。
![スクリーンショット 2023-12-24 100951.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/eac95dc3-5e86-f29f-5719-cb403c481bba.png)

この部分のインストールは無事完了しました。と表示されるので、`インストール実行`を押下します。
#### Wordpressの情報を入力
##### サイトのタイトル
`はじめてのAWS`と入力します。
##### ユーザー名
`admin`と入力します。
##### パスワード
デフォルトで入力されているものをそのまま使います。
※ログイン時に必要になるのでメモしておきます。
##### メールアドレス
自身のメールアドレスを入力します。
##### 検索エンジンでの表示
` 検索エンジンがサイトをインデックスしないようにする`にチェックを入れます。

ここまでできたら、`WordPressをインストール`を押下します。
![スクリーンショット 2023-12-24 101632.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/a9290b41-c737-91b1-bd7a-2bfebc93102a.png)

成功すれば画像のように表示されるので、`ログイン`を押下します。
![スクリーンショット 2023-12-24 101808.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/708cee7e-0c9c-31fb-ec4a-48f71649fc4a.png)

ログイン画面に遷移しますので、`はじめてのAWS へ移動`を押下します。
![スクリーンショット 2023-12-24 101956.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/c548f8a9-eb0d-2a12-e726-e8154b9a68d6.png)

すると、画像のようにWordPressのサイトが表示されます。
![スクリーンショット 2023-12-24 102131.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/19111dec-ab01-68eb-8f46-7093dda53628.png)

# Step6. AMIの作成と2つ目のEC2インスタンスを作成
WordPressがインストールされたEC2インスタンスからAMIの作成を行い、そのAMIから2つ目のEC2インスタンスを作成します。
次に、ELBに登録することで、Webサーバの冗長化を行います。
## AMIの作成
### イメージの作成
EC2コンソール画面の左カラムの`インスタンス`を選択します。
画像のように作成したEC2インスタンスにチェックを入れ、アクションタブから`イメージの作成`を押下します。
![スクリーンショット 2023-12-24 104732.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/c69c34fd-fde8-8c0b-f34a-3780118fdd23.png)
#### イメージを作成 
##### イメージ名
`wordpress-user1`と入力します。
##### イメージの説明
`wordpress-user1`と入力します。
##### 再起動しない
`有効化`にチェックをいれないまま進みます。

その他の項目はデフォルトのまま進み、`イメージを作成`を押下します。

ここまででAMIが作成できました。

## ２つめのEC2インスタンスの作成
### イメージの作成
EC2コンソール画面の左カラムの`AMI`を選択します。
画像のように作成したAMIにチェックを入れ、`AMI からインスタンスを起動`を押下します。
![スクリーンショット 2023-12-24 105937.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/38447041-b6cf-8824-d38b-c5d0015c9457.png)
#### 名前とタグ
##### 名前
`webserver#2-user1`と入力します。
##### キーペア (ログイン) 
`キーペアなしで続行 (推奨されません)`と選択します。
#### ネットワーク設定
`編集`を押下し、項目を表示させます。
##### VPC
`handson-user1`を押下します。
##### サブネット
`パブリックサブネット-1c`を選択します。
##### パブリック IP の自動割り当て
`有効化`を選択します。
##### ファイアウォール (セキュリティグループ)
`既存のセキュリティグループを選択する`を選択します。
##### 共通のセキュリティグループ
`web-user1`を選択します。

ここまでできたら`インスタンスを起動`を押下します。

## ２つめのEC2インスタンスをELBに登録
### ターゲットグループの作成
EC2コンソール画面の左カラムの`ターゲットグループ`を選択します。
作成したターゲットグループを押下します。
![スクリーンショット 2023-12-24 111159.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/132612d6-848a-5fa4-fc13-097322c00a79.png)

登録済みターゲットまでスクロールし、`ターゲットを登録`を押下します。
![スクリーンショット 2023-12-24 111527.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/b1a7efdd-ea02-1918-1eff-59bec429f359.png)

webserver#2-user1にチェックを入れ、`保留中として以下を含める`を押下します。
![スクリーンショット 2023-12-24 111714.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/8b4e5a82-f512-c844-2da8-c74af8d4b47c.png)

`保留中のターゲットの登録`を押下します。

ここまででELBに２台のEC2インスタンスが紐づきました。

# Step7. RDSのマルチAZ配置
### DBインスタンスをマルチAZ配置に変更
RDSコンソール画面の左カラムの`データベース`を選択します。
画像のように作成したRDSにチェックを入れ、`変更`を押下します。
![スクリーンショット 2023-12-24 112255.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3581403/82d592e0-f9fb-969d-d0b7-22d420371951.png)
#### 可用性と耐久性
##### マルチ AZ 配置
`スタンバイインスタンスを作成する (本稼働環境向けに推奨)`にチェックを入れる。

チェックを入れたら、`DB インスタンスを変更`を押下します。
すると、変更のサマリーのページに遷移します。

#### 変更のスケジュール
##### 変更を適用するタイミング
`すぐに適用`にチェックを入れる。

チェックを入れたら、`DB インスタンスを変更`を押下します。

ここまででRDSのマルチAZ配置ができました。

以上で、スケーラブルなウェブサイトの構築が完了しました。