AWS学習ステップを使用した構築のお勉強④

# はじめに
そういえば基本的なサーバの仕組みとか構築って知識だけあってやったことないなあと思いました。。（上の方に言うと驚かれますがマジでオンプレ触ったことないです）

そこで見つけたル〇コンさん。（Twitter[こちら]("https://twitter.com/RubiconLink" "ルビコンさんのTwitterプロフィール")）
直接お会いしたことないので名前はお伏せしますが、おそらく素晴らしいお方。
しかもなんと、AWS学習ステップ大全 AWS構成図集というのを無料で配布しているではありませんか！！
これは活用するしかない！！ということでAWS構成図集をお借りしてお勉強していきます！！

# AWS学習ステップ大全 AWS構成図集とは
こんな方にオススメだそうです。今の僕にピッタリ。
* AWSを勉強したいので、オススメの学習ステップを教えて欲しい
* AWSはEC2/RDS/ELBなど多すぎて、どれを組み合わせたらいいか分からない
* 簡単な構成から難しい構成まで、難易度別に構成図を知りたい
* HTTPSや独自ドメインなどは実装しつつ、なるべくお金がかからない構成が知りたい
* 転職応募時に「未経験なのにレベル高い」と刺さるレベルの構成を知りたい
* ポートフォリオと一緒に提出する構成図の参考例が知りたい
* 学んだスキルが現場で通用するのか＝実際の現場ではどういう構成が多いのか知りたい

# 今回は④をやるよ
前回構築したものにデータベースを追加します！
いよいよいい感じになってきた笑笑
ただ、今回苦労したのはPHPのインストールとか、DBの情報取得とか、、、
やっぱり実際に構築してみてわかることって多いんだね笑笑

アーキテクチャはAWS構成図④を参考に！！

# PHPのインストール
前回構築したWebサーバにPHPをインストールします！
DBを使用して動的なWebサイトを作成するためにPHPが必要なんですね。
```
yum install php
```
## インストールが始まらない
なぜだ、、
### そんなときは
セキュリティグループやACLを見直そう！！
自分の場合0byteからインストールが進まなかったから、おそらくネットワークに原因があると見た。

### これだ
Webサーバを構築したサブネットのインバウンドを自分のPCからのみにしていたのを忘れていた、、
![12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/1d60f5b9-a0aa-9e6a-d923-5bf089ba1fbc.png)
一時的にインバウンド許可しておきます。
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/a79f9e81-cd0f-2dfb-e561-9cbb3ad74aa2.png)

## 再インストール
```
# yum install php
Last metadata expiration check: 12:34:21 ago on Sun Apr 16 14:02:02 2023.
Dependencies resolved.
...
Complete!
```
## 動作確認
/var/www/html配下にindex.phpを作成します。
```php:index.php
<?php phpinfo() ?>
```

{ドメイン名}/index.phpで検索！
![4.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/787d16a2-760d-7c44-9d79-6c6052205b81.png)


# RDS（MySQL）の構築
RDSを構築していきます。
使用するDBはMySQLです。ここは別に好みで良いかと思います。
## Privateサブネット追加
DBは基本的にPrivateサブネットに構築します。ネットワークにさらけ出されると何されるかわからないですからね笑笑
後でサブネットグループを組まないといけないので2つのAZに作成します。
![5.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/07e35070-5157-cb08-443b-83bfafeb76e3.png)
![10.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/ed090ec1-fe62-ea51-6e30-00cb6208842b.png)

## ルートテーブルの設定
Privateサブネットなのでインターネットゲートウェイにはつながりません。
![6.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/7deb2efe-4ff4-c852-8abc-a78238bbb634.png)

## ACLの設定
DBを構築するので前回とは少し異なります。
インバウンドにはポート3306を許可します。送信元はできるならWebサーバと管理用サーバに絞った方が理想ですね。
![7.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/b584dbad-e34b-aa32-d347-b2b692ef8186.png)

## セキュリティグループの設定
これ忘れるとWebサーバからRDSに接続できないですよ笑笑
RDSに設定するセキュリティグループのインバウンドにWebサーバからの許可を入れましょう。
![8.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/88bd9319-dbc8-cf88-4f09-91bf882c420d.png)

## サブネットグループの設定
RDSを構築する際に、可用性とかの関係で2つのAZ以上のサブネットが必要になります。
先ほど作成したサブネットを設定しましょう。
![11.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/af12f22d-7eab-2b64-a313-34372c732b68.png)

## RDS構築
MySQLを選択しました。
![12.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/484584a3-cd05-236e-06cd-0f03f79d7e7d.png)

