Kinstaのホスティングは、個人から企業まで、あらゆる規模の何千件ものウェブサイトを支えていますが、すべてのサイトの共通して欠かせないのが、データベースの存在です。サイトの規模を問わず、情報はデータベースに格納されます。Kinstaでは、Kinsta APIを使用してデータベースを作成および管理することができます。

専用コントロールパネル「MyKinsta」で管理することももちろん可能ですが、Kinsta APIを利用することで、タスクを自動化することができます。データベースの作成、更新、削除、(ある程度の)読み取り、さらにデータベースを既存のツールやワークフローへの統合も可能です。

今回の記事では、Kinsta APIを利用してデータベースを作成・管理する方法を取り上げます。Kinsta APIを利用する利点やエンドポイントへのアクセス方法、そしてワークフローへの組み込み方についてもご紹介します。

まずはKinsta APIの利点と機能から見ていきましょう。

Kinsta APIの機能

Kinsta APIはKinstaサーバーとやり取りするためのツールで、環境、WordPressのテーマとプラグイン、アプリケーション指標など、サイト管理タスクに役立つ多くのエンドポイントがあります。

データベースでは、一般的なCRUDを通じて以下のようなタスクを実行できます。

  • 単一のエンドポイントを使用してサイトのデータベースを新規作成し、サーバーの場所を選択して、認証情報を設定
  • 企業IDを使ってサーバーのすべてのデータベースを取得し、個別のIDを使って特定のデータベースとその情報を取得
  • データベースのサイズや表示名の変更(リソースを拡張するアプリケーションで有用)
  • 単一のコマンドで不要になったデータベースを削除

このように、エンドポイントを活用することで、データベース管理のワークフロー全体を効率化することができます。後ほど詳しくご説明しますが、続いてはKinsta APIを使用するメリットをご紹介します。

Kinsta APIでデータベースを管理するメリット

データベース管理は、MyKinstaのユーザーインターフェース、またはKinsta APIを介して実行することができ、いずれもワークフローに統合可能ですが、後者には以下のようなメリットがあります。

1. 管理プロセスの合理化

Kinsta APIを介してデータベースを管理する大きな利点は、通常必要になるステップを省略できること。MyKinstaで管理を行う場合、たとえばWordPressサイトであれば、phpMyAdminを通じてデータベースにアクセスできます。

MyKinsta内WordPressサイトの「データベースへのアクセス」セクション
MyKinsta内WordPressサイトの「データベースへのアクセス」セクション

シンプルなユーザーインターフェースで、操作も簡単です。アプリケーションの場合は、左サイドバーから「データベース」画面を開きます。

MyKinstaの「データベース」画面
MyKinstaの「データベース」画面

このように、MyKinstaでの手順も非常にシンプルではありますが、APIエンドポイントを使用すると、上記のような操作をすべて省略することができます。サイトで他のサービスを実行している場合も簡単に組み込むことができ、ワークフローの自動化により、費用の削減と作業の効率化が期待できます。

2. 自動化の可能性

Kinsta APIを使用すると、実行するためにMyKinstaにアクセスする必要のあるタスクを自動化することができます。統合方法については後ほどご説明しますが、すでに既存のツールやスクリプトを実行している場合、データベース管理の自動化をプロセスの一部に組み込むことができます。

例えば、サイトをプロビジョニングするたびにデータベースを作成する機能を導入したり、コード、ツール、スクリプトに定義済みの基準を設定し、データベースを自動削除したりなど。また、データベースのリソースタイプを更新できるため、リソースのスケーリングを組み込んだワークフローにも有益です。

管理プロセスの合理化同様、ワークフローの自動化は、データベース管理に費やす時間(と費用)のさらなる削減につながります。

3. 他のツールやプラットフォームとの統合

APIは一般的に、既存のAPIがない場合でも、利用可能なほぼすべてのツールやプラットフォームと統合することができます。ZapierIf This Then That (IFTTT)のようなサービスで接続でき、Kinstaサーバーも連携可能です。

