Help us understand the problem. What is going on with this article?

【AWS】初心者が EC2 + RDS で簡単なサーバー構築とアプリケーションを動かすまでの手順

概要

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)が割り当てられない時の解決法

EC2上でNginxとphp-fpmをインストール

こちらの記事を参考にnginxとphpーfpmをインストール。テストファイルで接続確認まで行います。
AWSのEC2で行うAmazon Linux(nginx・php7.1-fpm)環境構築

EC2からRDS内のMySQLにPDO接続

簡単なアプリケーションでPDO接続を行います。
そのため、
1、ローカルでアプリケーション作成
2、ローカルのファイルをAWSのnginx内に送る
3、MySQL内にデータベース作成
4、接続して確認
の順序で行います。

ローカルでアプリケーション作成

PDOでMySQLからデータを持ってくることが目的のため、簡単なアプリを作ります。

index.php
<?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というテーブルを作ります。idnameのカラムを作り、
適当にいくつかのレコードを挿入します。

データが表示されるか確認

実際にパブリック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"が出た際にやったこと
を参考に解決しました。

アクセスしてデータを表示

このようにデータが表示され、無事に確認ができました。
スクリーンショット 2019-11-21 14.12.07.png

AMIを使ってインスタンスをコピー

ALBを使って負荷分散をさせるために、EC2インスタンスを複製させます。

[AWS] EC2 インスタンスのコピーを作成
を参考に、 コピーのインスタンスを作成します。

その後、
Elastic IP を新しいインスタンスに割り当てます。

ALBを作成

ALB(Application Load Balancer)を導入する
を参考にALBを作成します。

セキュリティグループには以前に作った既存のものを選択します。
ターゲットには、作成したEC2インスタンスを二つ登録します。

片方のnginxを停止

EC2サーバーの片方のnginxをストップさせます。
EC2内のターミナルで、

sudo service nginx stop

ブラウザ確認

その後、ロードバランサーのDNSにアクセスして、起動しているか確認します。

片方のサーバーが動いた状態で、無事にアクセスできれば成功です。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away