概要
AWSを使って、簡単なサーバー環境を構築しました。
目的は、AWSの学習・理解のためです。
行ったこととしては、
0、基礎知識を得る
1、サーバーを構築(EC2とRDS)
2、EC2上でNginx+PHPをインストール
3、EC2からRDS内のMySQLにPDO接続
4、AMIを使ってインスタンスをコピー
5、ALBを作成
基礎知識
AWS素人がインフラ設計/構築を理解するために、まず最初におさえるべきキーワード15選
https://qiita.com/Futo23/items/318d89eccdbf5697f8bf
AWS入門者向け 初心者が最初に理解すべきEC2とVPCの基本的な用語解説
https://avinton.com/academy/aws/
サーバーを構築(EC2とRDS)
こちらの記事を参考に簡単なサーバー構築をします。
https://tech.recruit-mp.co.jp/infrastructure/retry-aws-minimum-vpc-server-environment/
流れとしては、
- VPCの作成
- Subnetの作成
- EC2用
- RDS用
- Internet Gatewayの作成・VPCと紐付け
- Route Tableの作成・public subnetと紐付け
- Security Groupの作成・インバウンドのルールの編集
- アプリケーションサーバー
internet接続(80番)
SSH接続(22番) - DB アプリケーションサーバーからの接続(3306番)
- アプリケーションサーバーにターミナルでSSH接続
アプリケーションサーバーからMySQLに接続
まで行いました。
詰まったところは、
Public DNSが割り当てられなかったところでした。
→[AWSでPublic DNS(パブリックDNS)が割り当てられない時の解決法]
(https://qiita.com/sunadoridotnet/items/4ea689ce9f206e78a523)
EC2上でNginxとphp-fpmをインストール
こちらの記事を参考にnginxとphpーfpmをインストール。テストファイルで接続確認まで行います。
[AWSのEC2で行うAmazon Linux(nginx・php7.1-fpm)環境構築]
(https://qiita.com/2no553/items/e1b85b48412bc4559240)
EC2からRDS内のMySQLにPDO接続
簡単なアプリケーションでPDO接続を行います。
そのため、
1、ローカルでアプリケーション作成
2、ローカルのファイルをAWSのnginx内に送る
3、MySQL内にデータベース作成
4、接続して確認
の順序で行います。
ローカルでアプリケーション作成
PDOでMySQLからデータを持ってくることが目的のため、簡単なアプリを作ります。
<?php
function connectDB() {
$dsn = 'mysql:dbname=practice; host=[RDSのエンドポイント]; charset=utf8';
$user = '[MySQLのユーザーネーム]';
$password = '[MySQLのパスワード]';
$dbh = new PDO($dsn, $user, $password);
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
return $dbh;
}
try{
$dbh = connectDB();
$sql = 'select id, name from users where 1';
$stmt = $dbh->prepare($sql);
$stmt->execute();
$dbh = null;
echo 'User list<br>';
while(true) {
$rec = $stmt->fetch(PDO::FETCH_ASSOC);
if ($rec == false) {
break;
}
echo $rec['id'];
echo $rec['name'];
echo "<br>";
}
} catch(Exception $e) {
echo 'I am sorry but something might be wrong on this server..';
exit();
}
このように、
ユーザーのidと名前を一覧表示させるアプリにします。
ローカルのファイルをAWSのnginx内に送る
ターミナルで、
scp -i ~/.ssh/[鍵名] -r 送りたいファイルの絶対パス ec2-user@パブリックDNS:/usr/share/nginx/html/
を実行します。
これで、
ローカルのファイルをAWSの/usr/share/nginx/html/に送ります。
MySQL内にデータベース作成
まだMySQL内にデータベースを作成していないため、これから作成します。
サーバーを構築する際に行った手順と同様に、
アプリケーションサーバーにターミナルでSSH接続します。
ssh -i ~/.ssh/[鍵名] ec2-user@パブリックIP
その後、アプリケーションサーバーからMySQLに接続します。
mysql -h [RDSのエンドポイント] -P 3306 -u [ユーザー名] -p
その後、
MySQL内で、
practieのデータベースを作成し、usersというテーブルを作ります。idとnameのカラムを作り、
適当にいくつかのレコードを挿入します。
データが表示されるか確認
実際にパブリックIPにアクセスして、データが表示されるか確認してみます。
404エラー
ここで、404エラーが発生しました。
以前に接続確認まで行っていたので、
なんで404エラー?
と思いました。
nginxのconfigの設定をみると、全てのエラーが404に返っていたようです。
また、エラー原因は、php71-pdoがインストールされていないことでした。
よって、
sudo yum install -y php71-pdo
をインストール。
その後、アクセスして、確認します。
could not found driverエラー
could not found driverというエラーが出ました。これは、
PHP7+Nginx+MariaDBでPDO接続したとき"could not find driver"が出た際にやったこと
を参考に解決しました。
アクセスしてデータを表示
AMIを使ってインスタンスをコピー
ALBを使って負荷分散をさせるために、EC2インスタンスを複製させます。
[[AWS] EC2 インスタンスのコピーを作成]
(https://agohack.com/aws-duplicate-ec2-instance/)
を参考に、 コピーのインスタンスを作成します。
その後、
Elastic IP を新しいインスタンスに割り当てます。
ALBを作成
[ALB(Application Load Balancer)を導入する]
(https://qiita.com/kobayashi-m42/items/9f6dd14ad1e4dc7cab4c)
を参考にALBを作成します。
セキュリティグループには以前に作った既存のものを選択します。
ターゲットには、作成したEC2インスタンスを二つ登録します。
片方のnginxを停止
EC2サーバーの片方のnginxをストップさせます。
EC2内のターミナルで、
sudo service nginx stop
ブラウザ確認
その後、ロードバランサーのDNSにアクセスして、起動しているか確認します。
片方のサーバーが動いた状態で、無事にアクセスできれば成功です。
