環境構築

AWSにおけるLAMP環境構築(構築編)

前回の記事(事前準備編)で、請求関連までの設定が完了しました。
今回は、各サービスを利用してサーバー自体の環境を構築していきます!

今回は以下の流れでご紹介していきます。

Webサーバー(EC2)

いよいよWebサーバーの準備に入ります。
AWSの場合は色々なサービスがありますが、汎用的に利用できるサーバーを
EC2(Elastic Compute Cloud)と呼んでおり、これを利用します。

インスタンスの作成

①まず、リージョンを確認しましょう。
※AWSでは、サーバーのある国毎にリージョンが設定されています。
AWSは世界中にあるサーバー群から選択して設定することが可能です。
Webサーバー等外部との接続をおこなう場合、より近い方がレスポンス等早くなりますので
なるべくネットワークアクセスが近い国を選択すると良いでしょう。
また、国によって利用料金も異なってきますので用途によっては安い国を選択するのも一つの選択肢です。
国ごとの料金詳細はこちら。

②今回は国内利用を想定していますので「アジアパシフィック (東京)」リージョンを選択します。

①希望のリージョン(今回は東京)が選択されていることが確認できます。
②全てのサービスから「EC2」をクリック。


①「インスタンスの作成」ボタンをクリック。

①今回は無料利用枠の範囲で構築しますので「無料利用枠のみ」をチェック
②好みのOSの「選択」ボタンをクリック。今回はRedHatを選択しました。
③「クイックスタート」にも複数のOSが並んでいますが、CentOS等を選択したい場合もあるかと思います。
その場合は「AWS Marketplace」タブを選択し、検索窓に「CentOS7」等と入力してください。
④Marketplaceでも無料対象にはこちらの画面と同様の「無料利用枠の対象」という表示がありますので、そちらを参考に選択すると良いでしょう。

インスタンスタイプとは、いわゆるマシンスペックです。
適切なスペックを選んでいきましょう。スペックアップ等はサーバーの停止を伴いますので慎重に。
①「無料利用枠の対象」となっている「t2.micro」を選択(初期状態で選択されています)
②「次の手順:インスタンスの詳細の設定」ボタンをクリック。

①1つの環境で、複数のVPCを構成している場合はこちらで対象となるネットワークを選択してください。
初期は他に作成していないので「デフォルト」で問題ありません。
②冗長構成等作成する場合には、適切な「アベイラビリティゾーン」を選択してください。
今回は1台構成のため「デフォルト」で問題ありません。
③本番環境の場合、インスタンスの削除はサービスの停止等のタイミング等限られた場合になると思います。
その場合はこちらを選択して、誤った削除から保護しましょう。
今回は検証環境で削除予定がありますので、チェックはしていません。
④「次の手順:ストレージの追加」ボタンをクリック。

①初期状態では10Gとなっていますが、他にインスタンスを作成する予定がなければ30Gまでは無料範囲で広げられます。
②ストレージの選択が終わったら「次の手順:タグの追加」ボタンをクリック。

目的、所有者、環境などさまざまな方法で分類するためのタグを設定できます。
今回はその他の利用予定がありませんので、そのまま進みます。
①「次の手順:セキュリティグループの設定」ボタンをクリック。

サーバーを運用したことがある方は解ると思いますが、不正アクセスというものは非常に多くあります。
弊社で運用しているサーバーでも、毎日不正アクセスを検知・排除しています。
AWSのセキュリティグループはいわゆるファイアウォールと同等の機能で、サーバーにパケットが到達する前に防いでくれます。
EC2サーバーは立ち上がったと同時に、インターネット上に公開されてしまいます。
まずは最小限の公開範囲とすることで、不正なアクセスをされないようにしておきましょう。

①「新しいセキュリティグループを作成する」を選択。
②名称、説明文を設定。
③「タイプ」のプルダウンより「SSH」を選択。
④「ソース」のプルダウンより「マイIP」を選択。
※固定IPサービスを利用されていない方は「任意の場所」を選択。
⑤「確認と作成」ボタンをクリック。

①表示内容を確認し、問題ないようでしたら「作成」ボタンをクリック。

初回アクセスは、ここで作成するキーを利用してアクセスします。
①「新しいキーペアの作成」を選択。既存のキーがある方は、そちらを設定することも可能です。
②キーペア名を入力します。
③「キーペアのダウンロード」ボタンをクリック。
④キーペアをダウンロードすると「インスタンスの作成」ボタンが活性化されますので、そのままクリック。

インスタンスが作成状態となりました。

