TiDB Cloud APIでServerlessクラスタの作成、接続、削除をやってみた

2024.01.31

こんにちは、ゲームソリューション部のsoraです。
今回は、TiDB Cloud APIでServerlessクラスタの作成、接続、削除をやってみたことについて書いていきます。

はじめに

TiDB CloudのAPIのドキュメントは以下です。
TiDB Cloud API | PingCAP Docs

こちらを参考にAPIを試していきます。
前提条件として、API keyは作成済みとします。

プロジェクトIDの確認

まずTiDB CloudのプロジェクトIDを確認するため、プロジェクトの一覧を表示します。
ページやページサイズは、ドキュメント記載の例にならって指定していますが指定なしでも実行可能です。(デフォルト値は、page:1、page siza:10)

$ curl --digest \
  --user 'YOUR_PUBLIC_KEY:YOUR_PRIVATE_KEY' \
  --request GET \
  --url 'https://api.tidbcloud.com/api/v1beta/projects?page=1&page_size=10' | jq

{
    "items": [
      {
        "id": "{project id}",
        "org_id": "xxxxx",
        "name": "xxxxx",
        "cluster_count": 0,
        "user_count": x,
        "create_timestamp": "1706144291",
        "aws_cmek_enabled": false
      },
      {
        ...
      }
    ],
    "total": 2
  }

ちなみに、プロジェクトの作成もAPI経由で実行することが可能です。
設定値はTiDB Cloudの画面上で作成するときと同じで、プロジェクト名とCMEKの有効/無効です。(GUI上で消せないため今回は実行していません。)

$ curl --digest \
  --user 'YOUR_PUBLIC_KEY:YOUR_PRIVATE_KEY' \
  --request POST \
  --url https://api.tidbcloud.com/api/v1beta/projects \
  --header 'content-type: application/json' \
  --data '{"name":"Project0","aws_cmek_enabled":false}'

クラスタの作成

次にクラスタを作成します。
今回は無料枠のあるServerless Tierでクラスタを構築します。
ドキュメント確認すると、ip access listが必須となっており、記述しないとエラーとなります。
ただし、Serverless TierではIPアクセスリストはサポートされていないため、Serverless Tierにおいては設定自体におそらく意味がないと思います。(設定したリスト外のIPアドレスからの接続もできたため)

$ curl --digest \
  --user 'YOUR_PUBLIC_KEY:YOUR_PRIVATE_KEY' \
  --request POST \
  --url https://api.tidbcloud.com/api/v1beta/projects/{project_id}/clusters \
  --header 'content-type: application/json' \
  --data '{"name":"Cluster0","cluster_type":"DEVELOPER","cloud_provider":"AWS","region":"ap-northeast-1","config":{"root_password":"password_example","ip_access_list":[{"cidr":"8.8.8.8/32","description":"My IP Address"}]}}' | jq

{
  "id": "{cluster id}"
}

クラスタが作成できたかを確認してみます。

$ curl --digest \
  --user 'YOUR_PUBLIC_KEY:YOUR_PRIVATE_KEY' \
  --request GET \
  --url https://api.tidbcloud.com/api/v1beta/projects/{project_id}/clusters/{cluster_id} | jq

  {
    "id": "{cluster id}",
    "project_id": "{project_id}",
    "name": "Cluster0",
    "cluster_type": "DEVELOPER",
    "cloud_provider": "AWS",
    "region": "ap-northeast-1",
    "create_timestamp": "1706661572",
    "config": {
      "port": 4000,
      "components": {
        "tidb": {
          "node_size": "Shared0",
          "node_quantity": 1
        },
        "tikv": {
          "node_size": "Shared0",
          "storage_size_gib": 0,
          "node_quantity": 1
        },
        "tiflash": {
          "node_size": "Shared0",
          "storage_size_gib": 0,
          "node_quantity": 1
        }
      }
    },
    "status": {
      "tidb_version": "v6.6.0",
      "cluster_status": "AVAILABLE",
      "node_map": {
        "tidb": [],
        "tikv": [],
        "tiflash": []
      },
      "connection_strings": {
        "default_user": "{default user}",
        "standard": {
          ...
        },
        "vpc_peering": {
          ...
        }
      }
    }
  }

ちなみに、一覧表示することも可能です。

$ curl --digest \
  --user 'YOUR_PUBLIC_KEY:YOUR_PRIVATE_KEY' \
  --request GET \
  --url 'https://api.tidbcloud.com/api/v1beta/projects/{project_id}/clusters?page=1&page_size=10'

クラスタへの接続

次に作成したクラスタへ接続します。
MySQL CLIが使える環境で以下コマンドを実行します。
パスワードはクラスタ作成時にconfigで指定したroot_password、ユーザはクラスタ作成後に確認した情報の中のdefault_userです。
ゲートウェイのリージョンなどは必要に応じて書き換えてください。

$ mysql --comments \
  -u '{default user}' \
  -h gateway01.ap-northeast-1.prod.aws.tidbcloud.com \
  -P 4000 \
  -D 'test' \
  --ssl-mode=VERIFY_IDENTITY \
  --ssl-ca=/etc/pki/tls/certs/ca-bundle.crt \
  -p'{root_password}'

クラスタの削除

最後にクラスタを削除します。

$ curl --digest \
  --user 'YOUR_PUBLIC_KEY:YOUR_PRIVATE_KEY' \
  --request DELETE \
  --url https://api.tidbcloud.com/api/v1beta/projects/{project_id}/clusters/{cluster_id} | jq

{}

削除できたかを確認するため、作成後に実行したクラスタの情報確認を実行してみます。

$ curl --digest \
  --user 'YOUR_PUBLIC_KEY:YOUR_PRIVATE_KEY' \
  --request GET \
  --url https://api.tidbcloud.com/api/v1beta/projects/{project_id}/clusters/{cluster_id} | jq

{
  "code": 49900004,
  "message": "cluster not found",
  "details": []
}

cluster not foundとなっており、クラスタが削除できていることが確認できました。

その他API

今回は実行していませんが、Dedicated Tierであれば、クラスタ内のコンポーネントの変更(スケールインアウトなど)、手動バックアップの取得やリストア実行なども可能です。

手動バックアップについて、現状でServerless Tierではサポートされていないため、サポートされてAPIができた際は触ってみたいと思います。

最後に

今回は、TiDB Cloud APIでServerlessクラスタの作成、接続、削除をやってみたことを記事にしました。
どなたかの参考になると幸いです。