IFTTTのウェブサイト
IFTTTのウェブサイト

多くの設定では、体験をスムーズなものにするため他のサービスを取り込む必要があります。たとえば、TeamCity、Travis CI、またはBuddyを使用するCI/CD(継続的インテグレーション/継続的デリバリー)の場合、Kinsta APIは、ツールチェーンの一部として、開発から生産までの一貫したワークフローを作成するのに役立ちます。

続いて、Kinsta APIが提供する方法とリクエストについて見ていきます。また記事の最後には、具体的なシナリオを例に挙げ取得した情報の使用方法もご紹介します。

Kinsta APIを使用してデータベースを管理する

databasesエンドポイントは、その他のKinsta APIエンドポイントと同じように簡単に使用できます。後ほど詳しく触れますが、各アクションやワークフローの細部についてはここでは省略します。

databasesエンドポイントにアクセスするには、いくつかの情報が必要になり、最も重要なのがAPIへのアクセスに必要なAPIトークンです。これには、認証のエンドポイントを利用することができます。

APIキーを作成するには、MyKinstaの画面右上のユーザー名をクリックし、「企業の設定」>「APIキー」に移動します。

MyKinstaの「APIキー」画面
MyKinstaの「APIキー」画面

エンドポイントへのアクセスには、基本的に企業IDも必要になります。これは簡単に言えばサーバーのIDであり、MyKinstaにログインすると、ブラウザのツールバー(以下参照)で確認できます。

ブラウザのツールバーに表示されるMyKinstaアカウントの企業ID
ブラウザのツールバーに表示されるMyKinstaアカウントの企業ID

Kinsta APIエンドポイントを使用する際の一般的なワークフローは、APIキーの検証、企業IDに関するデータの取得、サイトIDに関するデータの取得、そしてデータの処理。最後のステップでは、リクエストに適切なパラメータを提供します。

このパラメータは実行したいタスクによって異なります。以下、データベースを管理する手順を取り上げながら見ていきます。

Kinsta APIを使用してデータベースを作成する

データベースの作成は、今回取り上げるリクエストの中でも最も多くの工程が必要になりますが、作業自体はシンプルです。具体的には、POSTリクエストを送信し、そのリクエストが正しく機能するために必要な8つの属性を指定します。属性にはサーバーの位置情報、リソースの種類、データベースの種類、データベースの認証情報などが含まれます。

各パラメータを揃えたら、APIキーの検証とデータベースの作成を実行します。

import fetch from 'node-fetch';


async function run() {
  const resp = await fetch(
`https://api.kinsta.com/v2/databases`,
{
   method: 'POST',
   headers: {
     'Content-Type': 'application/json',
     Authorization: 'Bearer <APIトークン>'
   },
   body: JSON.stringify({
     company_id: '54fb80af-576c-4fdc-ba4f-b596c83f15a1',
     location: 'us-central1',
     resource_type: 'db1',
     display_name: 'test-db',
     db_name: 'test-db',
     db_password: 'example-password',
     db_user: 'example-user',
     type: 'postgresql',
     version: '15'
   })
}
  );

  const data = await resp.json();
  console.log(data);
}

run();

エンドポイントにリクエストを送信すると、レスポンスとして要求したデータがJSON形式で返されます。

{
  "database": {
"id": "54fb80af-576c-4fdc-ba4f-b596c83f15a1"
  }
}

リクエストに失敗した場合も、JSON形式でその旨を受け取ります。

{
  "message": "リクエストに提供されたAPIキーがない、または無効です",
  "status": 401,
  "data": null
}

すべてのリクエストに言えることですが、送受信するデータは安全に保たなければなりません。これについては、APIキーの検証以外にも以下のようなプラクティスがあります。

  • IDやAPIキーのような情報をリクエストに「ハードコーディング」しないこと。環境変数を使用してコードをできる限り匿名化する。
  • エンドポイントの情報が変更されたり、随時新しいデータ保護方法が登場したりする可能性があるため、定期的にKinsta APIの更新をチェックする。
  • APIリクエストのデバッグは、特に複雑な統合の場合、手間のかかる作業になるため、リクエストから返されたレスポンスコードMyKinstaのエラーログ、および主要なデバッグツールと技術をうまく駆使する。