①メニューより、「インスタンス」をクリック。
②しばらくすると、図のような起動状態(インスタンスの状態がrunning)となります。
③起動が完了すると、パブリックIPとプライベートIPが決まります。
この情報は後ほど利用しますので、メモ等控えておいてください。

DBサーバー(RDS)

それでは、DBサーバー(RDS)の設定に参りましょう。
いきなりインスタンス作成!と進みたいところですが、事前準備が必要です。

RDS用セキュリティグループ作成

まずはRDS用のセキュリティグループを用意します。
ここで、先ほどのEC2からのみアクセスを許可する設定を用意しておきます。

①EC2ダッシュボードのまま、メニューより「セキュリティグループ」をクリック。
②「セキュリティグループの作成」ボタンをクリック。

①グループ名を記入します。
②EC2と同じVPCを選択してください。
複数のVPCを作成していない場合は、デフォルトで問題ありません。
③「タイプ」のプルダウンより「カスタムTCP」を選択。
④MySQLで利用するポートを指定。MySQLのデフォルトポートは「3306」です。
⑤先ほど作成したEC2の画面で確認した「プライベートIP」を設定。
IPアドレスはCIDR表記で記載する必要があります。
⑥全ての入力が完了したら「作成」ボタンをクリック。

RDSパラメータセット作成

RDSはデフォルトのパラメータセットの内容を変更できません。
また、パラメータグループの付け替えにも再起動が必要になってしまいます。
そのため、あらかじめパラメータグループを作成しておきましょう。

RDSのダッシュボードに移動します。
①左上のサービスをクリックし、一覧を表示。
②「データベース」グループから「RDS」をクリック。

①「RDSダッシュボード」に移動したら「パラメータグループ」をクリック。
②「パラメータグループの作成」ボタンをクリック。

①「パラメータグループファミリー」は多数の選択肢がありますが、
今回作成するのは「mysqlの5.7」ですので、それを選択します。
②「グループ名」と「説明」には、それぞれ分かりやすい名称と説明を入力してください。
③「作成」ボタンをクリック。

RDSインスタンスの作成

ここから、RDSインスタンスの作成に入ります。

RDSインスタンスの作成に入ります。
①メニューより「インスタンス」をクリック。
②「DBインスタンスの起動」ボタンをクリック。

①今回は無料利用枠の範囲で構築しますので「無料利用枠のみの対象」をチェック。
②①でチェックを入れたことにより、対象ではないメッセージが出力されるようになりました。
③「MySQL」タブをクリック

①「選択」ボタンをクリック。

①先ほどパラメータグループで選択したのと同じバージョンを選択してください。
今回は執筆段階の最新である、「mysql 5.7.19」としています。
②適用したいストレージ容量を設定。
20Gまでは無料利用枠です。
③接続に必要な情報を決めて入力します。
④設定が完了したら「次のステップ」ボタンをクリック。

①EC2と同じVPCを選択してください。
②外部から直接アクセスさせる必要はないため、パブリックアクセスはできないようにします。
③ここで、先ほどRDS用に作成したセキュリティグループを選択してください。
④データベースの名前を入力してください。
⑤「DBパラメータグループ」へは、先ほど作成したグループを選択してください。
⑥バックアップの保存期間とタイミングを設定します。
開始時刻は「UTC」で設定する必要があることに注意してください。
⑦RDSの状態をモニタリングするかを選択します。
状態把握をする必要がある場合は、こちらで「はい」を選択します。
⑧マイナーバージョンの自動アップグレードを有効にするかを決めます。
アップグレードをする際には、サーバーが再起動されます。
今回は検証環境のため「はい」にしていますが、
サービス停止が許容できる環境でない限りは「いいえ」を選択するべきです。
こちらも開始時刻は「UTC」で設定する必要があることに注意してください。
⑨全ての項目の設定が完了し「DBインスタンスの作成」ボタンをクリックするとインスタンスの作成が始まります。

EC2と同様、インスタンスの作成が完了するまで少しの時間がかかります。

インスタンス作成が完了した画面です。
①ステータスが「利用可能」となっています。
②エンドポイントも決まりました。
この情報を元に、EC2より接続しますのでこちらの情報も控えておいてください。

DBサーバーへのコマンドでの接続

4章までの項目で、事前準備が整いました。
では、実際にMySQLに接続できるかの確認までおこなってみましょう。

ログイン

ここではターミナルソフトとして「TeraTerm」を利用しています。

①EC2のインスタンス作成時に確認したグローバルIPアドレスを記載してください。
※グローバルIPはElasticIP(固定IP)を設定していない場合、
インスタンスの停止、起動で変わるので注意してください。

