💽

初めての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ファイル作成

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で自動化します。

株式会社プログデンス
設定によりコメント欄が無効化されています