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サーバーだけ。それに、始めから便利なものを使うよりも勉強になるだろう。

そういう訳であえて、 CentOSMySQL をインストールする作業をしている。

 

目次

 

環境構築

前提

  • AWSアカウントを作成済みであること
  • ローカルマシンのOS:Windows10

AWS上で構築するもの

 

CentOSの構築(Amazon Lightsail)

CentOSインスタンスの作成

Lightsailのホーム画面で、インスタンスタブ内に表示されている「インスタンスの作成」ボタンをクリックする。

f:id:pachiquli:20190703013326p:plain
Lightsailのホーム画面
 

表示された「インスタンスを作成する」画面で、各項目に指定した値は以下の通り。

  • インスタンスロケーションの選択

  • インスタンスイメージの選択

    • プラットフォームの選択:Linux/Unix
    • 設計図の選択:OSのみCentOS
  • インスタンスプランの選択

    • 並べ替えに「月次料金」を指定して表示される「$3.50 USD」を選択する。
  • インスタンスを確認

    • Lightsailリソース名:CentOS-01
      ※サーバーを一意に識別するための任意の名称。
    • 作成するインスタンスの個数:1
      ※2個以上を指定すると同じインスタンスが複数作成される。
      名称は「リソース名-1」、「リソース名-2」…と枝番が付与された名称となる。

設定値に問題ないことを確認し、最後に「インスタンスの作成」ボタンをクリックする。

f:id:pachiquli:20190703013513p:plain
インスタンスを作成する」画面
 

再びLightsailのホーム画面が表示される。ここで新しいインスタンスの作成が開始されていることがわかる。

「保留中」が「実行中」になれば、CentOS環境の完成。「保留中」から「実行中」までの時間は30秒くらい。
※待っている間、ブラウザのリロードボタンを数秒間隔で押しながら時間を計ってみた。

f:id:pachiquli:20190703015646p:plain
インスタンス作成中
 

実行中になったインスタンス。右上の“・”が縦に3つ並んだアイコンがメニュー。

f:id:pachiquli:20190703205345p:plain
インスタンスが実行中になったのを確認
 

グローバルIPアドレスの固定設定

このままでも使えるが、インスタンスに対してメニューから 停止 → 起動 の操作を行うとグローバルIPアドレスの値が変わってしまう。これを防ぐために静的IPを作成することができる。

※再起動した際にもIPアドレスの値が変わってしまう可能性があると思うが、この時に何度か試した際は変わることはなかった。  

インスタンスのメニューアイコン > 管理 をクリックし、インスタンスに関する設定を行う画面を表示する。

f:id:pachiquli:20190703212651p:plain
インスタンスのメニュー > 管理
 

設定画面の ネットワーキングタブにある「静的IPのアタッチ」をクリックする。

f:id:pachiquli:20190703213815p:plain
ネットワーキング > 静的IPのアタッチ
 

プルダウンに表示された静的IPアドレスの識別名を選択し、決定アイコン(緑のチェック)をクリックする。これだけ。

f:id:pachiquli:20190703215655p:plain
静的IPアドレス(識別名)を選択
 

ピンマークが表示され、割り振られた静的なグローバルIPアドレスは「3.114.2.13」であることがわかる。

f:id:pachiquli:20190703215458p:plain
ピンマーク
 

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

ホーム画面に戻って、インスタンスに接続する。インスタンス右上のアイコンをクリックすると専用のウィンドウでインスタンスに接続され、CentOSにログイン状態になる。

f:id:pachiquli:20190703220201p:plain
インスタンスへの接続(専用コンソールからのSSH
 

専用コンソールにはローカルのWindowマシンからテキストもコピー&ペーストできる。

しかしながらこのコンソールは日本語の入力ができないようで、セッション切れとなるまでの時間も短い。Windowsユーザーであれば Tera Term を使うと快適だと思う。接続方法については以下の別記事でまとめている。

pachiquli.hatenablog.com

 

以下のコマンドでCentOSのバージョンが「7.6.1810」であることが確認できた。

$ cat /etc/redhat-release 
CentOS Linux release 7.6.1810 (Core) 

f:id:pachiquli:20190703221602p:plain
専用コンソールでCentOSのバージョンを確認
 

MySQLの構築(CentOS

インストール方法について

ここからはCentOS内での作業となる、Amazon Lightsailの専用コンソールから操作していく。   今回、MySQLのインストールはCentOSyumコマンドを利用する。

インストールに必要となるプログラムはインターネット上で公開されているリポジトリからダウンロードすることになる。

yumコマンドによって、MySQLの構築に必要なプログラムを適切なバージョンでダウンロードしインストールすることができる。

MySQLの公式サイトでは、MySQLYumリポジトリを利用したインストールの手順が記載されている。 dev.mysql.com

 

以下、この手順に従ってインストールを進めていく。

 

MySQLYumリポジト(CentOSリポジトリリスト登録)

リポジトリからプログラムをダウンロードするために、「CentOSリポジトリリスト」に「MySQLサーバーのインストールに必要なプログラムがダウンロードできるリポジトリ」が登録されている必要がある。

MySQL公式のYumレポジトリでは、RPMパッケージファイル(拡張子は.rpm)が提供されている。

RPMパッケージファイルは、インストールに必要となる関連プログラムや、それらプログラムの適切なバージョンなどが定義されたバイナリファイルである。 このパッケージファイルにより、MySQLで必要となるリポジトリCentOSリポジトリリストに登録される。

バイナリファイルがダウンロードできるURLは公式サイト(https://dev.mysql.com/downloads/repo/yum/)の手順で示されているMySQLYumレポジトリで分かる。

アクセスすると、OSバージョンごとのRPMパッケージファイルをリストで確認できる。

今回は、CentOSのバージョンが7.xなので対象は「mysql80-community-release-el7-3.noarch.rpm」となる。

f:id:pachiquli:20190704004348p:plain
MySQLYumレポジトリ
 

公式サイトの構成がわかりにくいのだが、「Download」ボタンをクリックするとダウンロード画面に遷移する。

遷移先画面の下部にある「No thanks, just start my download.」リンクを右クリックしてRPMパッケージファイルがダウンロードできるURLをコピーする。

f:id:pachiquli:20190704004942p:plain
RPMパッケージファイルがダウンロードできるURL
 

Amazon Lightsailのコンソールに戻って、CentOScurlコマンドを使って先の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

 

参考にさせて頂いた記事