個人開発や学習等でDBを使うにあたり、無料でサーバーを運用する方法をまとめました。 GCP上での構築手順(VMインスタンス作成、セキュリティ対策、mysqlインストール、簡単な疎通確認まで)になります。
Google Cloud PlatformのAlways Freeとは
DBサーバーの構築
>VMインスタンス作成
GCPコンソールより、[Compute Engine]>[VM インスタンス]を選択します。・名前:dbsvr
・リージョン :us-central1,us-west1,us-east1
・ゾーン :xxx-a
・マシンタイプ:f1-micro1台
・ブートディスク:標準永続ディスク ストレージは30GB
・イメージ :Debian BNU/Linux9(stretch) ※プレミアム以外
・ファイアウオール:httpとhttpsを許可
・ネットワークタグ:※なし
・ネットワーク:default
・サブネットワーク:default
・内部IP:エフェメラル
・外部IP:スタティック
>請求アラートの設定
請求発生時のアラートを検知するために、請求アラートを設定します。GCPコンソールより、お支払いの[予算とアラート]を選択します。
・予算名 :
・予算額 :1月の予算額
・対象プロジェクト:すべて
・アラートの設定:1月の予算の到達額のいつアラートを出すか
不要な外部IPアドレスの削除
GCPコンソールより、[ネットワーキング]>[外部IPアドレス]を選択します。使用するインスタンス以外のスタティックIPアドレスを削除します。
インスタンスの初期設定
GCPコンソールより、[Compute Engine]-[VM インスタンス]より、SSH接続にてサーバにログインします。
apixxxx@dbsvr:~$ sudo apt-get -y update
apixxxx@dbsvr:~$ sudo apt-get -y install git
apixxxx@dbsvr:~$ sudo pip install --upgrade setuptools
apixxxx@dbsvr:~$ sudo pip install --upgrade google-cloud
apixxxx@dbsvr:~$ sudo apt-get install dbus
apixxxx@dbsvr:~$ sudo timedatectl set-timezone Asia/Tokyo
メモリの拡張
GCPの環境については f1-micro(vCPU x 1、メモリ 0.6 GB)という要は最低スペックで作られているので、SWAP領域は0なので、拡張が必要です。
apixxxx@dbsvr:~$ sudo free
total used free shared buffers cached
Mem: 604380 159344 445036 156 2260 19948-/+
buffers/cache: 137136 467244
Swap: 0 0 0
apixxxx@dbsvr:~$ 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, 26.8912 s, 39.9 MB/s
apixxxx@dbsvr:~$ sudo mkswap /swapfile
apixxxx@dbsvr:~$ sudo swapon /swapfile
SSHのポート番号変更
apixxxx@dbsvr:~$ sudo vi /etc/ssh/sshd_config
--------------------------------------
# OpenSSH is to specify options with their default value where
# default value.
Port 40022
:wq
--------------------------------------
apixxxx@dbsvr:~$ systemctl restart sshd.service
apixxxx@dbsvr:/$ netstat -tlpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Programname
tcp 0 0 0.0.0.0:40022 0.0.0.0:* LISTEN -
ファイアーウォールルール設定(SSHのポート番号許可)
GCPコンソールより、[VPCネットワーク]>[ファイアーウォール ルール]を選択します。・名前:allow-40022
・送信と受信 :上り※ターゲット向け
・一致した時のアクション:許可
・ターゲット :allow-40022-svr
・ソースフィルタ :ソース範囲
・ソースIP範囲 :0.0.0.0/0
・プロトコルとポート:TCP:40020
・名前:disallow-00022
・送信と受信 :上り※ターゲット向け
・一致した時のアクション:許可しない
・ターゲット :disallow-00022-svr
・ソースフィルタ :ソース範囲
・ソースIP範囲 :0.0.0.0/0
・プロトコルとポート:TCP:00022
GCPコンソールより、[Compute Engine]>[VM インスタンス]>[ネットワークタグ]を選択します。
・ターゲット:allow-40022-svr,disallow-00022-svr
SSHのポート番号変更確認
GCPコンソールより、[Compute Engine]-[VM インスタンス]より、SSH接続(カスタムポート)にてサーバにログインします。MySQL(mariaDB )インストール
mysql_secure_installation コマンドで状態を初期化してroot パスワードを設定します。
apixxxx@dbsvr:~$ sudo apt install mysql-server mysql-client
…
apixxxx@dbsvr:/$ sudo mysql_secure_installation
Enter current password for root (enter for none):※なし
Change the root password? [Y/n] y
New password: xxxx
Re-enter new password: xxxx
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y
MySQL管理ユーザ作成
初期状態の DB root ユーザ認証に unix_socket 認証プラグインが使われているため、DB root として接続するために OS のroot 権限でなければいけません。
apixxxx@dbsvr:/$ sudo mysql -u root
MariaDB [none ]> use mysql;
MariaDB [mysql]> SELECT User, Host, plugin FROM mysql.user;
+---------+-----------+-------------+
| User | Host | plugin |
+---------+-----------+-------------+
| root | localhost | unix_socket |
+---------+-----------+-------------+
MariaDB [mysql]> CREATE USER 'apixxxx'@'localhost' IDENTIFIED BY 'apixxxx';
MariaDB [mysql]> GRANT ALL PRIVILEGES ON *.* TO 'apixxxx'@'localhost';
MariaDB [mysql]> UPDATE user SET plugin='' from mysql.user WHERE
User='apixxxx';
MariaDB [mysql]> FLUSH PRIVILEGES;
MariaDB [(none)]> SELECT User, Host, plugin FROM mysql.user;
+---------+-----------+-------------+
| User | Host | plugin |
+---------+-----------+-------------+
| root | localhost | unix_socket |
| apixxxx | localhost | |
+---------+-----------+-------------+
MySQLサービスの自動起動、起動、停止、状況のまとめ
apixxxx@dbsvr:/$ sudo systemctl enable mysqld.service
apixxxx@dbsvr:/$ sudo systemctl start mysqld.service
apixxxx@dbsvr:/$ sudo systemctl stop mysqld.service
apixxxx@dbsvr:/$ sudo systemctl status mysqld.service
MySQLサービスのエラー確認の仕方
apixxxx@dbsvr:/etc/mysql$ ls
conf.d debian.cnf debian-start mariadb.cnf mariadb.conf.d my.cnf
my.cnf.fallback
apixxxx@dbsvr:/etc/mysql$ cat my.cnf
--------------------------------------
# The MariaDB configuration file
[client-server]
# Import all .cnf files from configuration directory
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mariadb.conf.d/
--------------------------------------
apixxxx@dbsvr:/etc/mysql$ cd /etc/mysql/mariadb.conf.d/
apixxxx@dbsvr:/etc/mysql/mariadb.conf.d$ cat 50-server.cnf
--------------------------------------
log-error= /var/log/mysql/error.log
--------------------------------------
apixxxx@dbsvr:/etc/mysql/mariadb.conf.d$ cat /var/log/mysql/error.log
--------------------------------------
InnoDB:Cannot allocate memory for the buffer pool.
--------------------------------------
MySQL(mariaDB )外部アクセスの許可
・ソースIPを許可
apixxxx@dbsvr:/$ cd /etc/mysql/mariadb.conf.d
apixxxx@dbsvr:/$ chmod 777 50-server.cnf #permission
apixxxx@dbsvr:/$ vim 50-server.cnf
--------------------------------------
# bind-address = 127.0.0.1
:w !sudo tee %
:q!
--------------------------------------
apixxxx@dbsvr:/$ sudo systemctl restart mysqld.service #再起動
・TCPポート3306番でListenを確認
apixxxx@dbsvr:/$ netstat -tlpn
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Programname
tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN -
ファイアーウォールルール設定(MySQLのポート番号許可)
GCPコンソールより、[VPCネットワーク]>[ファイアーウォール ルール]を選択します。・名前:allow-03306
・送信と受信 :上り※ターゲット向け
・一致した時のアクション:許可
・ターゲット :allow-03306-svr
・ソースフィルタ :ソース範囲
・ソースIP範囲 :0.0.0.0/0
・プロトコルとポート:TCP:03306
GCPコンソールより、[Compute Engine]>[VM インスタンス]>[ネットワークタグ]を選択します。
・ターゲット:allow-03306-svr