<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cloudflare on M1KE BL0G</title><link>https://www.m1ke.org/tags/cloudflare/</link><description>Recent content in Cloudflare on M1KE BL0G</description><generator>Hugo -- gohugo.io</generator><language>ja-jp</language><copyright>mike</copyright><lastBuildDate>Sun, 18 Oct 2026 21:15:00 +0900</lastBuildDate><atom:link href="https://www.m1ke.org/tags/cloudflare/index.xml" rel="self" type="application/rss+xml"/><item><title>Cloudflare WorkersとD1でサーバーレス構成を作る</title><link>https://www.m1ke.org/p/cloudflare-workers%E3%81%A8d1%E3%81%A7%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%83%AC%E3%82%B9%E6%A7%8B%E6%88%90%E3%82%92%E4%BD%9C%E3%82%8B/</link><pubDate>Sun, 18 Oct 2026 21:15:00 +0900</pubDate><guid>https://www.m1ke.org/p/cloudflare-workers%E3%81%A8d1%E3%81%A7%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%83%AC%E3%82%B9%E6%A7%8B%E6%88%90%E3%82%92%E4%BD%9C%E3%82%8B/</guid><description>&lt;img src="https://www.m1ke.org/p/cloudflare-workers%E3%81%A8d1%E3%81%A7%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%83%AC%E3%82%B9%E6%A7%8B%E6%88%90%E3%82%92%E4%BD%9C%E3%82%8B/worker.jpeg" alt="Featured image of post Cloudflare WorkersとD1でサーバーレス構成を作る" /&gt;&lt;h2 id="背景"&gt;背景&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflare WorkersとD1について調べたので、基本的な仕組みと、最小構成でのセットアップ手順を整理する&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="cloudflare-workersとは"&gt;Cloudflare Workersとは&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;V8 isolate（ChromeのV8エンジンが使う、軽量な実行コンテキストの分離単位）をベースにしたサーバーレスの実行環境&lt;/li&gt;
&lt;li&gt;コンテナやVMを起動しないため、コールドスタートが非常に速い&lt;/li&gt;
&lt;li&gt;デプロイすると、Cloudflareのエッジロケーションに配信され、リクエスト元に地理的に近い場所で実行される&lt;/li&gt;
&lt;li&gt;基本的にJavaScript/TypeScript（またはWasm）で書く&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="aws-lambdaとの違い"&gt;AWS Lambdaとの違い&lt;/h3&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;観点&lt;/th&gt;
&lt;th&gt;AWS Lambda&lt;/th&gt;
&lt;th&gt;Cloudflare Workers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;実行基盤&lt;/td&gt;
&lt;td&gt;Firecracker（軽量VM）&lt;/td&gt;
&lt;td&gt;V8 isolate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;コールドスタート&lt;/td&gt;
&lt;td&gt;比較的遅い（ランタイムやメモリ設定による）&lt;/td&gt;
&lt;td&gt;非常に速い（isolateはVMより起動が軽い）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;実行場所&lt;/td&gt;
&lt;td&gt;指定したAWSリージョン&lt;/td&gt;
&lt;td&gt;デフォルトでエッジ（リクエスト元に近い場所）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;対応言語&lt;/td&gt;
&lt;td&gt;Node・Python・Java・Goなど幅広い&lt;/td&gt;
&lt;td&gt;基本的にJS/TS（Wasm経由で他言語も可）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;実行時間&lt;/td&gt;
&lt;td&gt;最大15分&lt;/td&gt;
&lt;td&gt;短時間のリクエスト/レスポンス処理が主眼&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;周辺サービス&lt;/td&gt;
&lt;td&gt;S3・DynamoDB・SQSなどAWS一式&lt;/td&gt;
&lt;td&gt;D1・R2・KV・Durable Objectsなど&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id="d1とは"&gt;D1とは&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;D1は、SQLiteのSQLセマンティクスを持つ、Cloudflareのマネージド・サーバーレスデータベース&lt;/li&gt;
&lt;li&gt;マネージド型のディザスタリカバリ機能を備え、Workerおよび HTTP API からアクセスできる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="スケーリングモデル"&gt;スケーリングモデル&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;1つのデータベースを大きくする垂直スケーリングではなく、データベースを複数作ることで水平にスケールする設計&lt;/li&gt;
&lt;li&gt;マルチテナントのアプリケーション（顧客ごとにDBを分離したい場合など）で、分離のための追加コストなしに数千のデータベースを扱える&lt;/li&gt;
&lt;li&gt;読み取り専用のレプリカをエッジに配置することで、地理的に近い場所から読み取れる&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="料金モデル"&gt;料金モデル&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;料金は、クエリ数とストレージ量にのみ基づく。インフラの管理コストは発生しない&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="プロジェクトを作る"&gt;プロジェクトを作る&lt;/h2&gt;
&lt;h3 id="workersプロジェクトの作成"&gt;Workersプロジェクトの作成&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;create-cloudflare&lt;/code&gt;（C3）というCLIツールで、Workerプロジェクトをスキャフォールドできる&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm create cloudflare@latest -- my-first-worker
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;セットアップ時に、テンプレートとして&amp;quot;Hello World example&amp;quot;、プロジェクトタイプとして&amp;quot;Worker only&amp;quot;を選ぶ&lt;/li&gt;
&lt;li&gt;デプロイは&lt;code&gt;wrangler&lt;/code&gt;（Cloudflareの公式CLI）で行う&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx wrangler deploy
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;デフォルトでは&lt;code&gt;&amp;lt;YOUR_WORKER&amp;gt;.&amp;lt;YOUR_SUBDOMAIN&amp;gt;.workers.dev&lt;/code&gt;というサブドメインに公開される&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="d1データベースの作成とバインディング"&gt;D1データベースの作成とバインディング&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;D1データベースも、&lt;code&gt;wrangler&lt;/code&gt;から作成する&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx wrangler d1 create prod-d1-tutorial
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;コマンド実行時に、設定ファイルへのバインディング追加を聞かれるので、Yesを選ぶと、必要な設定がそのまま出力される&lt;/li&gt;
&lt;li&gt;&lt;code&gt;wrangler.jsonc&lt;/code&gt;（または&lt;code&gt;wrangler.toml&lt;/code&gt;）に、以下のようにバインディングを追加する&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;span class="lnt"&gt;7
&lt;/span&gt;&lt;span class="lnt"&gt;8
&lt;/span&gt;&lt;span class="lnt"&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-jsonc" data-lang="jsonc"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;d1_databases&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;binding&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;prod_d1_tutorial&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;database_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;prod-d1-tutorial&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;database_id&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&amp;lt;データベースのID&amp;gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;このバインディング名は、Workerのコードから&lt;code&gt;env.&amp;lt;バインディング名&amp;gt;&lt;/code&gt;という形でアクセスできる、有効なJavaScriptの変数名である必要がある&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="workerからのクエリ"&gt;Workerからのクエリ&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;実際のWorkerコードでは、&lt;code&gt;env.&amp;lt;バインディング名&amp;gt;.prepare()&lt;/code&gt;でSQLを準備し、&lt;code&gt;bind()&lt;/code&gt;でプレースホルダに値を安全に埋め込み、&lt;code&gt;run()&lt;/code&gt;で実行する&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1
&lt;/span&gt;&lt;span class="lnt"&gt; 2
&lt;/span&gt;&lt;span class="lnt"&gt; 3
&lt;/span&gt;&lt;span class="lnt"&gt; 4
&lt;/span&gt;&lt;span class="lnt"&gt; 5
&lt;/span&gt;&lt;span class="lnt"&gt; 6
&lt;/span&gt;&lt;span class="lnt"&gt; 7
&lt;/span&gt;&lt;span class="lnt"&gt; 8
&lt;/span&gt;&lt;span class="lnt"&gt; 9
&lt;/span&gt;&lt;span class="lnt"&gt;10
&lt;/span&gt;&lt;span class="lnt"&gt;11
&lt;/span&gt;&lt;span class="lnt"&gt;12
&lt;/span&gt;&lt;span class="lnt"&gt;13
&lt;/span&gt;&lt;span class="lnt"&gt;14
&lt;/span&gt;&lt;span class="lnt"&gt;15
&lt;/span&gt;&lt;span class="lnt"&gt;16
&lt;/span&gt;&lt;span class="lnt"&gt;17
&lt;/span&gt;&lt;span class="lnt"&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-ts" data-lang="ts"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;Env&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nx"&gt;prod_d1_tutorial&lt;/span&gt;: &lt;span class="kt"&gt;D1Database&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;async&lt;/span&gt; &lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;pathname&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;URL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;url&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pathname&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;/api/beverages&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;results&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prod_d1_tutorial&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;prepare&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;SELECT * FROM Customers WHERE CompanyName = ?&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Bs Beverages&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;results&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Call /api/beverages...&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="nx"&gt;satisfies&lt;/span&gt; &lt;span class="nx"&gt;ExportedHandler&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;Env&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;プレースホルダ（&lt;code&gt;?&lt;/code&gt;）と&lt;code&gt;bind()&lt;/code&gt;を使う形になっているため、SQLインジェクションを防ぎやすい設計になっている&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="スキーマ管理-マイグレーション"&gt;スキーマ管理: マイグレーション&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;最初のスキーマ投入は、SQLファイルを直接実行する形でもできる&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx wrangler d1 execute prod-d1-tutorial --local --file&lt;span class="o"&gt;=&lt;/span&gt;./schema.sql
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npx wrangler d1 execute prod-d1-tutorial --remote --file&lt;span class="o"&gt;=&lt;/span&gt;./schema.sql
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;継続的にスキーマを変更していく場合は、&lt;code&gt;wrangler d1 migrations&lt;/code&gt;のマイグレーション機能を使う&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;コマンド&lt;/th&gt;
&lt;th&gt;内容&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler d1 migrations create&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;migrations&lt;/code&gt;フォルダに、バージョン番号付きの空のSQLファイルを生成する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler d1 migrations list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;未適用のマイグレーションを一覧表示する&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;wrangler d1 migrations apply&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;未適用のマイグレーションをデータベースに適用する&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;適用済みのマイグレーションは、&lt;code&gt;d1_migrations&lt;/code&gt;というテーブル（設定で変更可能）で管理され、開発環境・本番環境をまたいでスキーマの変更履歴をバージョン管理できる&lt;/li&gt;
&lt;li&gt;マイグレーション適用時は、誤って別のバインディングに対して実行してしまわないよう、バインディング名ではなくデータベース名を指定することが推奨されている&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="まとめ"&gt;まとめ&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflare Workersは、V8 isolateベースの軽量なサーバーレス実行環境で、Lambdaと比べてコールドスタートが速く、デフォルトでエッジに配信される&lt;/li&gt;
&lt;li&gt;D1は、SQLiteベースのサーバーレスデータベースで、DBを複数作ることで水平にスケールする設計。クエリ数・ストレージ量ベースの課金で、インフラ管理は不要&lt;/li&gt;
&lt;li&gt;&lt;code&gt;create-cloudflare&lt;/code&gt;でWorkerプロジェクトを作り、&lt;code&gt;wrangler d1 create&lt;/code&gt;でD1データベースを作成し、&lt;code&gt;wrangler.jsonc&lt;/code&gt;にバインディングを追加すれば、Workerのコードから&lt;code&gt;env.&amp;lt;バインディング名&amp;gt;.prepare().bind().run()&lt;/code&gt;という形でDBにアクセスできる&lt;/li&gt;
&lt;li&gt;スキーマの変更は、初回はSQLファイルの直接実行、継続的な変更は&lt;code&gt;wrangler d1 migrations&lt;/code&gt;のバージョン管理機能を使うのが基本&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="参考文献"&gt;参考文献&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://developers.cloudflare.com/d1/" target="_blank" rel="noopener"
&gt;Cloudflare D1 - Overview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://developers.cloudflare.com/d1/get-started/" target="_blank" rel="noopener"
&gt;Get started - D1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://developers.cloudflare.com/d1/reference/migrations/" target="_blank" rel="noopener"
&gt;Migrations - D1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://developers.cloudflare.com/workers/get-started/guide/" target="_blank" rel="noopener"
&gt;Get started guide - Workers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>