【AWS】Web Server 2台 + RDB 構成でWP運用 

下図の構成でWordPressを運用してみた！
自分用メモでやることだけを端的に記載したテキストベースになります。

![aws.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1897847/aac7d3cc-c595-12e2-099c-d034c4cfb207.jpeg)



##お品書き

<dl>
  <dt>1.ネットワーク作成</dt>
  <dd>1.1 VPC作成</dd>
  <dd>1.2 サブネット作成</dd>
  <dd>1.3 インターネットゲートウェイ作成</dd>
  <dd>1.4 ルートテーブル作成</dd>
  <dd>1.5 ファイアウォール設定 (セキュリティグループ設定)</dd>　
  <dt>2.インスタンス作成</dt>
  <dd>2.1 EC2</dd>
  <dd>2.2 Elastic IP</dd>
  <dd>2.3 DBサブネットグループ</dd>
  <dd>2.4 RDS (Mysql)</dd>　
  <dt>3.Web Server ミドルウェア設定</dt>
  <dd>3.1 Apache + PHP + phpMyAdmin インストール＆設定</dd>
  <dd>3.2 Wordpress インストール</dd>　
  <dt>4.EC2 インスタンスコピー</dt>　
  <dt>5.rsync + lsyncd + xinted を用いたWebサーバー間のリアルタイム同期</dt>　
  <dt>6.Route53(DNS) + ACM(SSL証明書) </dt>　
  <dt>7.LoadBalancer(ALB)でのWeb Server 分散処理 & 独自ドメイン設定</dt>　

</dl>

## 1.ネットワーク作成

###1.1 VPC作成

**■ 概要**
とりあえず、これを作らないと始まらない


**■ 設定個所**
**AWS マネジメントコンソール：サービス > VPC > 「VPCの作成」**

**■ 設定内容**
**[名前タグ]**：任意  (例:”sample-vpc”)
**[IPv4 CIDR]**：10.0.0.0/16
**[IPv6 CIDR]**：IPv6 CIDR ブロックなし
**[テナンシー]**：デフォルト

###1.2 サブネット作成
**■ 概要**
作成したVPCにサブネットを切っていく

**■ 設定個所**
**AWS マネジメントコンソール：サービス > VPC > サブネット > 「サブネットの作成」**

**■ 設定内容**

| 項目 | Web Server1 | Web Server2 | RDB 1 | RDB 2 |
|:-|:-|:-|:-|:-|
| VPC ID     | sample-vpc|sample-vpc|sample-vpc|sample-vpc|
| サブネット名| subnet-sample-vpc-web1|subnet-sample-vpc-web2|subnet-sample-vpc-db1|subnet-sample-vpc-db2|
| アベイラビリティーゾーン |ap-northeast-1a|ap-northeast-1c|ap-northeast-1a|ap-northeast-1c|
| IPv4 CIDR ブロック| 10.0.0.0/24|10.0.1.0/24|10.0.2.0/24|10.0.3.0/24|


**[VPC ID]**：さっき作成したVPCを選択
**[サブネット]**：任意 (VPNとの関連が分かる名前にした方がいい)


>RDB2 (10.0.3.0/24)にRDBインスタンスを作成する訳ではないが、あとでDBサブネットグループ作成する時にDBサブネットが2つ必要になるので、そのために作成してます。



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

**■ 概要**
インターネットから接続できるようにゲートウェイを立てる

**■ 設定個所**
**AWS マネジメントコンソール：サービス > VPC > インターネットゲートウェイ > 「インターネットゲートウェイの作成」**

**■ 設定内容**
**[名前タグ]**：VPNとの関連が分かる名称が望ましい　(例:internet-gateway_sample)

ゲートウェイ作成後に該当のVPCへアタッチして完了

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

**■ 概要**
下記2つルートテーブルを作成
・インターネットから接続できる(public)ルートテーブル
・インターネットから接続できない(private)ルートテーブル


**■ 設定個所**
**AWS マネジメントコンソール：サービス > VPC > ルートテーブル > 「ルートテーブルの作成」**

**■ 設定内容**

