Amazon Lightsail の CentOS に構築した MySQLサーバーに Laravel で接続する2/3 ~ MySQLの初期設定編 ~
はじめに
前回、Amazon Lightsail 上で構築した CentOS(Linux)に MySQLサーバーのインストールを行った。
MySQLサーバーをインストールし、rootユーザーにてログインをしたものの、データベースやユーザー、テーブルの作成などは一切行っておらず、MySQLサーバーはまっさらな状態であった。
今回は MySQLサーバーの初期設定を行い、ローカルマシンで作成した Laraveアプリケーションからクラウド上のMySQLサーバーに直接アクセスして使えるようにするための事前準備を行っていく。
目次
前提
クラウド環境(Amazon Lightsail)
- OS: CentOS(64ビット)
- DB: MySQL Community Server 8.0.16
ローカル環境
- OS:Windows10(64ビット)
- Laravel : 5.8.16
- Git Bash:2.19.1(代わりに Powershell やコマンドプロンプトを使っても良い)
- その他ツール(なくても良い)
- A5:SQL Mk-2(データベース接続クライアント)
- Tera Term(ターミナルエミュレーター:Amazon Lightsailへssh接続できる)
Amazon Lightsail のファイアウォール設定
Amazon Lightsail の管理画面から、対象のインスタンスの管理画面を開き、「ネットワーク > ファイアウォール > ルールの編集」リンク から以下の通り、許可するポート番号を設定する。
MySQLの初期設定
CentOSインスタンスへの接続(専用コンソールからのSSH)
Amazon Lightsail の管理画面で「接続 > SSH を使用して接続」ボタンをクリックすると専用のウィンドウでインスタンスに接続され、CentOSにログイン状態になる。
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 OPTION
とPROXY
以外の権限をすべて付与する。
※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