見出し画像

PythonでAWS RDSを接続


1.従来のデータベース欠陥

従来のインフラで稼働している企業の場合、自社でコンピュータルームを構築することで、独自のデータベースとアプリケーションのニーズを満たすことができる。しかし、これには直接的な資本コストと運営コストが増加してしまう。

例えば、ある中規模の製造業者が社内のデータセンターを設置するとする。この企業は、年間の売上が急速に増加しており、それに伴ってデータ処理能力も大幅に拡張する必要がある。新しいサーバーやストレージ機器を購入し、これらを収容するための専用コンピュータルームを構築するために、まず数千万円の初期投資が必要となる。これに加えて、サーバーの安定稼働を確保するために、専門知識を持つIT技術者を新たに数名雇用しなければならない。この雇用コストも年間数百万円にのぼる。業務量が増えるたびに、サーバーを追加購入する必要があり、各サーバーには高価なライセンス費用が伴う。Windows Serverを購入する場合、1台あたり数十万円がかかる。また、これらの追加サーバーの設置、管理、そして運用環境の維持には多大な労力と費用が必要、新しいラックを設置し、配線を行い、動作確認をするために数週間の労力が必要。さらに、コンピュータルームの運営には「追加の」機器に必要な電力、スペース、冷却要件も考慮しなければならない。新しいサーバーラックを追加するたびに、電力使用量が増え、電気料金が上昇し、夏場には、これらの機器が発する熱を冷却するためにエアコンを24時間稼働させる必要があり、冷却コストも増加する。

このように、自社でコンピュータルームを構築し運営することは、初期投資だけでなく、継続的な運営コストや管理負担も大きくなるため、多くの企業にとっては大きな挑戦となる。

一部の中小企業にとっては、管理や保守にそのような多大な人的資源や資材費を投資するより、クラウド上でセットアップすることで、実行、拡張できる Amazon RDS リレーショナル データベースを直接使用するほうが安全で信頼性が高く、安心。

2.AWS RDS

AWS RDS(Amazon Relational Database Service)はAWS (Amazon Web Services)でリレーショナルデータベースを簡単にセットアップし、運用し、スケーリングすることのできるウェブサービス。

https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/
UserGuide/Welcome.html

これに対して、Amazon RDSを利用することで、ユーザーがクラウドでリレーショナル データベースを簡単にセットアップ、操作、拡張できるようになり、一般的なデータベース管理タスクを実行できる。RDS の主な利点は以下のようになる。

  • マネージドサービス: データベースのインフラストラクチャの管理をAWSに任せることができ、ユーザーはデータベースのセットアップ、パッチ適用、バックアップ、リストアなどの運用タスクから解放される。

  • 複数のデータベースエンジン

  • スケーラビリティ: RDSインスタンスは、必要に応じて簡単にスケールアップまたはスケールダウンできる。ストレージとコンピューティングリソースを分離してスケールさせることも可能。

  • 自動バックアップ: RDSは自動バックアップ機能を提供し、データの復旧を迅速に行えるようなる

  • セキュリティ: VPC(Virtual Private Cloud)を使用したネットワーク分離、IAM(Identity and Access Management)によるアクセス管理、データ暗号化など、様々なセキュリティ機能が組み込まれている。

3.PythonでAWS RDSを接続

3.1 コンソールログイン

まずAWS マネジメントコンソールにログインする。

3.2 セキュリティーグループ

検索バーに「VPC」と入力し、デフォルトのVPCを作成してから、左側のメニューから「セキュリティグループ」を選択し、「セキュリティグループを作成」ボタンをクリックしする。名前と説明を入力し、(今回「rds-python」と名付けた)必要に応じてVPCを選択する。作成したセキュリティグループを以下ように「インバウンドルール」と「アウトバウンドルール」をすべての流量を許可する。そうしないと、後でPythonで接続したら、拒否される可能性があの。

インバウンドルール
アウトバウンドルール

3.3 RDSインスタンス

同様にRDSと検索し、データベースを作成する。ただし、エンジンのタイプを「MySQL」、テンプレートを「無料利用枠」として設定する。DBインスタンス識別子を必要に応じて名前つける。認証情報をセルフマネージドに設定しないと、マスターパスワードを入力することはできない。「インスタンス識別子」及び「マスターパスワード」は後でRDS接続の際に使うから。

