リレーショナルデータベースの構築方法
本マニュアルでは、Ubuntu 20.04にてMySQLを用いてリレーショナルデータベースの構築を行い、インターネット上にAPIを公開するまでの流れを説明します。 はじめに
以下ドキュメントを先にご覧ください。 前提知識
ライブラリ
使用するライブラリは以下の通りです。
- MySQL 8.0.31
- Python3.8.10
- Flask 2.2.2
- Flask-Cors 3.0.10
- mysql-connector-python 8.0.32
操作手順
ここでは MySQL をインストールし、初期設定を行います。 MySQLの環境構築
- Ubuntu 20.04のインスタンスを作成します。手順については「インスタンスの起動」をご参照ください。 ※ セキュリティグループの設定にて、5000番ポートの受信を許可してください。
- 作成したインスタンスにコンソールでログインします。
- ファイアウォールの設定を行います。以下のコマンドにてファイアウォールを有効化し、5000番ポートの受信を許可します。
- 以下コマンドを実行し、パッケージを最新の状態に更新します。
- MySQL のインストールを行います。
- MySQL にログインします。
- ルートユーザーのパスワードを変更します。
- パスワードの変更が完了したら、一度 MySQL からログアウトします。
- インストール時点の MySQL にはセキュリティ上の問題点があります。それらを改善するため、以下コマンドを入力します。
- ルートユーザーのパスワードを要求されるので、6.で設定したパスワードを入力します。
- パスワードポリシーを設定するかどうかを質問されますので、「y」を入力します。
- ここでは STRONG を選択するため、「2」を入力します。
- パスワードを変更するかどうか質問されますが既に変更済みですので、ここでは「n」を入力します。
- 以降の質問には全て「y」を入力します。これにより MySQL のセキュリティ上の問題点を解決します。
- 以下のコマンドを実行し、再び MySQL にログインします。コマンド実行後、パスワードを聞かれますので、入力してください。
- 次のコマンドを実行し、手動操作用のユーザーを作成します。
- 手動操作用のユーザーに、CREATE・INSERT・SELECTの権限を付与します。
- flask 側から利用するためのユーザーを作成します。ユーザー名は任意ですが、ここでは「flask_user」とします。
- 一度ログアウトします。
- 新たに作成したユーザーでログイン出来ることを確認します。
※ Floating IP を割り当ててください。
$ sudo ufw enable
$ sudo ufw allow 5000
$ sudo ufw reload
$ sudo apt update
$ sudo apt install mysql-server
$ sudo mysql
mysql> ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password by 'パスワード';
mysql> quit
$ sudo mysql_secure_installation
$ sudo mysql -p
mysql> CREATE USER 'ユーザー名'@'localhost' IDENTIFIED BY 'パスワード';
mysql> GRANT CREATE, INSERT, SELECT ON *.* TO 'ユーザー名'@'localhost';
mysql> CREATE USER 'flask_user'@'localhost' IDENTIFIED BY 'パスワード';
mysql> GRANT SELECT ON *.* TO 'flask_user'@'localhost';
※ 17. 及び18.では本チュートリアルで使用する最低限の権限のみ付与しています。他の権限が必要な場合は追加で付与して下さい。
mysql> quit
$ mysql -u ユーザー名 -p
ここでは、簡易なデータベースを構築していきます。操作を始める前に、MySQL に前章15.で作成した手動操作用のユーザーでログインしてください。 データベースの構築
- 以下のコマンドを実行し、データベースを作成します。名称は任意ですが、ここでは「testdb」として進めます。
- データベースの作成を確認します。一覧に1.で作成したデータベースが含まれていれば問題ありません。
- 作成したデータベースを選択し、操作可能な状態にします。
- ID と名前のみをデータとして保持するシンプルなテーブルを作成します。名称は任意ですが、ここでは「users」として進めます。
- テーブルの作成を確認します。
- テストのため、データを一件追加します。
- データの追加を確認します。
mysql> CREATE DATABASE testdb;
mysql> SHOW databases;
mysql> USE testdb;
mysql> CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY, name TEXT);
mysql> SHOW tables;
mysql> INSERT INTO users(name) VALUES('sample_user1’);
mysql> SELECT * FROM users;
ここでは、作成したデータベースをインターネット上から利用できるように、flask を利用して REST API を公開します。 APIの作成と公開
※ セキュリティ上、データベースは公開せず、APIを介して操作するようにしてください。
- もし MySQL にログイン状態であればログアウトし、venv のインストールを行います。
- 作業用のフォルダを作成し、移動します。
- venv によって仮想環境を作成し、仮想環境をアクティブにします。
- 仮想環境内に必要なライブラリをインストールします。
- 以下のプログラムを作成します。下記URLからダウンロードすることもできます。 'password' の箇所に MySQL にて flask_user に設定したパスワードを入力してください。
- 以下のコマンドを実行し、バックグラウンドで flask を実行します。起動後、エンターキーを一度押下すると制御が戻ります。
- まずはローカルで動作を確認します。以下コマンドを実行し、下図のような応答が得られれば成功です。
- 次に外部からのアクセス確認を行います。まず、当該仮想マシンに割り当てた Floating IP を確認します。
- Compute D 外の PC からブラウザ等を使用し「http://<8.で確認したIPアドレス>:5000」にアクセスします。以下のように応答が表示されれば成功です。
- 以下コマンドを実行し、バックグラウンドで実行中のプロセスを確認します。COMMAND 欄を確認し、python で実行したプロセスのプロセス番号(PID)を確認します。
- API のバックグラウンド実行を終了したい場合、以下コマンドを実行します。
$ sudo apt install python3-venv
※ venv は python の仮想環境を作成するためのライブラリです。これにより、システムの python に影響を与えずに環境構築を進めることができ、失敗時の復旧が容易になります。
$ mkdir work
$ cd work
$ python3 -m venv venv
$ source venv/bin/activate
$ pip install flask flask_cors mysql_connector_python
$ wget https://www.mec.docomo.ne.jp/assets/advanced-tutorial/main.py
from flask import Flask, request, jsonify
from flask_cors import CORS
import mysql.connector
app = Flask(__name__)
CORS(app)
# MySQLの接続情報を入力します
connection = mysql.connector.connect(
host = 'localhost',
port = 3306,
user = 'flask_user',
password = 'password',# ここにパスワードを入力してください
database = 'testdb',
)
# ルートで待ち受けします
@app.route('/', methods=['GET'])
def select_all():
connection.ping(reconnect=True)
cursor = connection.cursor()
cursor.execute('SELECT * FROM users')# ここにリクエストの内容を入力してください
response = cursor.fetchall()
results = []
for item in response:
id = item[0]
name = item[1]
results.append(dict(index=id, name=name))
# 結果をjsonにして返します
return jsonify(results=results)
if __name__ == "__main__":
app.run(host="0.0.0.0") # flaskアプリを起動します
$ nohup python3 main.py &
$ curl http://localhost:5000
$ ps u
$ kill -KILL <10.で確認したプロセス番号>