Durable Objectsの作成場所を追跡する「Where Durable Objects Live」を軽く調査

概要
Cloudflare の Durable Objects が作られた場所を追跡してくれる👇のサービスがどんな風になっているのか気になったので調査した際の記事になります。

Where Durable Objects Live の見方
colo
例えば以下のページに行くと
以下の様なページが表示されます。
もし福岡からのアクセスでDurable Objectsを作成する場合、まず福岡の colo
はDurable Objectsをホストしていないので近くの別の場所で作成されます。
colo
とは…?
ある都市の地理的エリアにある1つ(または複数)のデータセンターのこと。LHR(ロンドン)やDEL(ニューデリー)のように、3文字のIATAコードで指定される
👆をみると NRT(千葉成田)かICN(韓国ソウル)のどちらかで作成されるらしく、NRTで作成される可能性が 75%
となっている様です。

Jurisdictions
管轄区域は、特定の法域で永続オブジェクトを生成する方法です。これは、データが法的要件に従って保存されていることを確認するのに役立ちます。
Durable Objects では、jurisdiction
パラメータを指定することで「どの法域(リーガル・リージョン)だけでオブジェクトを生成・保存・実行するか」を制御することができます。
管轄区域は以下の2に存在します。
- European Union
- Durable Object が EU 域内の Cloudflare データセンターだけ で生成・実行・データ保存されるよう制限する
- 背景としてはGDPR
- FedRAMP
- FedRAMP=Federal Risk and Authorization Management Program。米国政府のクラウド導入を促進するため、300 項目超の統一セキュリティ管理策を定義し、プロバイダーを認証する制度
- Durable Object が FedRAMP Moderate 認定を受けた Cloudflare データセンターのみ で生成・実行・保存される

Regions
リージョンは、特定の地理的位置に耐久性オブジェクトを生成する方法です。これは、特定のエリアのユーザーのレイテンシを削減するのに役立ちます。
とあります。これは
上記に記載があるように、デフォルトではDurable Objectsは最初にアクセスがあった場所に近いデータセンターでインスタンス化されます。頻繁にアクセスされる場所でインスタンス化されたら良いですが、遠い場所でインスタンス化されてしまう可能性もあります。そうなるとレイテンシが高くなる可能性もあります。
そこで、Durable Objects では locationHint
というオプションパラメータでインスタンス化する場所を指定する事ができます。これはベストエフォートであり必ず指定した場所でインスタンス化されるものではなく、指定場所からのレイテンシを最小限に抑えるように選択された場所でインスタンス化されます。
サポートされている場所
locationHintに設定する値 | 場所 |
---|---|
wnam | Western North America |
enam | Eastern North America |
sam | South America |
weur | Western Europe |
eeur | Eastern Europe |
apac | Asia-Pacific |
oc | Oceania |
afr | Africa |
me | Middle East |

リポジトリ
monorepoになっていて packages
の方は **IATAコード** や 定数定義や型定義などが含まれている様です。IATAコードはOurAirportsのオープンデータを使っている様です。
OurAirportsとは?
世界規模のオープンデータ航空場データベースで、現在 約 8 万3 000 超の空港レコードを収録し毎日自動更新されています
apps/worker
次に Cloudflare Workersの実装を見ていこうと思います。
-
wrangler.json
- 使っているBindingは以下
- KV
- Durable Objects
- Workers Analytics Engine
- また **Cron Triggers** で定期実行
- 使っているBindingは以下
-
DurableObjectの処理
import { DurableObject } from "cloudflare:workers"; export class DO extends DurableObject { async fetch() { return Response.json({ ts: Date.now(), colo: (( await (await fetch("https://www.cloudflare.com/cdn-cgi/trace")).text() ).match(/^colo=(.+)/m) as string[])[1] }); } }
-
/cdn-cgi/trace
にアクセスしてDurableObjectが動いているcolo
の情報を返している様です。
-
-
Cron Triggersでの定期実行
-
apps/worker/src/cron/index.ts
const cron: ExportedHandlerScheduledHandler<Env> = async (event, env, ctx) => { const data = await Promise.all([colo(env), frontpage(env), status(env), regions(env), jurisdiction(env)]); const live = { colo: data[0], frontpage: data[1], status: data[2].status, iata: data[2].iata, region: data[3], jurisdiction: data[4], updatedAt: Date.now(), } as LiveKV; await Promise.all([env.KV.put("live", JSON.stringify(live)), api(live, env) ]); };
以下の処理結果の情報を
KV
とapi
に渡している様です
-