| 項目 | public ルートテーブル | private ルートテーブル |
|:-|:-|:-|
| 名前| route-table-sample-public|route-table-sample-private|
| ルート |0.0.0.0/0 (作成したインターネットゲートウェイ), 10.0.0.0/16|10.0.0.0/16|
| 関連付けサブネット|subnet-sample-vpc-web1, subnet-sample-vpc-web2 |subnet-sample-vpc-db1 ,subnet-sample-vpc-db2 |

###1.5 ファイアウォール設定

**■ 概要**
AWSにはネットワークACL,セキュリティグループの2種類でファイアウォールを設定できるが、インスタンス毎にファイアウォールを設定できる方が個人的には便利なので、セキュリティグループでファイアウォールの設定を行う。

**■ 設定個所**
**AWS マネジメントコンソール：サービス > VPC > セキュリティ > セキュリティグループ > 「セキュリティグループの作成」**


####1. Web Server セキュリティグループ

**■ 設定内容**
**[セキュリティグループ名]**：任意 (※web1-sample-vpc ,web2-sample-vpc)
**[VPC]**：作成したVPC (sample-vpc)


>後続のWebサーバー間でのリアルタイム同期の設定で双方ポートを空けたりするので、インスタンス単位でセキュリティグループを作成しています。

**インバウンドルール**

| タイプ | プロトコル | ポート | ソース |
|:-|:-|:-|:-|
|すべてのICMP IPv4 |ICMP|すべて|0.0.0.0/0|
|HTTP |TCP|80|0.0.0.0/0|
|HTTPS|TCP|443|0.0.0.0/0|
|SSH|TCP|22|固定IPでセキュアにする|

**アウトバウンドルール**
デフォルトのままでOK：すべてのトラフィックを許可

####2. DB セキュリティグループ
**■ 設定内容**
**[セキュリティグループ名]**：任意 (db-sample-vpc)
**[VPC]**：作成したVPC (sample-vpc)

**インバウンドルール**

| タイプ | プロトコル | ポート | ソース |
|:-|:-|:-|:-|
|MYSQL/Aurora|TCP|3306|web1-sample-vpc|
|MYSQL/Aurora|TCP|3306|web2-sample-vpc|

Web ServerからRDBにアクセスできるようにWeb Serverのセキュリティグループをそれぞれ追加してあげること

**アウトバウンドルール**
デフォルトのままでOK：すべてのトラフィックを許可

####3. Load Balancer セキュリティグループ
**■ 設定内容**
**[セキュリティグループ名]**：任意 (loadbalancer-sample-vpc)
**[VPC]**：作成したVPC (sample-vpc)

**インバウンドルール**

| タイプ | プロトコル | ポート | ソース |
|:-|:-|:-|:-|
|すべてのICMP IPv4 |ICMP|すべて|0.0.0.0/0|
|HTTP |TCP|80|0.0.0.0/0|
|HTTPS|TCP|443|0.0.0.0/0|

**アウトバウンドルール**
デフォルトのままでOK：すべてのトラフィックを許可

## 2.インスタンス作成

###2.1 EC2インスタンス作成
**■ 概要**
Web Serverを建てる

**■ 設定個所**
**AWS マネジメントコンソール：サービス > EC2 > インスタンス >「インスタンスを起動」**

**■ 設定内容**
**ステップ1 [Amazon マシンイメージ (AMI)]**：Amazon Linux 2 AMI
**ステップ2 [インスタンスタイプ]**：t2.micro
　※後から変更すること可能なので最低限のスペックでOK
**ステップ3 [インスタンスの詳細]**：
　　[インスタンス数]：1
　　[ネットワーク]：作成したVPC (sample-vpc)
　　[サブネット]：作成したサブネット (subnet-sample-vpc-web1)
　　[自動割り振りパブリックIP]：有効
　　`上記以外はデフォルトのままでOK`
**ステップ4 [ストレージの追加]**：デフォルトのままでOK (サイズ8GB, ボリューム対応は汎用SSD(gp2))
**ステップ5 [タグの追加]**：任意
**ステップ6 [セキュリティグループの設定]**：作成したweb server用のセキュリティグループを適応 (web1-sample-vpc)
**ステップ7 [インスタンス作成の確認]**：問題なければ「起動」
**→キーペアの作成**
「新しいキーペアの作成」→キーペア名：任意→「キーペアのダウンロード」→インスタンスの作成
　※EC2インスタンスにログインする時に必要