後はセキュリティグループとサブネットグループをさっき設定した奴にして、他は無料で済むように最小構成で構築します。
![13.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/aa7140a3-07fa-1a78-228c-06115ed6e5f5.png)
![14.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/d8452819-3f74-55c3-394e-9a0ac496a8dd.png)

# RDSでDB作成
他に管理用のサーバ立てるの面倒なので、WebサーバからRDSに接続してDB作成していきます。
## MySQL Clientのインストール
EC2からMySQLサーバに接続するために必要になりますね。
```
#yum install -y mysql
```
### インストールできない
なん、、、だと、、、
ここ結構長くつまずきました。
対処したのは以下2点です。
1. キャッシュのクリア
1. リポジトリの指定
### キャッシュのクリア
結局どの機械もこれなんですね笑笑
```
#yum clean all
```

### リポジトリの指定
これに関してはよくわかんないんですけど、僕はこれで直りました。
参照してほしいリポジトリを参照してくれていないようです。
```
yum --enablerepo=mysql57-community install mysql-community-server
```

## RDSに接続
接続してみます。
RDSのエンドポイントはダッシュボードで確認しましょう。
```
$ mysql -h {RDSエンドポイント} -u {DBユーザ名} -p {パスワード}
```
### 繋がらない
またか。
Privateサブネットのアウトバウンドが無かったようです。
![15.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/dbb71b37-b148-9e5c-b5a7-6bb01e135b19.png)

## 再接続

キタ
```
$ mysql -h {RDSエンドポイント} -u {DBユーザ名} -p {パスワード}
mysql>
```

## テーブル作成
簡単なDB作成しておきます。
```
mysql> create database test;
Query OK, 1 row affected (0.01 sec)

mysql> use test;
Database changed

mysql> create table temp(id int, name varchar(10));

mysql> insert into temp values(100, "bakuchiku")
```

# Webサーバ⇔DBで動的サイト作成
phpを利用してDBの情報を取得し、Webサイトに表示します。
## DB情報取得ページ作成
ちょーー簡単なものをphpで作成しました。
DBから情報取得して表示するだけです。
```php:index.php
<?php

try{
        $pdo = new PDO(
                "mysql:{RDSエンドポイント};dbname={DB名}",
                "{ユーザ名}",
                "{パスワード}",
                [PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]
        );

        $stmt = $pdo->prepare("select * from temp");

        $stmt->execute();

        foreach($stmt as $row){
                var_dump($row);
        }
}catch(PDOException $e){
        echo $e->getMessage();
}
```

## Webサーバに接続
Webサーバに接続してみて、先ほど作成したテーブルの情報が取得できれば完了ですが、、
なんと、、
![18.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/16f595e4-6523-4960-cd66-9e980bd0230b.png)

## could not find driverの解決
PHPでDBに接続するにはPDO driverというドライバが必要だそうです。（知らんがな）
インストールしていきます。あ、インストールエラー起きたらとりあえずキャッシュのクリアしましょう。
```
#yum -y install php-pdo
#yum -y install php-mysql
```

## 再接続
次はなんだ、
![19.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/6eff4d3a-c349-5d80-aa1f-dea07d6701b2.png)

## コードの見直し
DBにちゃんと接続できていないようです。
以下2点追記します。5行目のみ変更です。
1. RDSエンドポイントの前に"host="を追記
1. 文字コード指定
```php:index.php
<?php

try{
        $pdo = new PDO(
                "mysql:host={RDSエンドポイント};dbname={DB名};charset=utf8",
                "{ユーザ名}",
                "{パスワード}",
                [PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC]
        );

        $stmt = $pdo->prepare("select * from temp");

        $stmt->execute();

        foreach($stmt as $row){
                var_dump($row);
        }
}catch(PDOException $e){
        echo $e->getMessage();
}
```

## 再再接続
キタ
![20.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/0a30a946-e1e6-b4af-afb0-edc3f3d04983.png)

# 課金対策
次回以降はサーバはコンテナに代わり、Cloud FrontとS3でWeb画面表示したりするので、今回までに作成したものは消してしまいます。
特にALBとかRoute53はほっとくといかれる可能性があるので即刻消してしまいます笑笑
個人の環境なので、
![21.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3138153/3e74a69b-d867-70ef-56f5-fed7c256d13c.png)


# おわり
DB周りは初めて触る内容が多くてだいぶ手こずりました。。
やっぱり実際に触らないとわからいことが多いですね。笑笑
RDS自体の構築は5分もあれば終わるのに、その他の作業で数時間いかれました。。