Amazon Lightsail の CentOS に構築した MySQLサーバーに Laravel で接続する2/3 ~ MySQLの初期設定編 ~

はじめに

前回Amazon Lightsail 上で構築した CentOSLinux)に MySQLサーバーのインストールを行った。

MySQLサーバーをインストールし、rootユーザーにてログインをしたものの、データベースやユーザー、テーブルの作成などは一切行っておらず、MySQLサーバーはまっさらな状態であった。

今回は MySQLサーバーの初期設定を行い、ローカルマシンで作成した Laraveアプリケーションからクラウド上のMySQLサーバーに直接アクセスして使えるようにするための事前準備を行っていく。

 

目次

 

前提

クラウド環境(Amazon Lightsail)

ローカル環境

 

Amazon Lightsail のファイアウォール設定

Amazon Lightsail の管理画面から、対象のインスタンスの管理画面を開き、「ネットワークファイアウォールルールの編集」リンク から以下の通り、許可するポート番号を設定する。

  • 許可するポート番号
    • ポート22(SSH接続用)
    • ポート3306(MySQLのデフォルト)

f:id:pachiquli:20190707144341p:plain
Amazon Lightsail ファイアウォールの設定

 

MySQLの初期設定

CentOSインスタンスへの接続(専用コンソールからのSSH

Amazon Lightsail の管理画面で「接続SSH を使用して接続」ボタンをクリックすると専用のウィンドウでインスタンスに接続され、CentOSにログイン状態になる。

f:id:pachiquli:20190707150801p:plain
専用ウィンドウでインスタンスに接続

 

MySQLサーバーの起動

CentOSに接続したら、まずはMySQLサーバーを起動する。

$ sudo systemctl start mysqld.service

 

サーバーが起動されているか確認する。

$ sudo systemctl status mysqld.service

 

rootユーザーの初期パスワード確認

MySQLサーバーのインストール時、rootユーザーに設定される初期パスワードはログファイルに出力される。

以下のコマンドでログファイルを確認すると、パスワードはYqef0Rqt49%+であることがわかる。

$ grep 'temporary password' /var/log/mysqld.log
2019-07-03T16:35:31.100685Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: Yqef0Rqt49%+

 

rootユーザーでログイン

初期パスワードを使用してMySQLサーバーにログインする。

$ mysql -u root -p
Enter password: 

 

rootユーザーのパスワード変更

rootユーザーのパスワードは初期パスワードから変更する必要がある。
※初期パスワードのままだと、実行できるするコマンドによっては以下のようなエラーとなり、パスワード変更を促される。

mysql> select host, user from mysql.user;
ERROR 1820 (HY000): You must reset your password using ALTER USER statement before executing this statement.

 

rootユーザーのパスワードを変更する(パスワードをP@ssword123に設定する場合)。

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'P@ssword123';

 

データベースの作成

最初にデータベースの一覧を確認する。MySQLサーバーの情報を管理するデータベースが存在していることがわかる。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.02 sec)

 

データベースを新規作成する(test_dbというデータベースを作成)。

mysql> create database test_db;
Query OK, 1 row affected (0.00 sec)

 

データベースが作成されていることを確認する。test_dbが追加されていることがわかる。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test_db            |
+--------------------+
5 rows in set (0.00 sec)

 

テーブルを作成する

以下のコマンドで現在選択中のデータベースが確認できる。まだ何も選択していない場合はnullとなる。

mysql> select database();
+------------+
| database() |
+------------+
| NULL       |
+------------+
1 row in set (0.00 sec)

 

先に作成したデータベースを選択する。以降、選択したデータベースに対してテーブルを作成していく。

mysql> use test_db
Database changed

 

test_dbが選択されていることを確認する。

mysql> select database();
+------------+
| database() |
+------------+
| test_db    |
+------------+
1 row in set (0.00 sec)

 

以下のコマンドでデータベース内のテーブルを確認できる。今のところ、このデータベース(test_db)では何も作業していないので空となる。

mysql> show tables;
Empty set (0.00 sec)

 

CREATE TABLEコマンドでテーブル(test_users)を作成。

AWS Lightsail専用のコンソールだと日本語の入力ができないようだ。

COMMENTは指定しないか、指定する場合、COMMENT "User Name"のように日本語を使用しないことでSQL実行エラーが防げる。