EC2インスタンス一覧から作成したEC2インスタンスに任意に名前を付ける (web1-sample-vpc)


>後でEC2インスタンスをコピーするので1台だけ作成


###2.2 Elastic IPの設定
**■ 概要**
現状のままだと、EC2インスタンスを再起動する度にIPアドレスが変ってしまうのため、固定IPアドレスを取得し作成したEC2インスタンスに割り当てます。

**■ 設定個所1**
**AWS マネジメントコンソール：サービス > EC2 > ネットワーク＆セキュリティ > Elastic IP >「Elastic IP アドレスの割り当て」**

**■ 設定内容1**
デフォルトのままで「割り当て」でElastic IPアドレスの作成完了

**■ 設定個所2**
**AWS マネジメントコンソール：サービス > EC2 > ネットワーク＆セキュリティ > Elastic IP > Elastic IPアドレス一覧から作成したElastic IPアドレスにチェック > アクション > 「Elastic IP アドレスの関連付け」**

**■ 設定内容2**
**[リソースタイプ]**：インスタンス
**[インスタンス]**： 作成したEC2インスタンス (web1-sample-vpc)
 →「関連付ける」で作成したEC2インスタンスに固定IPアドレスの割り当てが完了

SSH接続でEC2インスタンスにログインできればOK

###2.3 DBサブネットグループ作成
**■ 概要**
RDSインスタンス作成の際にRDS用のサブネットグループが必要になるので、RDS作成の前にDBサブネットグループを作成します。

**■ 設定個所**
**AWS マネジメントコンソール：サービス > RDS > サブネットグループ >「DBサブネットグループを作成」**

**■ 設定内容**
**[サブネットグループの詳細]**
　[名前]：任意 (dbsubnet-sample-vpc)
　[説明]：任意 (dbsubnet-sample-vpc)
　[VPC]：作成したVPC (sample-vpc)
**[サブネットを追加]**
　[アベイラビリティーゾーン]：作成したサブネットのアベイラビリティーゾーン (ap-northeast-1a,ap-northeast-1c)
　[サブネット]：作成したサブネット (10.0.2.0/24,10.0.3.0/24)

「作成」でRDS用で完了！


###2.4 RDS (Mysql) 作成
**■ 概要**
DBインスタンスを作成していく

**■ 設定個所**
**AWS マネジメントコンソール：サービス > RDS > データベース >「データベースの作成」**

**■ 設定内容**
**[データベースの作成方法]**：標準作成
**[エンジンのオプション]**：MySQL
**[エディション]**：MySQL Community
**[バージョン]**：MySQL 8.0.23
**[テンプレート]**：任意  (無料枠) 
**[設定]**：
　[DB インスタンス識別子]：任意 (db1-mysql-sample-vpc)
　[マスターユーザー名]：任意 (sample)
　[マスターパスワード]：任意
　[DB インスタンスクラス]：任意 (db.t2.micro)
　[ストレージ]：任意 (デフォルトのまま)
**[接続]**：
　[VPC]：作成したVPC (sample-vpc)
　[サブネットグループ]：作成したDBサブネットグループ (dbsubnet-sample-vpc)
　[パブリックアクセス]：なし
　[VPCセキュリティグループ]：既存
　[既存のVPCセキュリティグループ]：db-sample-vpc
　[アベイラビリティーゾーン]：ap-northeast-1a
**[データベース認証]**：パスワード認証

「データベースの作成」で作成完了！

##3.Web Server ミドルウェア設定

###3.1 Apache + PHP + phpMyAdmin インストール＆設定

**■ 概要**
・Apache のインストールと設定
・PHP最新のインストールと設定
・phpMyAdminのインストールと設定

**■ 設定個所**
SSH接続
ID:ec2-user
PW:鍵ファイル (※EC2インスタンス作成した際に一緒に作成した鍵のこと)
port:22

