明示的な SQL ロールで TiDB Cloud Starter をクエリする
このワークフローでは、3 つの SQL ロールを一度だけ準備し、その後は各ステートメントに対して最小権限のロールを明示的に選択します。各コマンドでデータベースパスワードを扱うことなく、対話的または自動化されたスキーマ操作、データ操作、検証作業に利用できます。
仕組み
従来のデータベース接続では、1 つの認証情報を使用し、その認証情報の権限がセッション中維持されます。これに対して、ti db create-db-sql-users は 3 つの固定 ID を作成し、それらの認証情報をローカルに保存します。execute-sql-statement を呼び出すたびに 1 つの ID を選択して 1 つのステートメントを実行するため、確認ステップで書き込み権限や管理者権限を保持し続ける必要がありません。
前提条件
tiを設定します。- アクティブな TiDB Cloud Starter インスタンス ID を選択します。
ステップ 1. SQL ユーザーを準備する
ti db create-db-sql-users \
--db-cluster-id "<cluster-id>"
このコマンドは冪等であり、read_only、read_write、admin の認証情報を作成または修復します。
ステップ 2. スキーマ変更には admin を使用する
ti db execute-sql-statement \
--db-cluster-id "<cluster-id>" \
--admin \
--sql "CREATE DATABASE IF NOT EXISTS role_demo"
ti db execute-sql-statement \
--db-cluster-id "<cluster-id>" \
--admin \
--database role_demo \
--sql "CREATE TABLE IF NOT EXISTS messages (id BIGINT PRIMARY KEY, body VARCHAR(255))"
ステップ 3. データ変更には read-write を使用する
ti db execute-sql-statement \
--db-cluster-id "<cluster-id>" \
--read-write \
--database role_demo \
--sql "INSERT INTO messages(id, body) VALUES (1, 'hello') ON DUPLICATE KEY UPDATE body = VALUES(body)"
ステップ 4. 検証には read-only を使用する
ti db execute-sql-statement \
--db-cluster-id "<cluster-id>" \
--read-only \
--database role_demo \
--sql "SELECT id, body FROM messages ORDER BY id" \
--output text
期待される結果には、ID 1 と body hello が含まれます。
ステップ 5. 接続環境を整形する
表示する代わりに、出力を保護されたローカルファイルへ直接書き込みます。
umask 077
ti db format-db-connection-string \
--db-cluster-id "<cluster-id>" \
--read-only \
--database role_demo \
--format env \
--env-include-database-url > .env.tidb
.env.tidb をコミットしないでください。
--format env を使用すると、このコマンドは TIDB_HOST、TIDB_USER、TIDB_PASSWORD などの個別の TIDB_ 接続変数を書き出します。--env-include-database-url オプションを指定すると、単一の MySQL 接続 URL を受け付けるアプリケーション向けに DATABASE_URL の値も追加されます。
クリーンアップ
ti db execute-sql-statement \
--db-cluster-id "<cluster-id>" \
--admin \
--sql "DROP DATABASE role_demo"
rm -f .env.tidb
セキュリティに関する注意
- 各ステートメントでは、最小権限の明示的なロールを使用してください。
tiは 1 回の呼び出しにつき 1 つの SQL ステートメントを受け付けます。- HTTPS はデフォルトの SQL 実行トランスポートです。代わりに直接 TLS MySQL 接続を開くには、
--transport mysqlを指定してください。CLI が自動的にトランスポートを切り替えることはありません。 - 接続文字列および環境変数の出力には認証情報が含まれます。