mysql> CREATE TABLE `test_users` (
    -> `user_name` VARCHAR(100) NOT NULL COMMENT "ユーザー名",
    -> `mail_address` VARCHAR(200) NOT NULL COMMENT "メールアドレス",
    -> `password` VARCHAR(100) NOT NULL COMMENT "パスワード",
    -> `created` datetime DEFAULT NULL COMMENT "登録日",
    -> `modified` datetime DEFAULT NULL COMMENT "更新日"
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Query OK, 0 rows affected, 1 warning (0.04 sec)

 

テーブルが作成されたことを確認する。

mysql> show tables;
+-------------------+
| Tables_in_test_db |
+-------------------+
| test_users        |
+-------------------+
1 row in set (0.01 sec)

 

作成したテーブル構造を確認する。

mysql> desc test_users ;
+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| user_name    | varchar(100) | NO   |     | NULL    |       |
| mail_address | varchar(200) | NO   |     | NULL    |       |
| password     | varchar(100) | NO   |     | NULL    |       |
| created      | datetime     | YES  |     | NULL    |       |
| modified     | datetime     | YES  |     | NULL    |       |
+--------------+--------------+------+-----+---------+-------+
5 rows in set (0.00 sec)

 

さらに詳細を確認する場合はshow full columnsコマンドを実行する。

mysql> show full columns from test_users;
+--------------+--------------+-----------------+------+-----+---------+-------+---------------------------------+-----------------------+
| Field        | Type         | Collation       | Null | Key | Default | Extra | Privileges                      | Comment               |
+--------------+--------------+-----------------+------+-----+---------+-------+---------------------------------+-----------------------+
| user_name    | varchar(100) | utf8_general_ci | NO   |     | NULL    |       | select,insert,update,references | ユーザー名            |
| mail_address | varchar(200) | utf8_general_ci | NO   |     | NULL    |       | select,insert,update,references | メールアドレス        |
| password     | varchar(100) | utf8_general_ci | NO   |     | NULL    |       | select,insert,update,references | パスワード            |
| created      | datetime     | NULL            | YES  |     | NULL    |       | select,insert,update,references | 登録日                |
| modified     | datetime     | NULL            | YES  |     | NULL    |       | select,insert,update,references | 更新日                |
+--------------+--------------+-----------------+------+-----+---------+-------+---------------------------------+-----------------------+
5 rows in set (0.00 sec)

 

レコードを作成する

以下の insert文でレコードを作成すr。

mysql> insert into test_db.test_users(user_name,mail_address,password,created,modified) values ('test-user','test@sample.com','123456','2019/07/07 20:50:49','2019/07/07 20:50:49');
Query OK, 1 row affected (0.01 sec)

 

レコードが作成されたことを確認する。

mysql> select * from test_users;
+-----------+-----------------+----------+---------------------+---------------------+
| user_name | mail_address    | password | created             | modified            |
+-----------+-----------------+----------+---------------------+---------------------+
| test-user | test@sample.com | 123456   | 2019-07-07 20:50:49 | 2019-07-07 20:50:49 |
+-----------+-----------------+----------+---------------------+---------------------+
1 row in set (0.00 sec)

 

Laravelアプリケーション用のユーザーを作成する

Laravel側でMySQLサーバーに接続するために、対象データベース、ユーザーなどを定義をする必要がある。

セキュリティの安全性を考慮した場合、Laravelからはrootユーザーは利用せず、Laravelアプリケーション専用のユーザーを新たに作成したほうが良い。  

ユーザーを作成する

以下のコマンドで新たにユーザー(laravelapp)を作成する。

mysql> create user 'laravelapp'@'localhost' identified by 'L@ravel123';
Query OK, 0 rows affected (0.01 sec)

 

ユーザーが作成されたことを確認する。

mysql> select host, user from mysql.user;
+-----------+------------------+
| host      | user             |
+-----------+------------------+
| localhost | laravelapp       |
| localhost | mysql.infoschema |
| localhost | mysql.session    |
| localhost | mysql.sys        |
| localhost | root             |
+-----------+------------------+
5 rows in set (0.00 sec)

 

ユーザーに操作権限を付与する

現在のlaravelappユーザーの権限は以下の通り。このGRANT USAGEの1行のみ表示されている場合は、まだ権限が付与されていないことを意味する。

mysql> show grants for 'laravelapp'@'localhost';
+------------------------------------------------+
| Grants for laravelapp@localhost                |
+------------------------------------------------+
| GRANT USAGE ON *.* TO `laravelapp`@`localhost` |
+------------------------------------------------+
1 row in set (0.00 sec)

 

以下のコマンドで、laravelappユーザーに対してGRANT OPTIONPROXY以外の権限をすべて付与する。
grantコマンドのオプションは公式サイトに解説あり。

mysql> grant all privileges on test_db.* to 'laravelapp'@'localhost';
Query OK, 0 rows affected (0.00 sec)

 

laravelappユーザーにALL PRIVILEGES権限が付与されたことを確認する。

mysql> show grants for 'laravelapp'@'localhost';
+-----------------------------------------------------------------+
| Grants for laravelapp@localhost                                 |
+-----------------------------------------------------------------+
| GRANT USAGE ON *.* TO `laravelapp`@`localhost`                  |
| GRANT ALL PRIVILEGES ON `test_db`.* TO `laravelapp`@`localhost` |
+-----------------------------------------------------------------+
2 rows in set (0.00 sec)

 

これまでの作業で、DBサーバーの構築はある程度できたと思う。いよいよLaravelからDBサーバーへの接続ができる準備が整った。

 

おわりに

PHP(Laravel) について学習するつもりで始めた環境構築のはずが、いろいろなことでつまずいてしまい、本来の目的であるソースコードフレームワークに関する作業ができていない。

しかしながら、今回MySQLについて基本的なことは学ぶことができたので良い機会になった。

Laravelアプリケーションから、これまでの作業で準備したMySQLサーバーへの接続については、以下に別記事としてまとめている。 pachiquli.hatenablog.com

 

参考にさせて頂いた記事