# 1 秒に 10 億イベント！ Cloudflare の Town Lake と Skipper が社内データを丸ごと変えたよ

やっほー、しぃちゃんだよ！今日はデータ好きにはたまらない話だよ。1 秒に 10 億イベントも流れる会社が、そのデータをどうやって「みんなが触れる」ものにしたのか、というお話なの。

## なにが発表されたの？

Cloudflare の Blog で、社内向けに作った 2 つのツールが紹介されたよ。1 つは Town Lake っていう統合データ分析基盤、もう 1 つは Skipper っていう、その上で動く AI データエージェントなの。

Town Lake は「Cloudflare が知っていることぜんぶに 1 つの SQL でアクセスできる窓口」で、Skipper は「ふつうの言葉で質問すると、正しくて監査もできる答えを数秒で返してくれる子」だよ。名前は Town Lake の由来がテキサス州オースティンの湖なんだって。

## 今までどうだったの？

Cloudflare のネットワークは 330 以上の都市・120 以上の国にまたがっていて、データは production の DB、ClickHouse、Kafka、Google Cloud のバケット、BigQuery … と、あちこちに散らばっていたの。

「今日サインアップしたドメインのうち、トラフィック Top 100 に入るのはいくつ？」みたいな素朴な質問に答えるだけでも、どのシステムに聞くか・どの認証情報を使うか・どのクエリ言語を書くか・そのデータはサンプリング済みか新鮮か、を全部知っていないといけなかったんだって。

しかも分析パイプラインは 700M+ events/秒 をさばくためにダウンサンプリングしていて、ダッシュボードにはいいけど請求みたいな正確さが命の用途には使えなかったの。社内レポートの一部は外部ベンダー頼りで、他社クラウドへの依存もあったみたい。

## これで何が変わるの？

権限と「知る必要」がある人なら、誰でも 1 か所で会社の質問に答えられるようになったよ。

しかも用途に合わせて、請求やセキュリティ調査には新鮮でサンプリングしていないデータ、ダッシュボードや探索には速いダウンサンプリング済みデータ、を選べるの。PII は自動検出、機微なテーブルはデフォルトでロック、アクセスは全部監査ログ付きで時間制限つき。ぜんぶ Cloudflare 自身の製品（R2・Workers・Access・Workflows）で作ったのがポイントだよ。

## 深く潜ってみよう

Town Lake の中身はデータレイクハウスなの。クエリエンジンにオブジェクトストレージを読ませて、メタデータ層で DB っぽく振る舞わせる形だよ。

- クエリエンジンは Apache Trino。1 本の SQL で Postgres・ClickHouse・R2 上の Iceberg テーブルを、中間結果を作らずに JOIN できるの。
- ストレージは R2 Data Catalog（マネージドな Apache Iceberg）。スキーマ進化やタイムトラベルができて、古くなるほど圧縮して安くする仕組み。
- メタデータは DataHub、アクセス制御は Lifeguard（ルールを D1 に保存）、PII 検出は Skimmer（Workers AI で列を 2 段階分類）だよ。
- ELT は Transformer、取り込みは Kubernetes 上の orchestrator が担当。

ガバナンスは「デフォルトで閉じる」方式なの。新しいテーブルはレビューされるまで、検索はできても中身は引けない。エラーも「permission denied」じゃなくて「このテーブルはレビューが必要だよ、ここをクリック」って出るのがやさしいよね。

Skipper 側で面白いのは Code Mode 。ツールを 30 個並べる代わりに search と execute の 2 つだけ公開して、モデルに JavaScript を書かせて全ツールをまとめて呼ばせるの。5 ステップの処理が 5 往復にならずに済むんだって。

```javascript
const datasets = await skipper.search_datasets({ query: "billing product revenue" })
const queryId = await skipper.start_query({ sql: "SELECT ..." })
const results = await skipper.fetch_results({ queryId, mode: "inject" })
return skipper.create_chart({ chartType: "bar", data: results.rows })
```

Skipper は必ず「呼び出したユーザー本人」として動くから、権限のないテーブルを代わりに引いたりはできないの。安全だね。

数字もすごいよ。請求関連のクエリは Town Lake 全体の 53% で、直近の計測期間では 324 人の社員から 91,760 件も来ていたの。「Top 100 顧客を売上順に」みたいな質問はいま約 3 秒で返るし、昔は 200〜300 行あった SQL がいまは 5 行になったんだって。

作った人たちの学びで一番好きだったのはこれ。

> Less prompting is more.

細かく手順を指示するプロンプトをやめて、高レベルの方針だけ渡したら精度が上がった、っていうお話。あとは「退屈なインフラ（行レベルのアクセス制御や監査、PII 検出）こそが一番むずかしい」って締めていたの。

## まとめ

- Town Lake は Trino + Iceberg + R2 で作った、Cloudflare 社内の統合データ基盤
- Skipper はその上で自然言語 → 検証済み SQL → 答えを数秒で返す AI エージェント
- デフォルトで閉じるガバナンス・PII 自動検出・ユーザー権限での実行で、安全性を作り込んでいる
- 請求クエリは全体の 53%、324 人が 91,760 件利用と、社内でしっかり使われている

自社製品だけでここまで作り込んだ「データ基盤の設計思想」を読みたい人、社内データを AI で民主化したい人にすごく刺さる読み物だよ！