データベースの接続VPC セキュリティグループを先程作成したセキュリティグループを選ぶ。全て設定が終わったら、ページ1番下の「データベースの作成」ボタンをクリックする

3.4 RDS接続

作成したRDSインスタンスをクリックすると、詳細情報が表示される。必要となるものは「エンドポイント」と「ポート」.

次に、以下のコマンドでpymysql をインストールする。pymysqlは、PythonプログラムからMySQLデータベースに接続し、操作するためのライブラリである。

!pip install pymysql

今回、RDSClientというクラスを定義し、RDSへの接続および操作を行うためのメソッドが含まれている。RDSデータベースに接続し、成功した場合は True を、失敗した場合は False を返す。接続に成功すると、データベースのバージョン情報を取得して表示される。

import pymysql

class RDSClient:
    def __init__(self, host, user, password, database=None, port=3306):
        """
        Initialize the RDS client with the given connection parameters.

        Parameters:
        host (str): RDS endpoint.
        user (str): RDS username.
        password (str): RDS password.
        database (str): Database name.
        port (int): MySQL port, default is 3306.
        """
        self.host = host
        self.user = user
        self.password = password
        self.database = database
        self.port = port
        self.connection = None

    def connect(self):
        """
        Establish a connection to the RDS database.

        Returns:
        bool: True if connection is successful, False otherwise.
        """
        try:
            self.connection = pymysql.connect(
                host=self.host,
                user=self.user,
                password=self.password,
                database=self.database,
                port=self.port
            )
            print("Connection to RDS successful")
            version = self.query("SELECT VERSION()")
            print(f"Verision {version[0][0]}")
            return True
        except pymysql.MySQLError as e:
            print(f"Error connecting to RDS: {e}")
            return False

    def query(self, sql, params=None):
        """
        Execute a query on the RDS database.

        Parameters:
        sql (str): The SQL query to execute.

        Returns:
        list: Query results as a list of tuples, or None if an error occurs.
        """
        if self.connection is None:
            print("Connection is not established")
            return None

        try:
            with self.connection.cursor() as cursor:
                # cursor.execute(sql)
                cursor.execute(sql, params)
                result = cursor.fetchall()
                return result
        except pymysql.MySQLError as e:
            print(f"Error querying database: {e}")
            return None

    def close(self):
        """
        Close the RDS database connection.
        """
        if self.connection is not None:
            try:
                self.connection.close()
                print("Connection closed successfully")
            except pymysql.MySQLError as e:
                print(f"Error closing connection: {e}")

ここで、host はエンドポイント。user はマスターユーザー名、デフォルトはadmin。password は先設定したマスターパスワード。port は MySQL ポート、デフォルトは 3306。

3.5 データベース及びテーブル作成

 RDSを接続できたら、バージョン情報が表示され、sql でデータベース及びテーブルを作成する。

if __name__ == "__main__":
    rds_client = RDSClient(
        host="RDS ENDPOINT",
        user="Admin",
        password='PASSWORD',
    )

    rds_client.connect()
    
    sql = """
        CREATE DATABASE `singdb`
    """
    print(rds_client.query(sql))

    sql = """
        CREATE TABLE `singdb`.`fingerprint` (
            `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
            `song_name` VARCHAR(200) NULL,
            `high_points` LONGTEXT NULL,
            PRIMARY KEY (`id`)
        ) ENGINE = InnoDB
        DEFAULT CHARACTER SET = utf8mb4
        COLLATE = utf8mb4_general_ci;
    """

    print(rds_client.query(sql))

    sql = "SHOW DATABASES"
    print(rds_client.query(sql))

3.6 出力結果

接続成功のメッセージ以外、3.5で作成した「singdb」が表示された。

4.まとめ

クラウド データベースはすでに成熟したテクノロジーであり、コンピュータrルームの構築に多額の投資をするよりも、安全で信頼性の高い Amazon RDS を直接使用する方がよいでしょう。以上でクラウド データベースが完全に導入され、従来のデータベースとクラウド データベースの間のギャップが明確になった。役立つウェブサイトを共有する


この記事が気に入ったらサポートをしてみませんか?