初めてのAmazon RDS
はじめに
昨年AWSクラウドプラクティショナー、ソリューションアーキテクトの資格を取得したものの、
業務でAWSのサービスを触る機会がほとんどないため、構築経験を積むべく
Amazon RDS(Amazon Relational Database Service)の検証をやってみることにしました。
投稿前までのAWS経験
- EC2を立てたことがある
- Amazon VPC(Amazon Virtual Private Cloud)やセキュリティグループの設定を
見たことがある - ALB(Application Load Balancer)の設定変更をしたことがある
- Amazon WorkSpaceを立ててキッティングしたことがある
前提
- 今回の構成や検証手順はAIなどを参考に、構築、検証を行っています。
- VPC、サブネット、ルートテーブル等は作成済みのものを使用します。
検証概要/構成
FlaskでWebサーバを立て、curl実行してDBに追加、削除できるか検証を行います。
- EC2:Amazon Linux
- python
- Flask
- Amazon RDS
EC2作成
EC2 > インスタンス > インスタンスを起動
OSはAmazon Linux(t3.micro)を指定

他はデフォルト通りだが、後々対象サーバへSSHをするためにキーペアを作成しておく

RDS作成
Aurora and RDS > データベースより、「データベースの作成」クリック
MySQLを指定

シングルAZを指定

EC2接続
作成されたデータベースを選択し、アクション > EC2 接続のセットアップ をクリックする
基本的にデフォルト設定のまま
テーブル作成
EC2へSSHでログイン(デフォルトのec2-user、作成した公開鍵を使用)
mariadbをインストール
sudo yum install mariadb105 -y
データベースへアクセス
アクセス後に求められるパスワードは先ほど控えたものを使用
mysql -h <RDSのIPアドレスorFQDN> -u admin -p
テスト用のテーブルを作成
CREATE DATABASE testdb;
USE testdb;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100)
);
セキュリティグループ作成
EC2
| 名称 | ルール種別 | ポート範囲 | プロトコル | [イン]送信元 [アウト]送信先 |
備考 |
|---|---|---|---|---|---|
| デフォルトセキュリティグループ | インバウンドルール | 80 | TCP | 0.0.0.0/0 | インターネット外からブラウザでアクセスするために必要 |
| ec2-rds-1 | アウトバウンドルール | 3306 | TCP | rdc-ec2-1 | RDSにてEC2接続時に自動作成 |
RDS
| 名称 | ルール種別 | ポート範囲 | プロトコル | 送信元 | 備考 |
|---|---|---|---|---|---|
| rdc-ec2-1 | インバウンドルール | 3306 | TCP | ec2-rds-1 | RDSにてEC2接続時に自動作成 |
EC2セットアップ
pythonインストール
sudo yum update -y
sudo yum install python3 git -y
pip3 install flask pymysql
app.pyファイル作成
from flask import Flask, request
import pymysql
app = Flask(__name__)
# RDS接続情報
db = pymysql.connect(
host='<RDSのIPアドレスorFQDN>',
user='<RDSユーザ>',
password='<RDSパスワード>',
database='testdb'
)
@app.route('/')
def index():
return 'Hello from EC2!'
@app.route('/create', methods=['POST'])
def create():
name = request.form['name']
cursor = db.cursor()
cursor.execute("INSERT INTO users (name) VALUES (%s)", (name,))
db.commit()
return f'User {name} created!'
@app.route('/read')
def read():
cursor = db.cursor()
cursor.execute("SELECT * FROM users")
result = cursor.fetchall()
return str(result)
@app.route('/delete', methods=['POST'])
def delete():
user_id = request.form['id']
cursor = db.cursor()
cursor.execute("DELETE FROM users WHERE id = %s", (user_id,))
db.commit()
return f'User with ID {user_id} deleted!'
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
app.pyの実行し、Webサーバを起動させる
python3 app.py
検証
検証1:Webアクセス確認
EC2のURLにアクセスして、トップページが表示される

検証2:データ追加確認
自端末のコマンドプロンプトにて下記curlコマンドでポストを実行してRDSへデータを追記
C:\Users\tanabe>curl -X POST -d "name=Tanabe" http://<EC2アドレス>.ap-northeast-1.compute.amazonaws.com/create
User Tanabe created!
C:\Users\tanabe>
:\Users\tanabe>curl -X POST -d "name=Potate Taro" http://<EC2アドレス>.ap-northeast-1.compute.amazonaws.com/create
User Potate Taro created!
C:\Users\tanabe>
追記したデータがWeb画面に表示されることを確認

検証3:データ削除確認
下記を実行し、データ作成、作成したデータが削除されることを確認
C:\Users\tanabe>curl -X POST -d "name=delete-user" http://<EC2アドレス>.ap-northeast-1.compute.amazonaws.com/create
User delete-user created!
C:\Users\tanabe>
C:\Users\tanabe>curl -X POST -d "id=3" http://<EC2アドレス>.ap-northeast-1.compute.amazonaws.com/delete
User with ID 3 deleted!
C:\Users\tanabe>
所感
オンプレサーバだと、mysqlやmariadbをインストールして
初期設定コマンドをいくつか打たないといけないイメージなため、
画面ポチポチですぐDBが使える状態になっているのはとても便利に感じました。
ただ便利さ、可用性などと引き換えに料金のトレードオフはどうしても出てしまうので、
EC2でDBを持たせるのか、Amazon RDSやDinamoDBなどを利用してくのかは
要件ごとに検討していく必要がありそうです。
次回
今回作った構成をTerraformで自動化します。