🐟

TiDB Cloudにローカルから接続してみる...GUIツールとPythonの2パターン

2024/02/20に公開

はじめに

TiDB Cloudを動かしながら学ぶ、アカウント作成〜DB基本操作までの記事にてTiDB Cloud上でSQLを実行することができるようになりました。

今回は、「TiDB Cloud上以外では、どうやってDB接続するんだろう?」を実践していこうと思います。
言語やツール、プログラムを一度に全部試せないので対象を絞らせて頂きましたが下記条件で試します。

# シーン 利用手段
1 開発・本番運用とリリース後考えてローカルからツールによるDB接続 DBeaver
2 AWS上で稼働を目指したローカル開発でのテスト接続 Python(SQLAlchemy)

では、やっていきましょう。

1. DBeaverによるローカルからツールでのDB接続

1-1. TiDB CloudでConnection情報を取得

クラスタを選択します。

右上のConnectボタンを押下します。

  • 「接続先」はPublic、「Connect With」はDBeaverを選択します。
  • Generate Passwordを押してファイルを取得しメモを取りましょう。
  • jdbc...をコピー、メモを取りましょう。

1-2. DBeaverで接続

接続ウィザードから接続タイプでTiDBを検索し次へ。

  • URL: jdbc...を貼り付け
  • ユーザー名: jdbc..のURL内にある xxxxx.rootを貼り付け
  • パスワード: 取得したパスワードを貼り付け

接続しSQLが実行できました。

2. Python(SQLAlchemy)からのDB接続(2パターン目)

2-1. TiDB CloudでConnection情報を取得

  • 「接続先」はPublic、「Connect With」はGeneralを選択します。

2-2. Pythonを実行する

以下、コードは行数を削って見やすくするために簡略化しています。

main.py
import os

from dotenv import load_dotenv
from sqlalchemy import URL, Column, Text, Uuid, create_engine
from sqlalchemy.orm import declarative_base, sessionmaker

load_dotenv()

dsn = URL.create(
    drivername="mysql+pymysql",
    username=os.getenv("TIDB_USER", "root"),
    password=os.getenv("TIDB_PASSWORD", ""),
    host=os.getenv("TIDB_HOST", "127.0.0.1"),
    port=int(os.getenv("TIDB_PORT", "4000")),
    database=os.getenv("TIDB_DB_NAME", "test"),
)

connect_args = {
    "ssl_verify_cert": True,
    "ssl_verify_identity": True,
    "ssl_ca": os.getenv("CA_PATH", ""),
}


engine = create_engine(dsn, connect_args=connect_args, pool_pre_ping=True)
Session = sessionmaker(bind=engine)
Base = declarative_base()


class User(Base):
    __tablename__ = "users"
    uuid = Column(Uuid, primary_key=True)
    name = Column(Text, unique=True)


def sampleQuery():
    with Session() as session:
        result = session.query(User).all()

        for user in result:
            print(f"{user.uuid}, {user.name}")


if __name__ == "__main__":
    sampleQuery()

実行結果、DBの値が出力されました。

b06a54e8-ce4c-11ee-9f44-0aebaf5b2e5a, Alice
b06a5549-ce4c-11ee-9f44-0aebaf5b2e5a, Bob
b06a5596-ce4c-11ee-9f44-0aebaf5b2e5a, Carol
b06a55cd-ce4c-11ee-9f44-0aebaf5b2e5a, Dave
b06a5606-ce4c-11ee-9f44-0aebaf5b2e5a, Ellen

動かしていてわかっている検討中の課題

いくつか、試せていない+調べきれていない都合上、記事にできていないものを列挙します。公式または他の記事を探すことができるかもしれません。(解決した場合は記事をUpdateしていきます)

AWSで動作させる場合の証明書について(解決済)

今回は、ローカルから接続していきますが、実際にはEC2Fargateからアクセスするようなイメージとなります。
証明書はローカルではなく、AWSで動かす場合、以下からダウンロードできるようですが、設定し動作はしていないので仮説が正しいのか検証が必要です。
<追記:2つ対応方法を教えていただいたいています>

  • ConnectダイアログにてOSのディストリビューションに沿ったものを選択すれば良いとのことです。例えばAmazon Linuxであれば公式に公開はされていませんがRedHat系ディストリビューションだと言われていますのでCentOSを指定すればCAファイルのパスを取得できます。つまり、Dockerを使う場合でもイメージのOSが何系ディストリビューションかを理解すれば対処出来るということになります。
  • ConnectダイアログにてあえてWindowsを指定することで、CAファイルがダウンロードできるようになります。これを任意のPathに配置することでも解決できるそうなので、デプロイに混ぜ明示的にPath指定という選択をすることで解決することができます。

VPC内ではPublicではなくPrivateが推奨(解決済)

FargateやEC2などVPC内で動作する場合は、Privateを使いVPCLinkを推奨しているようでした。
推奨理由が現時点では理解できておらず、検証には至っていません。
<追記>
次の記事、TiDB CloudにAWSから接続してみる...PublicとPrivateどちらがよいのかを書きましたのでそちらで説明しています。

Lambdaでコネクション最適化しながら動作させる方法

Pythonでは、Lambdaで動かす方法を調べきれませんでした。AWSでいうRDSProxyを働かせるような実装方法が不明瞭だったため先に進めませんでした。

さいごに

実際にSQLツールやプログラムから動かすことができると、「いよいよ開発に使えるのかな?」と実感が湧いてきますね。本記事ではまだローカルからしか動かせていないのでAWSからも動かせるようになれたら良いなと思います、それはまた別の記事で。
何かの参考になれば幸いです。

Discussion