なお、ここでご紹介した情報は、databasesエンドポイントに関連する他の操作にも適用されます。続いては、データベースを削除する方法を見ていきます。

既存のデータベースの取得と削除

データベースの取得と削除は、データベースの作成時に実装したコードの多くを再利用できるため、いずれも数秒で実行可能です。GETリクエストは、コード内でメソッドを指定するだけでOKです。

import fetch from 'node-fetch';

async function run() {
  const query = new URLSearchParams({
    internal: 'true',
    external: 'true'
  }).toString();

  const id = '操作対象のデータベースID';
  const resp = await fetch(
    `https://api.kinsta.com/v2/databases/${id}?${query}`,
    {
    method: 'GET',
    headers: {
      Authorization: 'Bearer <APIトークン>'
    }
    }
  );

  const data = await resp.text();
  console.log(data);
}

run();

これにより、CPUやメモリの制限、内部ホスト名やポートなどを含む、データベースに関連する情報が返されます。

{
  "database": {
    "id": "54fb80af-576c-4fdc-ba4f-b596c83f15a1",
    "name": "unique-db-name",
    "display_name": "firstsite-db",
    "status": "ready",
    "created_at": 1668697088806,
    "memory_limit": 250,
    "cpu_limit": 250,
    "storage_size": 1000,
    "type": "postgresql",
    "version": "14",
    "cluster": {
      "id": "54fb80af-576c-4fdc-ba4f-b596c83f15a1",
      "location": "europe-west3",
      "display_name": "Frankfurt, Germany Europe"
      },
    "resource_type_name": "db1",
    "internal_hostname": "some-name.dns.svc.cluster.local",
    "internal_port": "5432",
    "internal_connections": [
    {
      "id": "54fb80af-576c-4fdc-ba4f-b596c83f15a1",
      "type": "appResource"
    }
    ],
    "data": {
      "db_name": "firstsite-db",
      "db_password": "パスワード",
      "db_root_password": "パスワード",
      "db_user": "ユーザー名"
    },
    "external_connection_string": "postgresql://username:password@localhost:31866/firstsite-db",
    "external_hostname": "firstsite-db-postgresql.external.kinsta.app",
    "external_port": "31866"
  }
}

データベースを削除するには、databasesエンドポイントにDELETEメソッドとIDを送信します。

