始める
このガイドでは、以下のことを説明します:
- Durable Objectを定義するクラスの作成。
FetchAPIを介して別のWorkerからDurable Objectをインスタンス化し、通信する。- Durable Objectをデプロイする。
- Sign up for a Cloudflare account ↗.
- Install
npm↗. - Install
Node.js↗.
Node.js version manager
Use a Node version manager like Volta ↗ or nvm ↗ to avoid permission issues and change Node.js versions. Wrangler, discussed later in this guide, requires a Node version of 16.17.0 or later.
Durable Objectsを有効にするには、Workersの有料プランを購入する必要があります:
- Cloudflareダッシュボード ↗にログインし、アカウントを選択します。
- Workers & Pages > Plansに移動します。
- Purchase Workers Paidを選択し、Durable Objectsを有効にするための支払いプロセスを完了します。
Durable ObjectにはWorkerからアクセスします。あなたのWorkerアプリケーションは、Durable Objectと対話するためのインターフェースです。
Workerプロジェクトを作成するには、次のコマンドを実行します:
npm create cloudflare@latest -- durable-object-starteryarn create cloudflare@latest durable-object-starterpnpm create cloudflare@latest durable-object-startercreate cloudflare@latestを実行すると、WranglerというWorkers CLIがインストールされます。プロジェクトのテストとデプロイにはWranglerを使用します。
For 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
Durable Objectsを使用したHello World Worker. - For Which language do you want to use?, choose
JavaScript / 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).
これにより、新しいディレクトリが作成され、コードを書くためのsrc/index.jsまたはsrc/index.tsファイルと、wrangler.toml設定ファイルが含まれます。
新しいディレクトリに移動します:
cd durable-object-starterDurable Objectを作成しアクセスする前に、その動作は通常のエクスポートされたJavaScriptクラスによって定義される必要があります。
MyDurableObjectクラスには、2つのパラメータを持つコンストラクタがあります。最初のパラメータstateは、Durable Objectに特有の状態を含み、ストレージにアクセスするためのメソッドが含まれています。2番目のパラメータenvは、アップロード時にWorkerに関連付けたバインディングを含みます。
export class MyDurableObject { constructor(state, env) {}}export class MyDurableObject { constructor(state: DurableObjectState, env: Env) {}}Workersはfetch APIを介してDurable Objectと通信します。Workerと同様に、Durable Objectはイベントハンドラを登録することによって、受信したfetchイベントをリッスンします。Durable Objectの場合、fetchハンドラはクラスのメソッドとして定義されます。
あなたのファイルは次のようになります:
export class MyDurableObject { constructor(state, env) {}
async fetch(request) { return new Response("Hello World"); }}export class MyDurableObject { constructor(state: DurableObjectState, env: Env) {}
async fetch(request: Request) { return new Response("Hello World"); }}Workerは、ヘッダー、HTTPメソッド、リクエストボディ、またはリクエストURIを介してDurable Objectに情報を渡すことができます。
fetch()ハンドラを使用すると、WorkerからDurable Objectをインスタンス化し、通信することができます。
Durable Objectと通信するために、fetchハンドラは次のようになります:
export default { async fetch(request, env) { let id = env.MY_DURABLE_OBJECT.idFromName(new URL(request.url).pathname);
let stub = env.MY_DURABLE_OBJECT.get(id);
let response = await stub.fetch(request);
return response; },};export default { async fetch(request, env, ctx): Promise<Response> { let id = env.MY_DURABLE_OBJECT.idFromName(new URL(request.url).pathname);
let stub = env.MY_DURABLE_OBJECT.get(id);
let response = await stub.fetch(request);
return response; },} satisfies ExportedHandler<Env>;上記のコードでは、次のことを行っています:
- HTTPリクエストを受け取るための
fetch()ハンドラなど、Workerの主要なイベントハンドラをエクスポートしました。 fetch()ハンドラにenvを渡しました。バインディングは、イベントハンドラまたはクラスコンストラクタが呼び出されるときに渡される環境オブジェクトのプロパティとして提供されます。バインディングのidFromName()関数を呼び出すことで、文字列から派生したオブジェクトIDを使用します。システムにランダムなユニークIDを生成させることもできます。システム生成のユニークIDはパフォーマンス特性が優れていますが、後でオブジェクトに再アクセスするためにIDをどこかに保存する必要があります。- URLパスからオブジェクトIDを導出しました。
MY_DURABLE_OBJECT.idFromName()は、同じ文字列を入力として与えられた場合、常に同じIDを返します(同じクラスで呼び出された場合)。しかし、異なる文字列(または異なるクラス)に対しては決して同じIDを返しません。この場合、各ユニークパスに対して新しいオブジェクトを作成しています。 - IDを使用してDurable Objectのスタブを構築しました。スタブは、Durable Objectにメッセージを送信するために使用されるクライアントオブジェクトです。
- リクエストをDurable Objectに転送しました。
stub.fetch()は、リクエストのURLに関係なく、常にオブジェクトに送信されるため、グローバルなfetch()関数と同じシグネチャを持っています。新しいオブジェクトにリクエストを送信する最初の時に、そのオブジェクトが作成されます。オブジェクトに耐久性のある状態を保存しない場合、後で自動的に削除されます(再度リクエストすると再作成されます)。耐久性のある状態を保存する場合、オブジェクトはメモリから追い出されることがありますが、その耐久性のある状態は永続的に保持されます。 return responseでクライアントにHTTPレスポンスを返しました。
Durable Objectとの通信について詳しくは、WorkerからDurable Objectにアクセスするを参照してください。
Bindingsは、WorkersがCloudflare開発者プラットフォーム上のリソースと対話することを可能にします。Workerプロジェクトのwrangler.tomlにおけるDurable Objectバインディングには、バインディング名(このガイドではMY_DURABLE_OBJECTを使用)とクラス名(MyDurableObject)が含まれます。
[[durable_objects.bindings]]name = "MY_DURABLE_OBJECT"class_name = "MyDurableObject"
# または
[durable_objects]bindings = [ { name = "MY_DURABLE_OBJECT", class_name = "MyDurableObject" }][[durable_objects.bindings]]セクションには、次のフィールドが含まれます:
name- 必須。Worker内で使用するバインディング名。class_name- 必須。バインドしたいクラス名。script_name- オプション。現在の環境のWorkerコードがデフォルトです。
マイグレーションは、クラス名からランタイム状態へのマッピングプロセスです。新しいDurable Objectクラスを作成する際、または既存のDurable Objectクラスを名前変更、削除、または転送する際にマイグレーションを実行します。
マイグレーションは、wrangler.tomlファイルの[[migrations]]構成キーを介して実行されます。
新しいDurable Objectクラスを作成するためのDurable Objectマイグレーションは、Workerのwrangler.tomlファイルで次のようになります:
[[migrations]]tag = "v1" # 各エントリに対してユニークであるべきnew_classes = ["MyDurableObject"] # 新しいクラスの配列マイグレーションプロセスについて詳しくは、Durable Objectsのマイグレーションを参照してください。
Durable Objectをローカルでテストするには、wrangler devを実行します:
npx wrangler devコンソールには、Durable Objectから返されたHello world文字列が表示されるはずです。
Durable Object Workerをデプロイするには:
npx wrangler deployデプロイが完了すると、Cloudflareダッシュボード ↗のWorkers & Pages > Overviewで新しく作成したDurable Object Workerを見ることができるはずです。
あなたのDurable Object Workerを<YOUR_WORKER>.<YOUR_SUBDOMAIN>.workers.devでプレビューします。
このチュートリアルを終えることで、Durable Objectを作成、テスト、デプロイすることに成功しました。
- WorkerからDurable Objectにアクセスする
- Durable Objectスタブを作成する
- Miniflare ↗ - Durable Objectsのモックとテストに役立つツール。