②「OK」ボタンをクリック。
初回のみセキュリティ警告が出ると思いますが、IPに誤りがなければ問題ありませんのでそのまま「続行」ボタンをクリックして進んでください。

接続が完了すると、ログインプロンプト(ログイン情報の入力画面)が表示されます。
もし表示されない場合は、IPの誤りやセキュリティグループ等で弾かれている可能性がありますので再度確認してみてください。
①ユーザー名を入力します。RedHatの初期ユーザーは「ec2-user」です。
※この名称は選択したOSによって異なります。
分からない場合は「root」で接続を試みてください。
正しい鍵ファイルでrootに接続した場合にのみログインが可能なユーザーが表示されます。
それでも表示されない場合は鍵ファイルを誤っていますので、確認しなおしてください。

②EC2インスタンスを生成した際にダウンロードしたプライベートキーファイルを指定します。
※保存フォルダーに鍵ファイルが表示されない場合は「秘密鍵ファイル」のみ表示となっている可能性がありますので、その場合はプルダウンより「すべてのファイル(*.*)」を選択することにより表示されます。
③「OK」ボタンをクリック

図のようになれば、ログイン完了です。

コマンドでの接続

まずは接続に必要なコマンドをインストールします。

RedHat7の場合、mariaDB という MySQL 互換データベースがデフォルトでインストールされている可能性があります。
競合しないよう、アンインストールしておきます。

# 確認
yum list installed | grep maria

# アンインストール
yum remove mariadb-libs

続いて、mysqlクライアントのインストールを行います。

# yumリポジトリの追加
rpm -ivh http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm

# インストール
yum install mysql

インストールができたら、mysqlコマンドにて接続してインスタンス作成時に作ったDBができているか確認してみましょう。
下記コマンドの「ホスト名」「ポート」はRDSインスタンスの箇所で確認したものに置き換えてください。
ユーザー名やコマンド実行後に聞かれるパスワードはインスタンス作成時に決めたものになります。
mysql -h [ホスト名] -P [ポート] -u master_hogehoge -p

下記はサンプルでの出力内容です。

[ec2-user@ip-172-31-25-157 ~]$ mysql -h test-hogehoge.xxxxxxxxxx.ap-northeast-1.rds.amazonaws.com -P 3306 -u master_hogehoge -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 124
Server version: 5.7.19-log MySQL Community Server (GPL)

Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| hogehoge_db        |
| innodb             |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
6 rows in set (0.00 sec)


ここまでできましたら、AWS側でおこなうLAMP環境構築の事前準備は完了です。
次は、PHPからも接続してみます。

DBサーバーへのPHPでの接続

ここからはWebサーバー上に環境を用意していきます。

Aapcheインストール

まずはapacheをインストールします。apacheはyumリポジトリに、httpdという名前で登録されています。

yum install httpd

この一行のみでApacheのインストールは完了です。
※ここでは、設定をシンプルにするために一番簡単な方法をとっています。
この場合はバージョンが最新ではなかったりしますので注意してください。
最新が欲しい場合は、別なリポジトリやソースからのインストールを検討してみてください。

念のため、バージョンを確認しておきましょう。

[root@ip-172-31-25-157 ~]# httpd -v
Server version: Apache/2.4.6 (Red Hat Enterprise Linux)
Server built:   Oct  3 2017 09:37:04

バージョン2.4.6がインストールされたことが分かりました。

それでは、自動起動の設定と共にApacheを起動してみましょう。

# 自動起動設定
systemctl enable httpd.service

# Apache起動
systemctl start httpd.service

# ポート確認
netstat -lanput | grep http 
tcp6       0      0 :::80                   :::*                    LISTEN      8023/httpd     

ここで一度AWSの管理画面に戻ります。なぜか?
ここでピンときた方は、理解してついてきていますね!
前回作成した「セキュリティグループの設定」で、EC2へのHTTPアクセスは拒否してしまっているからです!

HTTPアクセス用セキュリティグループ設定

それでは、許可設定を追加していきましょう。

①「EC2ダッシュボード」の「セキュリティグループ」をクリック。
②自IPを許可した設定をクリック。
③「インバウンド」タブをクリック。
④「編集」ボタンをクリック。

①「ルールの追加」ボタンをクリック。

①プルダウンより「HTTP」を選択。
②プルダウンより「マイIP」を選択。
③「保存」ボタンをクリック。
※ここでは検証環境のため自IPのみを許可としていますが、一般公開する場合は別途セキュリティグループを作成しインバウンドのソースを全て許可にして、インスタンスに適用してください。

これで、自分のIPからのHTTP接続が許可されました。
では、さっそく接続してみましょう!