…
const resp = await fetch(
  `https://api.kinsta.com/v2/databases/${id}`,
  {
   method: 'DELETE',
   headers: {
…

MyKinstaで操作を行う場合とは異なり、Kinsta APIでデータベースを削除する際には、確認メッセージが表示されないため注意が必要です。データベースを削除する際は、実行前にエラーハンドリングや確認を慎重に行ってください。

Kinsta APIを使用してデータベースの更新する

最後に、データベースの更新についてご紹介します。一見単純なワークフローになりそうですが、いわゆる「情報の変更」以外にもさまざまな操作の可能性があります。

表面的には、更新作業にはほとんど変更の余地がなく、変更可能なパラメータはデータベース名とリソースの種類のみ。

{
  "resource_type": "db1",
  "display_name": "test-db"
}

データベースの更新は、開発やシステム管理のワークフロー全体にシームレスに組み込むことができます。例えば、データベースは状態や環境間を移動可能です。その時々の状況に応じてデータベース名を変更することで、プロジェクトの規約やスプリントの進捗状況など、特定の要件に適応させることができます。

リソースの種類は、変更することでデータベースのサイズとパフォーマンスを即座に調整することができます。これにより、プロジェクトの進捗状況やサイトの利用者の変化に対応可能です。

垂直スケーリングにおけるresource_typeの重要性

スケーラビリティは今日のウェブサイトにおいて重要な要素です。これを考慮し、Kinsta APIでresource_typeパラメータを提供しています。垂直スケーリングは特に重要な戦略となり、コード1行でデータベースのリソースの割り当てを変更することができます。

import fetch from 'node-fetch';

async function run() {
  const id = '操作対象のデータベースID';
  const resp = await fetch(
    `https://api.kinsta.com/v2/databases/${id}`,
    {
      method: 'PUT',
      headers: {
       'Content-Type': 'application/json',
       Authorization: 'Bearer <APIトークン>'
      },
    body: JSON.stringify({
      resource_type: 'db1',
      display_name: 'test-db'
    })
  }
  );

  const data = await resp.json();
  console.log(data);
}

run();

リソースの種類は8つあり、一般に数字が大きいほど、割り当てるリソースが大きくなります。したがって、db8は、db1よりも割り当てられるリソースが多く、高性能になります。

このように、状況や要件に応じてリソースを素早く増減可能です。

トラフィックの増加時や複雑なデータベースタスクを実行する際には、リソースを柔軟に増やすことができます。

他のKinsta APIエンドポイントとの統合

データベースのエンドポイントを他のKinsta APIエンドポイントと併用して、フル機能のデータベース管理システムを構築したり、その管理を他のワークフローに組み込むことができます。

例えば、上に挙げた垂直スケーリングは良い例です。他にも、サイトの要件に基づいた以下のようなタスクが考えられます。

  • アプリケーションを構築して運用すると同時にデータベースを作成。サーバーの位置情報や認証情報など、すべての関連情報を含めることができる。
  • デプロイメントプロセスの一環として、予想される負荷に基づいてデータベースのリソースタイプを更新。
  • ログファイルとサイトの指標をリクエストして、データベースリソースを自動的にスケーリングする手段を作成。

以上から、データベース管理ワークフローの重要な要素、つまりリクエストした情報を継続的に使用することの重要性がわかります。この点をもう少し掘り下げてみます。

Kinsta APIのデータベース情報をワークフローで活用する

大体のプロジェクトは、初期開発、ステージング、テスト、本番など複数の段階があります。Kinsta APIの可用性は、他のツールと連動して多くのタスクを処理するのに役立ちます。特に、データベースの作成と管理はこのプロセスの重要な一環となります。

例えば、選択したバージョン管理システム(VCS)で新機能のブランチを作成すると、Kinsta APIを使ったデータベースを作成するプロセスをトリガーすることができます。

簡単な例を見てみます。

import fetch from 'node-fetch';

async function createDatabase(databaseName) {
  const apiToken = 'APIトークン';
  const companyId = '企業ID';

  const response = await fetch('https://api.kinsta.com/v2/databases', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': `Bearer ${apiToken}`
    },
    body: JSON.stringify({
      company_id: companyId,
      location: 'us-central1',
      resource_type: 'db1',
      display_name: databaseName,
      db_name: databaseName,
      db_password: 'パスワード',
      db_user: 'ユーザー名',
      type: 'postgresql',
      version: '15'
    })
  });


  if (response.ok) {
    const data = await response.json();
    console.log(`データベース'${databaseName}'が正常に作成されました`);
    console.log('データベースの詳細:', data);
  } else {
    console.error(`データベース'${databaseName}'の作成に失敗しました:`, response.statusText);
  }
}


// 使用例
const featureBranchName = 'feature/new-blog-section';
const databaseName = `db_${featureBranchName}`;
createDatabase(databaseName);

これはデータベースを作成する関数を定義し、databasesエンドポイントにPOSTリクエストを送るコード例です。変数にGitの機能ブランチパスを保持し、それをdatabaseNameのパラメータとして使用します。そこから動的なデータベース名に基づき、作成プロセスをトリガーすることができます。

この方法でデータベース作成を自動化すると、ステージングや機能に専用のデータベースを確保することができます。これにより、開発ワークフローの管理が容易になり、作業環境が整理され、競合のリスクも軽減されます。

コラボレーションツールへのデータベース情報の統合

Kinsta APIをデータベース管理に役立てるもう1つの方法は、SlackやMicrosoft Teamsなどのコミュニケーション用ツールに最新のステータスを配信することです。例えば、データベースのステータスのみを投稿するチャンネルを作成することができます。

これにより、データベースのステータスや可用性を常にチーム全体で把握できるように。また、コミュニケーションや共同作業がさらにスムーズになるだけでなく、エラーや問題に対してより積極的に対応できるようになります。

他にも以下のような利点があります。

  • 可視性の向上:データベースのステータスがチーム全員に通知され、潜在的な問題や必要なメンテナンスタスクを確実に把握することができる。
  • 応答性の向上:データベースで何かしらの問題が見つかると担当者が通知を受信。これにより、先を見越し予防的に対応することができる。
  • ディスカッションの促進:一元化されたプラットフォームでデータベースの問題について話し合うことができるため、トラブルシューティングや知識共有などが促進される。
  • コミュニケーションの合理化:メッセージを自動化し、手動での通知や更新の手間を省く。

Kinsta APIをツールの認証エンドポイントと接続することは一見複雑ですが、実はそれほど手間はかかりません。

import fetch from 'node-fetch';
const { IncomingWebhook } = require('@slack/webhook');

// SlackのウェブフックURLを設定する(環境変数を使用)
const slackWebhookUrl = process.env.SLACK_WEBHOOK_URL;
const webhook = new IncomingWebhook(slackWebhookUrl);

async function sendSlackNotification(message) {
  try {
    await webhook.send({
    text: message
    });
    console.log('Slack通知が正常に送信されました');
  } catch (error) {
    console.error('Slack通知の送信エラー:', error);
  }
}

async function getDatabases() {
  const apiToken = process.env.KINSTA_API_TOKEN;
  const companyId = process.env.KINSTA_COMPANY_ID;

  const query = new URLSearchParams({
    company: companyId,
    limit: '10',
    offset: '3'
      }).toString();

  try {
    const response = await fetch(`https://api.kinsta.com/v2/databases?${query}`, {
      method: 'GET',
      headers: {
       'Authorization': `Bearer ${apiToken}`
      }
    });


if (response.ok) {
   const data = await response.json();
   console.log('データベースを検索:', data);

   // 各データベースのステータスを確認し、必要に応じてSlackに通知を送信
   data.forEach(database => {
     if (database.status !== 'ready') {
       const message = `データベース'${database.display_name}'はステータス'${database.status}'にあります。確認してください;
       sendSlackNotification(message);
     }
   });
} else {
   console.error('データベースの検索エラー:', response.statusText);
}
  } catch (error) {
    console.error('データベースの検索エラー:', error);
  }
}

// 使用例

getDatabases();

このコードは、SlackのWebhookを使用してSlackチャンネルにメッセージを送信する関数を定義します。次にGETリクエストを実行し、サーバーに関連するデータベースの一覧を取得。Readyステータスのないデータベースが見つかった場合は、Slackチャンネルに通知が送信されます。

データベース管理のためにKinsta APIを他のプラットフォームと統合する簡単な例を2つご紹介しました。いずれの方法を選んでも、より良いプロジェクトの成果と効率化を実現し、より包括的なサービスを開発できるようになります。

まとめ

データベース管理は、WordPressのプロジェクトやアプリケーションを運営する上で非常に重要な側面です。そのため、Kinsta APIにはデータベース専用のエンドポイントがあります。このエンドポイントを利用してデータベース管理プロセスを合理化し、MyKinstaが必要なタスクを自動化することができます。

簡単に自動化できる上に、よりきめ細かな制御が可能になります。データベースのプロビジョニングまたは削除、リソースのスケーリング、標準データベースのメンテナンスなど、Kinsta APIにはさまざまな活用方法があります。

Kinsta APIを使用してデータベースの作成や管理を行っていますか?以下のコメント欄でご意見を聞かせください。

Jeremy Holcombe Kinsta

Content & Marketing Editor at Kinsta, WordPress Web Developer, and Content Writer. Outside of all things WordPress, I enjoy the beach, golf, and movies. I also have tall people problems ;).