ワーカーからのクエリ
ワーカー内からアナリティクスエンジンのデータにアクセスするには、fetchを使用してSQL APIにアクセスできます。このAPIは、JavaScriptで簡単に操作できるJSONデータを返します。
ワーカーがAPIと認証するためには、アカウントIDとAPIトークンが必要です。
- 32文字のアカウントIDは、Cloudflareダッシュボードから取得できます。
- APIトークンもダッシュボードで生成できます。詳細については、SQL APIドキュメントを参照してください。
アカウントIDは環境変数として、APIトークンはワーカー内のシークレットとして保存することをお勧めします。これはダッシュボードまたはWranglerを通じて行うことができます。詳細については、ワーカーのドキュメントを参照してください。
以下のようにJavaScriptのfetch APIを使用してクエリを実行します:
const query = "SELECT * FROM my_dataset";const API = `https://api.cloudflare.com/client/v4/accounts/${env.ACCOUNT_ID}/analytics_engine/sql`;const response = await fetch(API, { method: "POST", headers: { Authorization: `Bearer ${env.API_TOKEN}`, }, body: query,});const responseJSON = await response.json();データは、APIドキュメントのFORMATセクションで説明されている形式で返され、データ自体に加えて、返された列の名前とタイプに関するメタ情報や行数を抽出できます。
以下は、天気データセットに対してクエリを実行し、各都市の最小値と最大値を表示するサンプルワーカーです。
まず、アカウントIDとAPIトークンで環境変数を設定します。
アカウントIDはwrangler.tomlに設定します:
[vars]ACCOUNT_ID = "<account_id>"API_TOKENは、wranglerコマンドラインツールを使用してシークレットとして設定できます。以下を実行し、トークン文字列を入力します:
npx wrangler secret put API_TOKENワーカースクリプト自体はクエリを実行し、結果をフォーマットします:
export default { async fetch(request, env) { // このワーカーはルートへのリクエストにのみ応答します。 if (new URL(request.url).pathname != "/") { return new Response("見つかりません", { status: 404 }); }
// 実行されるSQL文字列。 const query = ` SELECT blob1 AS city, max(double1) as max_temp, min(double1) as min_temp FROM weather WHERE timestamp > NOW() - INTERVAL '1' DAY GROUP BY city ORDER BY city`;
// APIエンドポイントURLを構築し、クエリ文字列でPOSTリクエストを行います。 const API = `https://api.cloudflare.com/client/v4/accounts/${env.ACCOUNT_ID}/analytics_engine/sql`; const queryResponse = await fetch(API, { method: "POST", headers: { Authorization: `Bearer ${env.API_TOKEN}`, }, body: query, });
// クエリが成功した場合、APIは200ステータスコードを返します。 // 失敗した場合は、エラーメッセージをログに記録し、失敗メッセージを返します。 if (queryResponse.status != 200) { console.error("クエリエラー:", await queryResponse.text()); return new Response("エラーが発生しました!", { status: 500 }); }
// クエリ応答からJSONデータを読み取り、データをHTMLとしてレンダリングします。 const queryJSON = await queryResponse.json(); return new Response(renderResponse(queryJSON.data), { headers: { "content-type": "text/html" }, }); },};
// renderCityはデータ行からHTMLのテーブル行をレンダリングします。function renderCity(row) { return `<tr><td>${row.city}</td><td>${row.min_temp}</td><td>${row.max_temp}</td></tr>`;}
// renderResponseは結果のシンプルなHTMLテーブルをレンダリングします。function renderResponse(data) { return `<!DOCTYPE html><html> <body> <table> <tr><th>都市</th><th>最小温度</th><th>最大温度</th></tr> ${data.map(renderCity).join("\n")} </table> </body><html>`;}