🐧

EC2のPython3からRDSを使う

2023/02/16に公開

前置き

どうも地元の衰退を願っている人です。
今日は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アドレスをブラウザに貼り付けてアクセスします。


出たー!出た! 出たぁ〜

脚注
  1. 参考元 https://stackoverflow.com/questions/63342767/command-errored-out-with-exit-status-1-python-setup-py-egg-info-check-the-logs ↩︎

  2. mariadbていう名前のパッケージ名ですが
    本体をインストールしたい場合はmariadb-serverというパッケージを入れる必要があるようです
    クライアントだけしかインストールされないなら
    他のOSみたいに mariadb-client ていうパッケージ名で良いじゃんと思うのは自分だけでしょうか ↩︎

Discussion