Workersを使用してTursoデータベースに接続し、クエリを実行する
このチュートリアルでは、Cloudflare WorkersとTurso ↗を使用して、グローバルに分散したアプリケーションを構築する方法を説明します。TursoはlibSQLに基づいたエッジホスティングの分散データベースです。WorkersとTursoを使用することで、インフラストラクチャを数十または数百の地域で維持または運用することなく、エンドユーザーに近いアプリケーションを作成できます。
このチュートリアルを続ける前に、次のことを確認してください:
- 成功裏に最初のCloudflare Workerを作成した、または以前にCloudflare Workerをデプロイしたことがある。
- Cloudflare Workersを構築するためのコマンドラインツールWranglerをインストールした。
- Tursoに認証するために必要なGitHubアカウント ↗を持っている。
- コマンドラインインターフェース(CLI)アプリケーションのインストールと使用に関する基本的な知識がある。
データベースを作成し、データを入力するにはTurso CLIが必要です。次の2つのコマンドのいずれかをターミナルで実行して、Turso CLIをインストールします:
# macOSまたはLinuxでHomebrewを使用する場合brew install chiselstrike/tap/turso
# 手動スクリプトインストールcurl -sSfL <https://get.tur.so/install.sh> | bashTurso CLIをインストールした後、CLIがシェルパスにあることを確認します:
turso --version# これにより、現在のTurso CLIバージョンが出力されるはずです(インストールされたバージョンはそれよりも新しい場合があります):turso version v0.51.0最初のTursoデータベースを作成する前に、次のコマンドを実行してGitHubアカウントを使用してCLIにログインする必要があります:
turso auth login認証を待っています...✔ 成功! <your GitHub username>としてログインしましたturso auth loginはブラウザウィンドウを開き、まだログインしていない場合はGitHubアカウントにサインインするように求めます。これを初めて行うときは、Tursoアプリケーションにアカウントを使用する権限を与える必要があります。承認を選択して、Tursoに必要な権限を付与します。
認証が完了したら、turso db create <DATABASE_NAME>を実行してデータベースを作成できます。Tursoは自動的に最も近い場所を選択します。
turso db create my-db# 例:[===> ]ロサンゼルス、カリフォルニア(米国)(lax)にデータベースmy-dbを作成中# 成功した場合:ロサンゼルス、カリフォルニア(米国)(lax)にデータベースmy-dbを34秒で作成しました。最初のデータベースが作成されたので、直接接続してSQLを実行できます:
turso db shell my-dbデータベースを開始するには、最初のテーブルのスキーマを作成して定義します。この例では、1つのカラムemail(型はtext)を持つexample_usersテーブルを作成し、1つのメールアドレスでデータを入力します。
開いたシェルに次のSQLを貼り付けます:
create table example_users (email text);insert into example_users values ("foo@bar.com");SQL文が成功した場合、出力はありません。各SQL文を終了するために、末尾のセミコロン(;)が必要です。
シェルを終了するには.quitと入力します。
WorkersコマンドラインインターフェースWranglerを使用すると、Workersプロジェクトを作成、ローカル開発、デプロイできます。
新しいWorkersプロジェクト(worker-turso-tsという名前)を作成するには、次のコマンドを実行します:
npm create cloudflare@latest -- worker-turso-tsyarn create cloudflare@latest worker-turso-tspnpm create cloudflare@latest worker-turso-tsFor setup, select the following options:
- For What would you like to start with?, choose
Hello Worldの例. - For Which template would you like to use?, choose
Hello World Worker. - For Which language do you want to use?, choose
TypeScript. - For Do you want to use git for version control?, choose
Yes. - For Do you want to deploy your application?, choose
No(we will be making some changes before deploying).
Workerの開発を開始するには、新しいプロジェクトディレクトリにcdします:
cd worker-turso-tsプロジェクトディレクトリには、次のファイルがあります:
wrangler.toml: Wranglerの設定ファイル。src/index.ts: TypeScriptで書かれた最小限のHello World Worker。package.json: 最小限のNode依存関係設定ファイル。tsconfig.json: Workersタイプを含むTypeScript設定。指定された場合のみ生成されます。
このチュートリアルでは、wrangler.tomlとsrc/index.tsファイルのみが関連しています。他のファイルを編集する必要はなく、そのままにしておいてください。
Tursoクライアントライブラリは、接続を確立するために2つの情報が必要です:
LIBSQL_DB_URL- Tursoデータベースの接続文字列。LIBSQL_DB_AUTH_TOKEN- Tursoデータベースの認証トークン。これは秘密にしておき、ソースコードにコミットしないでください。
データベースのURLを取得するには、次のTurso CLIコマンドを実行し、結果をコピーします:
turso db show my-db --urllibsql://my-db-<your-github-username>.turso.ioエディタでwrangler.tomlを開き、ファイルの下部にプロジェクトの環境変数を表す新しい[vars]セクションを作成します:
[vars]LIBSQL_DB_URL = "ここにURLを貼り付けてください"wrangler.tomlへの変更を保存します。
次に、データベースに接続する際にWorkerが使用するための長期的な認証トークンを作成します。次のTurso CLIコマンドを実行し、出力をクリップボードにコピーします:
turso db tokens create my-db -e none# 長いテキスト文字列(エンコードされたJSON Webトークン)が出力されますこのトークンを秘密に保つために:
- ローカル開発用に
.dev.varsファイルを作成します。このファイルはソース管理にコミットしないでください。Gitを使用している場合は、.gitignoreファイルに.dev.varsを追加する必要があります。
- 認証トークンを機密に保つために、シークレットを作成します。
まず、次の構造で.dev.varsという新しいファイルを作成します。認証トークンを引用符の中に貼り付けます:
LIBSQL_DB_AUTH_TOKEN="<YOUR_AUTH_TOKEN>".dev.varsへの変更を保存します。次に、認証トークンをシークレットとして保存し、プロダクションWorkerが参照できるようにします。次のwrangler secretコマンドを実行して、トークンを持つシークレットを作成します:
# シークレット名を正確に指定することを確認してください:Workerは後でそれを参照する必要があります。npx wrangler secret put LIBSQL_DB_AUTH_TOKEN? シークレット値を入力してください: › <ここにトークンを貼り付けてください>トークンをシークレットとして保存するために、キーボードで<Enter>を選択します。LIBSQL_DB_URLとLIBSQL_DB_AUTH_TOKENは、実行時にWorkerの環境で利用可能になります。
Tursoクライアントライブラリとルーターをインストールします:
npm install @libsql/client itty-router@libsql/clientライブラリを使用すると、Tursoデータベースにクエリを実行できます。itty-routerライブラリは、Workerへの受信リクエストを処理するのに役立つ軽量ルーターです。
これから、HTTPリクエストを処理し、データベース内のすべてのユーザーをリストするか、新しいユーザーを追加するための特定のハンドラーにルーティングし、結果や成功を返すWorkerを作成します。
src/index.tsを開き、既存のテンプレートを削除します。以下のコードを正確にコピーしてファイルに貼り付けます:
import { Client as LibsqlClient, createClient } from "@libsql/client/web";import { Router, RouterType } from "itty-router";
export interface Env { // TursoデータベースのURLを含む環境変数。 LIBSQL_DB_URL?: string; // Tursoデータベースの認証トークンを含むシークレット。 LIBSQL_DB_AUTH_TOKEN?: string;
// これらのオブジェクトは最初の使用前に作成され、その後ここに保存されます // 将来の使用のために router?: RouterType;}
export default { async fetch(request, env): Promise<Response> { if (env.router === undefined) { env.router = buildRouter(env); }
return env.router.handle(request); },} satisfies ExportedHandler<Env>;
function buildLibsqlClient(env: Env): LibsqlClient { const url = env.LIBSQL_DB_URL?.trim(); if (url === undefined) { throw new Error("LIBSQL_DB_URL env var is not defined"); }
const authToken = env.LIBSQL_DB_AUTH_TOKEN?.trim(); if (authToken === undefined) { throw new Error("LIBSQL_DB_AUTH_TOKEN env var is not defined"); }
return createClient({ url, authToken });}
function buildRouter(env: Env): RouterType { const router = Router();
router.get("/users", async () => { const client = buildLibsqlClient(env); const rs = await client.execute("select * from example_users"); return Response.json(rs); });
router.get("/add-user", async (request) => { const client = buildLibsqlClient(env); const email = request.query.email; if (email === undefined) { return new Response("メールアドレスがありません", { status: 400 }); } if (typeof email !== "string") { return new Response("メールアドレスは単一の文字列でなければなりません", { status: 400 }); } if (email.length === 0) { return new Response("メールアドレスの長さは0より大きくなければなりません", { status: 400 }); }
try { await client.execute({ sql: "insert into example_users values (?)", args: [email], }); } catch (e) { console.error(e); return new Response("データベースの挿入に失敗しました"); }
return new Response("追加されました"); });
router.all("*", () => new Response("見つかりませんでした。", { status: 404 }));
return router;}変更を加えたsrc/index.tsファイルを保存します。
注意:
- libSQLクライアントライブラリのインポート
'@libsql/client/web'は、Cloudflare Workersで作業する際に正確に示された通りにインポートする必要があります。非WebインポートはWorkers環境では機能しません。 Envインターフェースには、前述の環境変数とシークレットが含まれています。Envインターフェースは、最初のリクエスト時に作成されるlibSQLクライアントオブジェクトとルーターもキャッシュします。/usersルートは、Tursoシェルで作成したexample_usersテーブルからすべての行を取得します。これは、ResultSetオブジェクトをJSONとして直接呼び出し元にシリアライズします。/add-userルートは、クエリ文字列で提供された値を使用して新しい行を挿入します。
環境が設定され、コードが準備できたので、デプロイする前にローカルでWorkerをテストします。
Workerのローカルインスタンスを実行するには(完全にあなたのマシン上で)、次のコマンドを実行します:
npx wrangler dev次のような出力が表示されるはずです:
あなたのWorkerは次のバインディングにアクセスできます:- Vars: - LIBSQL_DB_URL: "your-url"⎔ ローカルサーバーを開始しています...╭─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮│ [b] ブラウザを開く, [d] Devtoolsを開く, [l] ローカルモードをオフにする, [c] コンソールをクリア, [x] 終了する │╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯デバッガーがws://127.0.0.1:61918/1064babd-bc9d-4bed-b171-b35dab3b7680でリッスンしていますヘルプについては、https://nodejs.org/en/docs/inspectorを参照してくださいデバッガーが接続されました。[mf:inf] Workerが再読み込みされました! (40.25KiB)[mf:inf] 0.0.0.0:8787でリッスン中[mf:inf] - http://127.0.0.1:8787[mf:inf] - http://192.168.1.136:8787[mf:inf] `Request.cf`オブジェクトキャッシュが更新されました!localhostアドレス — 127.0.0.1を含むもの — は、あなたのマシン上でローカルに実行されているWebサーバーです。
それに接続し、example_usersテーブルを作成したときに挿入したメールアドレスが返されることを確認するために、ブラウザで/usersルートにアクセスします:http://127.0.0.1:8787/users ↗。
次のようなJSONが表示されるはずです。これはexample_usersテーブルからのデータを含んでいます:
{ "columns": ["email"], "rows": [{ "email": "foo@bar.com" }], "rowsAffected": 0}/add-usersルートをテストし、挿入するメールアドレスを渡します:http://127.0.0.1:8787/add-user?email=test@test.com ↗
“追加されました”というテキストが表示されるはずです。最初のURLを再度読み込むと、/usersルートで新しく追加された行が表示されます。好きなだけ繰り返すことができます。設計上、アプリケーションは重複したメールアドレスの追加を防ぎません。
Wranglerを終了するには、開始されたシェルにqと入力します。
WorkerがTursoデータベースに接続できることを確認したら、Workerをデプロイします。次のWranglerコマンドを実行して、WorkerをCloudflareのグローバルネットワークにデプロイします:
npx wrangler deployこのコマンドを初めて実行すると、ブラウザが起動し、Cloudflareアカウントでサインインし、Wranglerに権限を付与するように求められます。
deployコマンドは次のような出力を生成します:
あなたのワーカーは以下のバインディングにアクセスできます:- vars: - libsql_db_url: "your-url"...公開された worker-turso-ts (0.19 秒) https://worker-turso-ts.<your-Workers-subdomain>.workers.dev現在のデプロイメント ID: f9e6b48f-5aac-40bd-8f44-8a40be2212ffあなたは現在、Turso データベースに接続し、クエリを実行し、新しいデータを挿入できるワーカーをデプロイしました。
このチュートリアルの一環として作成したリソースをクリーンアップするには:
- このワーカーを保持したくない場合は、
npx wrangler delete worker-turso-tsを実行してデプロイされたワーカーを削除します。 turso db destroy my-dbを使用して、Turso データベースを削除することもできます。