EC2のPython3からRDSを使う
前置き
どうも地元の衰退を願っている人です。
今日はPythonからRDSへ接続できるように環境構築をします。
前回の続きです
EC2の環境構築
必要なライブラリをインストールする
これをしないと pip install でエラーが出ます[1]
amazon Linuxだと gccが入ってないのでインストールする必要があります
sudo yum install python3-devel mariadb-devel mariadb gcc -y
どうでもいい余談[2]
Complete! と表示されたらインストール完了です
pipで必要なライブラリをインストールする
pip3 install mysqlclient
Successfully installed と表示されたら成功です。
RDS
RDSインスタンスを作る
まずはRDSの画面に行きます そうしなければ(ry
次に「データベース」を選択します。
オレンジ色の「データベースの作成」をクリックします。
・ エンジンのオプション Mariadb
・ エンジンバージョン 10.6.10 (お試しなので極端に古くなければ問題無い)
・ テンプレート 開発/テスト
・ DB インスタンス識別子 お好みで
・ マスターユーザー名 お好みで
・ マスターパスワード お好みで
「以前の世代のクラスを含める」 のチェックを入れる
・ DB インスタンスクラス バースト可能クラス (t クラスを含む) db.t2.micro
・ ストレージタイプ 汎用SSD (gpt2)
・ ストレージ割り当て 20 gib
・ ストレージの自動スケーリング ストレージの自動スケーリングを有効にする のチェックを外す
・ 可用性と耐久性 スタンバイインスタンスを作成しないでください
・ コンピューティングリソース EC2 コンピューティングリソースに接続
・ EC2 インスタンス 前回作成した物を選択
・ VPC セキュリティグループ (ファイアウォール) 新規作成
・ 新しい VPC セキュリティグループ名 RDS-SG (分かればなんでも良い)
・ データベース認証 パスワード認証
・ モニタリング 拡張モニタリングの有効化 のチェックを外す
・ 追加設定 「自動バックアップを有効にします」のチェックを外す
最後にオレンジ色の「データベースの作成」を押せば作成出来ます。
待ちます (長い)
こうなればOKです
EC2から接続する
エンドポイントを確認します。
EC2から以下のコマンドで接続します。
mysql -h エンドポイント -u マスターユーザー名 -p
Enter password と表示された後 マスターパスワードを入力してスクショのように入れたらおkです
データベースとテーブルを作る
データベースを作成しテーブルを作ります
CREATE DATABASE test;
use test;
CREATE TABLE title (id int AUTO_INCREMENT, title VARCHAR(10), INDEX(id) );
CREATE TABLE body (id int AUTO_INCREMENT, body VARCHAR(100), INDEX(id) );
Query OKと表示されたら問題ないです。
データをINSERTする
INSERT INTO title (title) VALUES ('Hello');
INSERT INTO body (body) VALUES ('<br>good aws');
Query OKと表示されたら問題ないです。
SELECT して確認する
SELECT * FROM title;
SELECT * FROM body;
正しくデータが入っていれば問題ないです。
サンプルプログラムを動かす
gitlabから落とす
from wsgiref.simple_server import make_server
import json
import MySQLdb
connection = MySQLdb.connect(
host='ddfgdfgdfgfdgdfgrfsdfe.ap-northeast-1.rds.amazonaws.com',
user='admin',
passwd='pass',
db='test')
cursor = connection.cursor()
cursor.execute("SELECT * FROM title; SELECT * FROM body;")
row1 = cursor.fetchall()
#https://qiita.com/methane/items/10e211cc68534f5a9e24
cursor.nextset()
row2 = cursor.fetchall()
def app(environ, start_response):
status = '200 OK'
headers = [
('Content-type', 'text/html; charset=utf-8'),
#('Accddess-Control-Allow-Origin', '*'),
]
start_response(status, headers)
html = """
<html>
<head>
<title> {title} </title>
</head>
<body>
Hello AWS
{str1}
</body>
</html>
"""
strs = str()
html = html.replace('{title}', row1[0][1])
for i in row2:
print(i)
strs += i[1]
html = html.replace('{str1}', strs)
return [html.encode('utf-8')]
with make_server('', 8080, app) as httpd:
print("Start server")
httpd.serve_forever()
https://gitlab.com/-/snippets/3624998/raw/main/simple-web-python_for_db.py
ハードコードされた値を書き換える
以下の値を書き換えます。
host= エンドポイント
user= マスターユーザー名
passwd= マスターパスワード
connection = MySQLdb.connect(
host='goodaws.ap-northeast-1.rds.amazonaws.com',
user='admin',
passwd='114514',
db='test')
cursor = connection.cursor()
sedコマンドを使って書き換えるならこんな感じです。
sed -i 's/ddfgdfgdfgfdgdfgrfsdfe.ap-northeast-1.rds.amazonaws.com/goodaws.ap-northeast-1.rds.amazonaws.com' simple-web-python_for_db.py
sed -i "s/passwd='pass'/passwd='114514'/" simple-web-python_for_db.py
プログラムを動かす
いよいよ動かします。
python3 simple-web-python_for_db.py
ブラウザからアクセスする
前回調べたIPアドレスをブラウザに貼り付けてアクセスします。
出たー!出た! 出たぁ〜
-
参考元 https://stackoverflow.com/questions/63342767/command-errored-out-with-exit-status-1-python-setup-py-egg-info-check-the-logs ↩︎
-
mariadbていう名前のパッケージ名ですが
本体をインストールしたい場合はmariadb-serverというパッケージを入れる必要があるようです
クライアントだけしかインストールされないなら
他のOSみたいに mariadb-client ていうパッケージ名で良いじゃんと思うのは自分だけでしょうか ↩︎
Discussion