ブラウザーのアドレスバーに「http://サーバーのIPアドレス」と入力してアクセスしてみてください。
図のようなページが表示されれば成功です!

PHPインストール

続いてPHPのインストールを行います。

※後学のために記載しておきますが、この章でのインストールは最終的にアンインストールしますので実行する必要はありません。
お時間のない方は次章の「PHP7.2のインストール」までお進みください。

yum install php

はい。PHPもこの一行のみでインストールは完了です。
こちらも、何のバージョンがインストールされたか確認してみましょう。

[root@ip-172-31-25-157 ~]# php --version
PHP 5.4.16 (cli) (built: Oct  4 2017 03:09:42) 
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies

2018年2月1日時点では、Redhatのyumリポジトリからは「PHP5.4.16」がインストールされました。
これ、2015年には既にサポートが終了しているバージョンですね。
せめてセキュリティサポート期間内だったら良かったのですが。

手順を簡略化したい所ですが、サポートが終了しているものを利用するわけにはいきません。
このPHPはアンインストールします。
ここでは、依存性があるとして同時にインストールされたものも一緒に削除していきます。
※インストールした実行結果に記載がありますので、実行した方はご確認ください。
その際に、他で利用していないかの確認は忘れずに。

yum remove php libzip php-cli php-common

PHP7.2のインストール

まずは、yumコマンドが参照するリポジトリを追加します。

epelリポジトリ

yum install http://dl.fedoraproject.org/pub/epel/7/x86_64/Packages/e/epel-release-7-11.noarch.rpm

remiリポジトリ

yum install http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

上記コマンドを実施することにより、下記へ参照先の設定が格納されます。

ls /etc/yum.repos.d/

[root@ip-172-31-25-157 src]# ls /etc/yum.repos.d/
epel.repo             mysql-community-source.repo     redhat-rhui.repo  remi-php71.repo  remi-safe.repo
epel-testing.repo     redhat.repo                     remi-php54.repo   remi-php72.repo  rhui-load-balancers.conf
mysql-community.repo  redhat-rhui-client-config.repo  remi-php70.repo   remi.repo

ようやく準備ができました。PHPのインストールにかかりましょう。
remi-phpXX.repoの数値がバージョンを表しています。
今回は執筆段階最新の7.2系をインストールします。mysqlとの接続も行いますので、一緒に「php-mysql」もインストールしています。

yum install --enablerepo=remi-php72 php php-mysql

先ほどと同じくバージョンを確認してみましょう。

[root@ip-172-31-25-157 src]# php --version
PHP 7.2.2 (cli) (built: Jan 30 2018 13:44:49) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

無事にバージョン「7.2.2」が入りました。
ではここで、実際にアクセスしてPHPが動作するか確認してみましょう。
動作確認用にPHPファイルを作成します。今回は、Apacheの設定を特に変更せずデフォルトで確認します。

[root@ip-172-31-25-157 src]# vi /var/www/html/info.php
<?php
phpinfo();

これだけです。
phpinfoという関数は、現在の設定情報等を確認するのに非常に便利な関数です。
確認のために、覚えておくとよいでしょう。
ですが、自分の情報を開示してしまうことになりますので、
テスト環境以外では必ず自分以外がアクセスできない場所に配置するよう心がけてください。

お次はMySQLとの接続です!

接続ができたら、画面に接続できたメッセージが表示されるプログラムになります。

[root@ip-172-31-25-157 src]# vi /var/www/html/connect_mysql.php
<?php

$mysqli  = new mysqli('test-hogehoge.ckfo5p8ojwnw.ap-northeast-1.rds.amazonaws.com', 'master_hogehoge', 'hogehogepw', 'hogehoge_db', '3306');
if ($mysqli->connect_error) {
  echo 'データベースに接続できませんでした。';
  echo '<hr>';
  echo $mysqli->connect_error;
}
else {
  echo 'データベースに接続できました!';
}

失敗した場合は、下部に表示されている内容から修正してください。

まとめ

いかがでしたでしょうか?
確認項目を含め、かなり詳細に記載したつもりでしたが、うまくいきましたでしょうか?
AWSは色々な検証に利用するのにも便利ですので、ぜひトライしてみてください!

LINEで送る
Pocket

この記事を書いた人・プロフィール
issa
ニックネーム: issa

カタリスト創業メンバーの一人。
主にPHPを使う事が多いですが、過去にかじった言語は無数にあります。
社内NWの構築や各サーバの管理等インフラ周りも担当してます。

趣味:お酒、バイク、音楽(主にロックかボカロ)