AWSを理解する[WordPress編]

#概要
はじめに、この記事はAWS初学者が備忘録として作成しています。
ですが、私のような初学者のために少しでもなればと思い、公開しています。
不適切や、わかりにくい点を見つけた場合はご指摘頂ければ幸いです。

1. [ネットワークを構築する](https://qiita.com/enuii3/items/103c4b9b0db472f36ddb)
2. [webサーバーソフトをインストールする](https://qiita.com/enuii3/items/a68f42563a6331b89db3)
3. [webサーバーにWordPressをインストールする](https://qiita.com/enuii3/items/cfd0053a27ab2ccb052d)👈今ここ
4. [通信の仕組みを理解する](https://qiita.com/enuii3/items/7f1196c28ae740c91482)
5. [S3を使って公開する](https://qiita.com/enuii3/items/db930446f334db3ce1da/)

#リクエストとレスポンスの書式
##リクエスト
以下はリクエストの例で、リクエストライン、ヘッダー、ボディの3つで構成されています。
>
POST / HTTP/1.1
Host: www.google.co.jp
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64)
Accept-Encording: gzip, deflate
>
Keyword=AWS

###リクエストライン
>POST / HTTP/1.1

上記の1行はリクエストラインで**要求コマンド**のことです。
**要求方法**と**要求するURL**が含まれます。

###ヘッダー
>Host: www.google.co.jp
Connection: keep-alive
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64)
Accept-Encording: gzip, deflate

上記の4行はヘッダーで、ブラウザから送信する**追加情報**です
例えば、要求したいホスト名、ブラウザの種類、対応言語、Cookie情報、直前に見ていたページのURLなどが含まれます。

###ボディ
>Keyword=AWS

上記の1行はボディでHTML要素(form要素)やAjaxなどで、POSTというメソッドを利用し、データをサーバーに送信する時に利用されます。
ヘッダーとボディとは、空行で区切られます。


##レスポンス
以下はレスポンスの例でステータスライン、ヘッダー、ボディで構成されます。
>
HTTP/1.1 200 OK
Date: Wed, 09 Apr 2021 05:34:43 GMT
Cache-Control: private, max-age=0;
Content-Type: text/html; charset=UTF-8
Server: gws
>
\<html>\<body>...

###ステータスライン
>HTTP/1.1 200 OK

ステータスラインはその要求の成否を返すものです。
正常に終了すれば「200 ok」
見つからない時は「404 Not Found」
サーバー側で何かしらのエラーが発生した時は「500 Internal Server Error」を返す

###ヘッダー
>Date: Wed, 09 Apr 2021 05:34:43 GMT
Cache-Control: private, max-age=0;
Content-Type: text/html; charset=UTF-8
Server: gws

ヘッダーは追加情報を返すために利用されます。
よく使われるものとして、Content-Typeヘッダー(ボディ部の種類を示す)やContent-Lengthヘッダー(ボディの長さを示す)があります。

###ボディ
>\<html>\<body>...

ボディは要求されたURLに対するコンテンツです。

#プライベートサブネットを作る
**要点**
1. パブリックサブネットのアベイラビリティゾーンを確認する
2. サブネット名、アベイラビリティゾーン、CIDRブロック(10.0.2.0/24)それぞれを入力し、 サブネットの作成。
3. プライベートIPアドレスはネットワークインターフェースの部分で設定します。(10.0.2.10というIPアドレスを割り当てる) 

#プライベートサブネットにサーバーを構築する
##インスタンスの作成
サブネットに先ほど作成したサブネットを指定し、自動割り当てパブリックIPアドレスは「無効化」または「サブネット設定を使用(無効)」

##pingコマンドで疎通確認できるようにする
pingコマンドではICMP(Internet Control Message Protcol)というプロトコルを用います。
pingコマンドを実行すると、ネットワーク疎通を確認したいホストに対して「ICMPエコー要求」というパケットを送信します。それを受け取ったホストは、送信元に対して「ICMPエコー応答」というパケットを返信します。
pingコマンドでは、「ICMPエコー要求」と「ICMPエコー応答」のやりとりから、疎通を確認したり、相手に届くまでの時間を計測したりします。

###ICMPが通るように構成する
AWSのデフォルトのセキュリティグループの構成では、ICMPプロトコルは許可されていないので、ファイアウォールの構成(インバウンドの追加)を変更する必要があります。

>タイプ: 全てのICMP-IPv4
>ソース: 0.0.0.0/0

####疎通を確認する
ICMPプロトコルを通るように構成したので、sshでログイン後に以下のコマンドでWebサーバーからDBサーバー(IPアドレス: 10.0.2.10)への疎通確認しましょう。

```shell
$ ping 10.0.2.10
```

##DBサーバーにログインする
###秘密鍵をアップロードする
インスタンスにsshでアクセスするには、秘密鍵が必要です。
つまり、webサーバーからdbサーバーへとsshで接続する場合、秘密鍵をwebサーバーに置いておく必要があります。
サーバーにファイルを転送(scpコマンド)するには、SCPというプロトコルを使います。
scpコマンドで鍵ファイルをwebサーバーにコピーした後に、読み込み専用にパーミッションを変更。
webサーバー上でpemファイルを使用してsshでDBサーバーにログイン

#NATを構築する
##NATの用途と必要性
NATはIPアドレスを変換する装置で、２つのネットワークインターフェースを持ちます。
片側のインターフェースには、一般に、パブリックIPアドレスを設定し、インターネットに接続可能な構成にしておきます。
もう片側のインタフェースにはプライベートIPアドレスを設定し、プライベートサブネットに接続します。
プライベートサブネットに存在するホスト(サーバーやクライアント)が、インターネットにパケットを送信しようとした時、NATは、パケットの送信もとIPアドレスを自身のパブリックIPアドレスに置き換えします。
こうすることで、送信元がプライベートIPアドレスではなく、NATが持つパブリックIPアドレスに変わるため、インターネットに出ていくことができます。
パケットの送信元IPアドレスが置換されているので、接続先あkらはNATが接続してきているように見えます。
そのため応答パケットは、このNATに戻ってきます。
NATは、戻ってきた応答パケットの宛先を、元のホストのIPアドレスに置換してプライベートサブネットに転送します。
このようにNATがIPアドレスを置換することによって、プライベートサブネットに存在するホストは、インターネットと通信できるようになります。

##NATインスタンスとNATゲートウェイ
###NATインスタンス
NATソフトウェアがあらかじめインストールされたAMIから起動したEC2インスタンスを使う方法です。
EC2インスタンスを作成するときに、コミニテュティAMIでami-vpc-natを選択してインストールするとNAT機能付きのEC2インスタンスを作れます。
NATインスタンスはAmazon LinuxをベースとしたLinux OSなので、そのEC2インスタンスにNAT以外のソフトウェアをインストールすることもできます。


###NATゲートウェイ
NATゲートウェイは、NAT専用に構成された仮想的なコンポーネントです。
配置するサブネットを選ぶだけで構成できます。
NATゲートウェイは、NATインスタンスと違って、負荷に応じてスケールアップします。
料金は、時間あたりと転送バイト(ギガバイト当たり)の転送量で決められます。

###パブリックサブネットとプライベートサブネットをNATゲートウェイで接続する
今回、プライベートサブネットに配置したDBサーバーを、NATゲートウェイを経由してインターネットに接続できるようにするには、以下の方法があります。

####NATゲートウェイを配置する
NATゲートウェイは、インターネットから接続可能な場所である「パブリックサブネット」に配置して起動します。

####デフォルトゲートウェイを設定する
NATゲートウェイの準備ができたら、プライベートサブネットからインターネット宛のパケットが、NATゲートウェイを経由するように、ルートテーブルを変更します。

##NATゲートウェイを構築する
###NATゲートウェイを起動する
まずはNATゲートウェイをサブネットに配置して起動します。
1. VPCメニューからNATゲートウェイの作成
2. サブネットとElastic IPを割り当てる
3. ルートテーブルを更新する  

次に、プライベートサブネットからインターネットに対して通信するとき、パケットがNATゲートウェイの方向に流れるように構成します。
これは、デフォルトゲートウェイ(宛先が未知のIPアドレスだった際にパケットを転送するデフォルトのゲートウェイ)をNATゲートウェイに向ける設定であり、0.0.0.0./0に対して、NATゲートウェイを選択するだけです。

####NATゲートウェイを通した疎通確認をする
今回の構成では、プライベートサブネットからHTTPおよびHTTPSの通信を許可しています。
そこでDBサーバーにログインして、インターネットに対してHTTP://WWW.やHTTPSで接続できるかどうかを調査すれば、NATゲートウェイが正常に動作しているかどうかを確認出来ます。

####curlコマンドで確認する
curlコマンドはHTTPやFTPで、ファイルをダウンロードしたりアップロードしたりするコマンドです。
実際に下記のコマンドを実行するとkantei.go.jpのトップページを取得して、コマンドラインに表示できます。

```shell
$ curl www.kantei.go.jp
```

NATは通信していなくて課金の対象になるので使用していない場合は削除しましょう。

##DBサーバーにMariaDBをインストールする
1. mariaDBをインストール
2. 起動
3. パスワードの設定
4. WordPressで使用するデータベース(データベース名: wordpress)を作成する
5. ユーザー(ユーザー名: wordpress, パスワード: wordpresspasswd)を作成します。
 
DBサーバーまでログインした後に以下のコマンドを実行

```shell
$ sudo yum -y install mariadb-server
$ sudo systemctl start mariadb
$ mysqladmin -u root password
$ mysql -u root -p
> CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
>grant all on wordpress.* to wordpress@"%" identified by 'wordpresspasswd';
>flush privileges;
>select user, host from mysql.user;
```
@は接続元のホストを示し、%は全てのホストを示します。
つまりwordpress@"%"はどこからでも接続できるwordpressという名のユーザーのことです。

DBサーバーが起動した時にmariaDBも自動で起動するように修正する(DBサーバーにログインした状態で以下のコマンドを実行)
```shell
$ sudo systemctl enable mariadb
```

##WEBサーバーにWordPressをインストールする
webサーバーにログイン後に以下のコマンドを実行

```shell
$ sudo amazon-linux-extras install php7.3
```
###PHPやMariaDBのライブラリーなどをインストール

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

###MariaDBコマンドのインストール
```shell
$ sudo yum install mariadb-server
```

###MariaDBにログインする
```shell
$ mysql -h 10.0.2.10 -u wordpress -p
```
指定している「10.0.2.10」は、DBサーバーのIPアドレスです。「uwordpress」は、wordpressユーザーで接続するという意味です。そして「p」は、パスワードを必要とするという意味です。
接続するとパスワードが求められます。これはgrantコマンドで指定したものであり、本書の例では、「wordpresspasswd」です

##WordPressのダウンロード
```shell
$ wget https://ja.wordpress.org/latest-ja.tar.gz
```

####展開
```shell
$ tar xzvf latest-ja-.tar.gz
```
展開するとwordpressディレクトリが作成されているはずなので、移動し、以下のコマンドを実行

####コピー
```shell
$ sudo cp -r * /var/www/html/
```

####ファイルの所有権をapacheに変更
```shell
$ sudo chown apache:apache /var/www/html -R
```

####apacheの起動
```shell
$ sudo systemctl start httpd
もしくは
$ sudo systemctl restart httpd
```

##WordPressを初期設定する
1. webサーバー用インスタンスのパブリックDNSを確認する
2. アクセスして初期設定をする 

>データベース名: wordpress
ユーザー名: wordpress
パスワード: wordpresspasswd
データベースのホスト名: 10.0.2.10
テーブル接頭辞: wp_（デフォルトのまま）

#この章のまとめ
この構成でポイントとなるのは、インターネットに公開されているのはWebサーバーだけであるという点です。
DBサーバーはプライベートサブネットに配置してあるので、インターネットから直接攻撃を受けません。
また、DBサーバーはNATゲートウェイを経由してインターネットに接続できることから、ソフトウェアのインストールやアップデート作業で不便を強いることもありません。

#tips
- プライベートサブネットはパブリックサブネットと違ってインターネットに接続しないため、デフォルトテーブルのまま、変更する必要がありません。
- NAT(正確にいうと、NAPTやIPマスカレード)は、一つのパブリックIPアドレスさえあれば、それを各ホストで共有してインターネットに接続できます。家庭でインターネットに接続する時には、「ルーター」と呼ばれる装置を使うことがほとんどです。実は、ルーターの内部ではNAT機能が動作しています。通常プロバイダから割り当てられるパブリックIPアドレスは一つだけです。家庭では、NATを使ってこの一つのパブリックIPアドレスを共有することで、複数台のホストがインターネットに接続できるようにしています。もしNATがなければ、ただ一台のホストしかインターネットに接続できません。この方法を構築する方法として、AWSではNATゲートウェイという機能が提供されており、非常に簡単にNATを利用することができるようになっています。
- 管理者は「root」というユーザーです。次のようにmysqladminコマンドを実行すると、管理者であるrootユーザーのパスワードを変更できます。設定したパスワードは、以降、rootユーザーで操作する際に尋ねられるので、忘れないようにしてください。
- 「MariaDBのrootユーザー」と「Linuxシステムのrootユーザー」は、異なるユーザーです。MariaDBは、Linuxシステムのユーザーアカウントではなく、独自のユーザーアカウントを用います。