**■ 設定内容**
参考サイト：[[AWS] Amazon Linux に Apache(2.4系) + PHP(7.4系) + phpMyAdmin(5.2系) をインストール](https://qiita.com/Hachioji_Agil/items/2454e8df58428650d896)

 
###3.2 Wordpress インストール

**■ 概要**
これに関しては腐るほどリファレンスあるので他のリファレンスをご参照ください。
※AWS EC2 だからといった何か特別な設定はないです。

##4.EC2 インスタンスコピー

**■ 概要**
Webserver1のAMI(イメージデータ)を作成し、そのAMIを基に新規EC2インスタンス(Webserver2)を作成する

####4.1 前準備

**■ 概要**
前準備として以下2つを行う
・Web server 1のインスタンスの停止
・Web server 1に割り当てているElastic IPアドレスを外す

**■ 設定個所**
**[インスタンス停止]**
**AWS マネジメントコンソール：サービス > EC2 > インスタンス > インスタンス**

**[Elastic IPアドレス割り当て解除]**
**AWS マネジメントコンソール：サービス > EC2 > ネットワーク＆セキュリティ > Elastic IP**


**■ 設定内容**
**[インスタンス停止]**
対象のインスタンスにチェックを入れ、「インスタンスの状態」→「インスタンスを停止」

**[Elastic IPアドレス割り当て解除]**
対象のElastic IPアドレスにチェックを入れ、「アクション」→「Elastic IPアドレスの関連付けの解除」

####4.2 AMIの作成

**■ 概要**
AMI作成

**■ 設定個所**
**AWS マネジメントコンソール：サービス > EC2 > インスタンス > インスタンス**

**■ 設定内容**
コピー対象のインスタンスにチェック入れ、「アクション」→「イメージとテンプレート」→ 「イメージを作成」

**[イメージ名]**：任意 (AMI-web1-sample-vpc)
**[イメージの説明]**：任意 (AMI-web1-sample-vpc)
**[再起動しない]**：チェックなし

→「イメージを作成」でAMI作成完了！

####4.3 EC2インスタンス作成

**■ 概要**
作成したAMIをベースにEC2インスタンスを作成

**■ 設定個所**
**AWS マネジメントコンソール：サービス > EC2 > イメージ > AMI**

**■ 設定内容**
作成したAMIにチェックを入れ、→「起動」
あとは、「2.1 EC2インスタンス作成」「2.2 Elastic IPの設定」の手順と同じでOK！

##5.rsync + lsyncd + xinted を用いたWebサーバー間のリアルタイム同期

**■ 概要**
Web serverが2台あり、アプリケーションを更新する際に資材(ファイル)を両インスタンスそれぞれ更新する必要があり面倒なので、1台更新したら自動的にもう1台も更新する環境を作成する。

作業概要は以下

まず、下記のミドルウェアをインストール＆設定
・rsync
・lsyncd
・xinted 

AWSセキュリティグループでWebserverのrsync 用のポート873 番 を開ける


**■ 設定個所**
SSH

**■ 設定内容**

詳しくは別の記事書いてリンク貼ります！

##6.Route53(DNS) + ACM(SSL証明書) 

####6.1 Route53(DNS)へのドメイン登録

**■ 概要**
外部ドメインレジストラ(お名前.com,value-domainなど)で取得したドメインをRoute53に登録する
※ドメインの移管ではなく、Route53のネームサーバーを利用

**■ 設定個所**
**AWS マネジメントコンソール：サービス > Route53 > ホストゾーン > 「ホストゾーンの作成」**

**■ 設定内容**
**[ドメイン名]**：任意 (sample.com)
**[説明]**：任意
**[タイプ]**：パブリックホストゾーン
→「ホストゾーンの作成」でホストゾーンの作成完了！

作成したホストゾーンに記載されているNSレコード(※)をドメインレジストラのネームサーバーに登録すればOK！

>※
ns-○○○.awsdns-○○.net.
ns-○○○.awsdns-○○.com.
ns-○○○.awsdns-○○.org.
ns-○○○.awsdns-○○.co.uk.


####6.2 ACM(SSL証明書) の取得

**■ 概要**


**■ 設定個所**
**AWS マネジメントコンソール：サービス > Certificate Maneger > 「証明書のリクエスト」**

**■ 設定内容**
「パブリック証明書のリクエスト」にチェック入れ → 「証明書のリクエスト」

**1 [ドメイン名の追加]**：ドメイン名 (sample.com)
**2 [検証方法の選択]**：「DNSの検証」を選択
**3 [タグを追加]**：任意
**4 [確認とリクエスト]**：内容に問題なければ「確定とリクエスト」押下
**5 [検証]**：ドメイン名を選択し、「Route53でのレコードの作成」を押下
→ 上記の手順で証明書の作成が完了

>DNS認証の場合は証明書を自動更新してくれるので便利

##7.LoadBalancer(ALB)でのWeb Server 分散処理 & 独自ドメイン設定

**■ 概要**
LoadBalancerを用い分散処理設定を行い、LoadBalancerに対してドメインを割り当てる

####7.1 LoadBalancer(ALB)の作成

**■ 概要**
LoadBalancer(ALB)の作成

**■ 設定個所**
**AWS マネジメントコンソール：サービス > EC2 > ロードバランシング > ロードバランサー > 「ロードバランサーの作成」**

**■ 設定内容**
「Application Load Balancer」の「作成」を押下

**手順1 [ロードバランサーの設定]**
**基本的な設定：**
　[名前]：任意 (loadbalancer-sample-vpc)
　[スキーム]：インターネット向け
　[IPアドレスタイプ]：インターネット向け
**リスナー：**

|ロードバランサーのプロトコル|ロードバランサーのポート|
|:-|:-|
|HTTP|80|
|HTTPS|443|

**アベイラビリティーゾーン：**
　[VPC]：作成したVPC (sample-vpc)
　[アベイラビリティーゾーン]：Webserverがあるアベイラビリティーゾーン、サブネットを選択

>例としての環境だと以下
ap-northeast-1a：subnet-sample-vpc-web1
ap-northeast-1c：subnet-sample-vpc-web2

**アドオンサービス：**
設定個所なし

**手順2 [セキュリティ設定の構成]**

**デフォルトの証明書の選択：**
　[証明書タイプ]：ACMから証明書を選択
　[証明書の名前]：作成した証明書を選択 (sample.com)

**セキュリティポリシーの選択：**
　[セキュリティポリシー]：デフォルトのままでOK (ELBSecurityPolicy-2016-08)


**手順3 [セキュリティグループの設定]**
**セキュリティグループの割り当て：**
 「既存のセキュリティグループを選択する」にチェック入れ、LoadBalancer用(loadbalancer-sample-vpc)のセキュリティグループを選択

**手順4 [ルーティングの設定]**
**ターゲットグループ**
　[ターゲットグループ]：新しいターゲットグループ
　[名前]：任意 
　[ターゲットの種類]：インスタンス
　[プロトコル]：HTTP
　[ポート]：80
　[プロトコルバージョン]：HTTP1

**ヘルスチェック**
　[プロトコル]：HTTP
　[パス]：/index.php or /index.html or /適当なディレクトリ/index.php or /適当なディレクトリ/index.html など・・・ 　(/index.php)
>インターネットから見えるディレクトリ、ファイルであれば何でも大丈夫です

**手順5 [ターゲットの登録]**

EC2インスタンス2台を登録済みターゲットに追加する

**手順6 [確認]**

内容を確認し、問題なければ「作成」を押下

####7.2 EC2インスタンスのセキュリティグループ調整

**■ 概要**
LoadBalancerからHTTP、HTTPSで転送されるトラフィックを許可するため
Web server1 , Web server2のセキュリティグループを調整

**■ 設定内容**

「1.5 ファイアウォール設定」の手順を参考にEC2 2台(Web server1 , Web server2)のLoadBalancerからのHTTP(80),HTTPS(443)トラフィックを許可

####7.3 LoadBalancerに独自ドメインをポイント

**■ 概要**
LoadBalancer作成時にLoadBalancer自体にドメインがポイントされているので、
このポイント先を独自ドメインのエイリアスして設定する

**■ 設定個所**
**AWS マネジメントコンソール：サービス > Route53 > ホストゾーン**


**■ 設定内容**
対象のホスト(ドメイン)を選択　→　「レコードを作成」

**[レコードタイプ]**：A (デフォルトのまま)
**[値]**：「エイリアス」をオン → 「Application Load Balancer と Classic Load Balancer へのエイリアス」→　「アジアパシフィック (東京) [ap-northeast-1]」→「作成したLoadBalancer」

→「レコードを作成」で完了！

## 終わり

以上、完了！