Amazon Lightsail の CentOS に構築した MySQLサーバーに Laravel で接続する1/3 ~ リーズナブルな学習用クラウドサーバーの構築 ~
はじめに
PHP(Laravel)を学習するにあたり、MySQLサーバーを用意することにした。
ローカルマシンにインストールして、1台のPC内でLaravelアプリケーションと繋ぐだけではあまり楽しくない。クラウド上に自分専用のDBサーバーが欲しいと思ったのだ。
AWS には「Amazon Lightsail」という 月額 3.50 USD ~利用できるVPS(仮想プライベートサーバー)のサービスがあることを知り、自分のようなライトなユーザーにはちょうど良いと感じた。
Amazon Lightsail には 最初から LAMP 環境構築済みのイメージも用意されているが、今欲しいのはDBサーバーだけ。それに、始めから便利なものを使うよりも勉強になるだろう。
そういう訳であえて、 CentOS に MySQL をインストールする作業をしている。
目次
環境構築
前提
- AWSアカウントを作成済みであること
- ローカルマシンのOS:Windows10
AWS上で構築するもの
- OS : CentOS 7.6(64ビット)
- DB: MySQL Community Server 8.0.16
CentOSの構築(Amazon Lightsail)
CentOSインスタンスの作成
Lightsailのホーム画面で、インスタンスタブ内に表示されている「インスタンスの作成」ボタンをクリックする。
表示された「インスタンスを作成する」画面で、各項目に指定した値は以下の通り。
インスタンスロケーションの選択
- リージョンの選択:日本
- アベイラビリティーゾーンの選択:ゾーンA
インスタンスイメージの選択
インスタンスプランの選択
- 並べ替えに「月次料金」を指定して表示される「$3.50 USD」を選択する。
インスタンスを確認
設定値に問題ないことを確認し、最後に「インスタンスの作成」ボタンをクリックする。
再びLightsailのホーム画面が表示される。ここで新しいインスタンスの作成が開始されていることがわかる。
「保留中」が「実行中」になれば、CentOS環境の完成。「保留中」から「実行中」までの時間は30秒くらい。 ※待っている間、ブラウザのリロードボタンを数秒間隔で押しながら時間を計ってみた。
実行中になったインスタンス。右上の“・”が縦に3つ並んだアイコンがメニュー。
グローバルIPアドレスの固定設定
このままでも使えるが、インスタンスに対してメニューから 停止 → 起動 の操作を行うとグローバルIPアドレスの値が変わってしまう。これを防ぐために静的IPを作成することができる。
※再起動した際にもIPアドレスの値が変わってしまう可能性があると思うが、この時に何度か試した際は変わることはなかった。
インスタンスのメニューアイコン > 管理 をクリックし、インスタンスに関する設定を行う画面を表示する。
設定画面の ネットワーキングタブにある「静的IPのアタッチ」をクリックする。
プルダウンに表示された静的IPアドレスの識別名を選択し、決定アイコン(緑のチェック)をクリックする。これだけ。
ピンマークが表示され、割り振られた静的なグローバルIPアドレスは「3.114.2.13」であることがわかる。
インスタンスへの接続(専用コンソールからのSSH)
ホーム画面に戻って、インスタンスに接続する。インスタンス右上のアイコンをクリックすると専用のウィンドウでインスタンスに接続され、CentOSにログイン状態になる。
専用コンソールにはローカルのWindowマシンからテキストもコピー&ペーストできる。
しかしながらこのコンソールは日本語の入力ができないようで、セッション切れとなるまでの時間も短い。Windowsユーザーであれば Tera Term を使うと快適だと思う。接続方法については以下の別記事でまとめている。
以下のコマンドでCentOSのバージョンが「7.6.1810」であることが確認できた。
$ cat /etc/redhat-release CentOS Linux release 7.6.1810 (Core)
MySQLの構築(CentOS)
インストール方法について
ここからはCentOS内での作業となる、Amazon Lightsailの専用コンソールから操作していく。 今回、MySQLのインストールはCentOSのyumコマンドを利用する。
インストールに必要となるプログラムはインターネット上で公開されているリポジトリからダウンロードすることになる。
yumコマンドによって、MySQLの構築に必要なプログラムを適切なバージョンでダウンロードしインストールすることができる。
MySQLの公式サイトでは、MySQLのYumリポジトリを利用したインストールの手順が記載されている。 dev.mysql.com
以下、この手順に従ってインストールを進めていく。
MySQLのYumリポジト(CentOSのリポジトリリスト登録)
リポジトリからプログラムをダウンロードするために、「CentOSのリポジトリリスト」に「MySQLサーバーのインストールに必要なプログラムがダウンロードできるリポジトリ」が登録されている必要がある。
MySQL公式のYumレポジトリでは、RPMパッケージファイル(拡張子は.rpm)が提供されている。
RPMパッケージファイルは、インストールに必要となる関連プログラムや、それらプログラムの適切なバージョンなどが定義されたバイナリファイルである。 このパッケージファイルにより、MySQLで必要となるリポジトリがCentOSのリポジトリリストに登録される。
バイナリファイルがダウンロードできるURLは公式サイト(https://dev.mysql.com/downloads/repo/yum/)の手順で示されているMySQLのYumレポジトリで分かる。
アクセスすると、OSバージョンごとのRPMパッケージファイルをリストで確認できる。
今回は、CentOSのバージョンが7.xなので対象は「mysql80-community-release-el7-3.noarch.rpm」となる。
公式サイトの構成がわかりにくいのだが、「Download」ボタンをクリックするとダウンロード画面に遷移する。
遷移先画面の下部にある「No thanks, just start my download.」リンクを右クリックしてRPMパッケージファイルがダウンロードできるURLをコピーする。
Amazon Lightsailのコンソールに戻って、CentOSでcurlコマンドを使って先のURLからRPMパッケージファイルをダウンロードする。
$ cd /tmp # /tmpで作業する $ curl -OL https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
ダウンロードしたRPMパッケージ使ってインストールを行う 。以下のコマンドを実行することで、CentOSのリポジトリリストにMySQLで必要となるリポジトリが登録される。
$ sudo yum localinstall mysql80-community-release-el7-3.noarch.rpm
リポジトリが登録されたことの確認。
$ yum repolist enabled | grep "mysql.*-community.*" mysql-connectors-community/x86_64 MySQL Connectors Community 108 mysql-tools-community/x86_64 MySQL Tools Community 90 mysql80-community/x86_64 MySQL 8.0 Community Server 113
リポジトリからMySQLをインストールする
以下のコマンドでインストールを実行する。
途中、何度か質問によりインストールが中断するが、いずれも 「y」 で答えれば良い。Complete! が表示されたらインストールは正常に終了。
$ sudo yum install mysql-community-server
MySQLがインストールされていることの確認。
$ mysqld --version /usr/sbin/mysqld Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)
MySQLの起動
MySQLの公式サイトにあるとおり、以下のコマンドを実行する。
ここで、エラー発生…。
エラーの内容を調べる前に、そもそもRedirecting to…
とあるように結局はsudo systemctl start mysqld.service
というコマンドが実行されているようだ。
$ sudo service mysqld start Redirecting to /bin/systemctl start mysqld.service Job for mysqld.service failed because the control process exited with error code. See "systemctl status mysqld.service " and "journalctl -xe" for details.
エラーメッセージに表示されている通り以下のコマンドを実行してみる。
Process: 14521 …
の箇所でFAILUREとなっているが、これだけではよく分からない。
$ sudo systemctl status mysqld.service ● mysqld.service - MySQL Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled) Active: failed (Result: exit-code) since Wed 2019-07-03 16:35:34 UTC; 11min ago Docs: man:mysqld(8) http://dev.mysql.com/doc/refman/en/using-systemd.html Process: 14521 ExecStart=/usr/sbin/mysqld $MYSQLD_OPTS (code=exited, status=1/FAILURE) Process: 14443 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS) Main PID: 14521 (code=exited, status=1/FAILURE) Status: "SERVER_BOOTING" Error: 2 (No such file or directory)
ログファイルも見てみる。
最初に問題がありそうなのは mmap(137363456 bytes) failed; errno 12
の箇所。
$ less /var/log/mysqld.log 2019-07-03T16:35:27.359073Z 0 [System] [MY-013169] [Server] /usr/sbin/mysqld (mysqld 8.0.16) initializing of server in progress as process 14474 2019-07-03T16:35:31.100685Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: Yqef0Rqt49%+ 2019-07-03T16:35:32.252962Z 0 [System] [MY-013170] [Server] /usr/sbin/mysqld(mysqld 8.0.16) initializing of server has completed 2019-07-03T16:35:34.498300Z 0 [System] [MY-010116] [Server] /usr/sbin/mysqld (mysqld 8.0.16) starting as process 14521 2019-07-03T16:35:34.552738Z 0 [ERROR] [MY-012681] [InnoDB] mmap(137363456 bytes) failed; errno 12 2019-07-03T16:35:34.554643Z 1 [ERROR] [MY-012956] [InnoDB] Cannot allocate memory for the buffer pool 2019-07-03T16:35:34.554675Z 1 [ERROR] [MY-012930] [InnoDB] Plugin initialization aborted with error Generic error. 2019-07-03T16:35:34.554703Z 1 [ERROR] [MY-010334] [Server] Failed to initialize DD Storage Engine 2019-07-03T16:35:34.554804Z 0 [ERROR] [MY-010020] [Server] Data Dictionary initialization failed. 2019-07-03T16:35:34.556028Z 0 [ERROR] [MY-010119] [Server] Aborting 2019-07-03T16:35:34.556642Z 0 [System] [MY-010910] [Server] /usr/sbin/mysqld: Shutdown complete (mysqld 8.0.16) MySQL Community Server - GPL. (END)
MySQLサーバーの起動エラー対応(Swap領域の割当て)
いろいろ調べたところSwap領域が0なのが原因だと分かった。
free
コマンドでシステムの物理メモリとスワップメモリの使用量、空き容量を確認。
$ free total used free shared buff/cache available Mem: 497116 86312 251912 8924 158892 360512 Swap: 0 0 0
dd
コマンドで指定サイズ(とりあえず1024MB)の空ファイルを作成する。
$ sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB) copied, 14.5036 s, 74.0 MB/s
mkswap
コマンドでスワップ領域を用意する。
$ sudo mkswap /swapfile Setting up swapspace version 1, size = 1048572 KiB no label, UUID=0978f14c-540e-442f-9518-bdb5ad76a9c7
swapon
コマンドでスワップ領域を有効にする。
$ sudo swapon /swapfile swapon: /swapfile: insecure permissions 0644, 0600 suggested.
free
コマンドで再度、スワップメモリの確認。
スワップ領域が作成されていることが確認できる。
$ free total used free shared buff/cache available Mem: 497116 86284 7864 8924 402968 360180 Swap: 1048572 0 1048572
再起動した時にマウントされるように、/etc/fstab
を開き、
$ sudo vi /etc/fstab
/etc/fstab
の最下行に以下の1行を追加し、保存して閉じる。
※/etc/fstab
に定義を追加しても、AWS Lightsail では CentOS インスタンスを 停止 → 起動 操作すると、インスタンス起動時にswap領域マウントされなかった。その場合は改めてsudo swapon /swapfile
を実行する必要がある。
/swapfile swapswap defaults 0 0
これで、MySQLサーバーが起動できるはず。
$ sudo service mysqld restart Redirecting to /bin/systemctl restart mysqld.service
エラーは解消された!!ログも確認しておく。
ステータスを見るとちゃんとactive (running)
になっており、無事起動していることが確認できた。
$ sudo systemctl status mysqld.service ● mysqld.service - MySQL Server Loaded: loaded (/usr/lib/systemd/system/mysqld.service; enabled; vendor preset: disabled) Active: active (running) since Wed 2019-07-03 17:25:15 UTC; 1min 13s ago Docs: man:mysqld(8) http://dev.mysql.com/doc/refman/en/using-systemd.html Process: 14710 ExecStartPre=/usr/bin/mysqld_pre_systemd (code=exited, status=0/SUCCESS) Main PID: 14737 (mysqld) Status: "SERVER_OPERATING" CGroup: /system.slice/mysqld.service └─14737 /usr/sbin/mysqld Jul 03 17:24:59 ip-172-26-1-15.ap-northeast-1.compute.internal systemd[1]: Starting MySQL Server... Jul 03 17:25:15 ip-172-26-1-15.ap-northeast-1.compute.internal systemd[1]: Started MySQL Server.
MySQLサーバーへのログイン
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%+
初期パスワードを使用してMySQLサーバーにログインする。無事にログインできた。
$ mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.16 Copyright (c) 2000, 2019, 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>
おわりに
やはり、非常に勉強になった。インストールから構築まで自分でやってみてよかったと思う。
クラウドはもちろんオンプレミス環境においても、まっさらなLinuxマシンにDBサーバーを構築するという経験をこれまでにしたことがなかった。
改めて知らないことがたくさんあるということを思い知った。しかしながら、知らなかったことを知り、理解していく楽しさも感じることができた。
今回構築したMySQLサーバーを対象に、Laravelアプリケーションと接続するための初期設定について、以下に別記事としてまとめている。 pachiquli.hatenablog.com
参考にさせて頂いた記事
- https://www.atmarkit.co.jp/ait/articles/1609/23/news012.html
- http://tech-blog.rakus.co.jp/entry/2017/12/14/105052
- https://qiita.com/madaran0805/items/ae0532a7436e1c684e72
- https://www.atmarkit.co.jp/ait/articles/1707/07/news014.html
- https://www.atmarkit.co.jp/ait/articles/1711/30/news027.html
- https://wa3.i-3-i.info/word11744.html
- https://kazmax.zpp.jp/cmd/m/mkswap.8.html