タブレット スタンド アルミ ホルダー 角度調整可能 Lomicall stand : 卓上 縦置き スタンド タブレット 置き台 デスク台 立てる 設置 aluminium テレワーク 在宅 ワーク Zoom 会議 タブレット対応(4~13'') ミニ エア プロ ipad 10 第十世代 ipad9 第九世代 ipad Air mini Pro第六世代 S7 S8 Note 対応 - シルバー
¥2,199 (2025年4月25日 13:05 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)Anker Solix C300 Portable Power Station with Anker Solix PS60 Compact Portable Solar Panel 288Whポータブル電源と60Wソーラーパネルセット ぽーたぶる電源 定格出力300W 小型軽量 持ち運び便利 コンパクト パワフル 急速充電 リン酸鉄 太陽光発電セット 防災 キャンプ
¥26,970 (2025年4月25日 13:08 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)iPadペンシル2018-2025対応, 13分急速充電アップルペンシル, 手のひら誤操作防止, 傾き感知, 磁気吸着, 5分自動スリープ 長時間使用, iPad タッチペン第11 (A16)/10/9/8/7/6世代、Air 11"/13" M2/M3 2025 /Pro 11"/13" M4 2024 、Mini 第7/6 Gen、Air 3/4/5 Gen に対応
¥1,599 (2025年4月25日 13:05 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)
(これは某所でやる Cloudflare の入門チュートリアルで、そこの肌感に合わせています。)
アカウント登録が終わっていることは前提とします。
Hello World
$ npm create cloudflare@latest
いちばん簡単な TypeScript のワーカーのサンプルを作ります
- Hello World
- Worker only
- TypeScript
npm run dev
で起動。
この中身を解説します。
仕組みを知る
Wrangler
Cloudflare Worker は wrangler
という CLI でコードを管理します。gcloud
や aws-cli
みたいなものだと思ってください。
wrangler は npx wrangler
でもいいですが、プロジェクト毎に devDependencies
経由にすることを推奨します。
(全体的にはかなりおせっかい気味な CLI です)
CLI から認証
デプロイやクラウドリソースを管理するのに、$ wrangler login
で認証します。ブラウザで Cloudflare の OAuth の認証してください。
ログイン済みだと wrangler whoami
でパーミッションが表示されます。
wrangler.json
プロジェクト設定を管理するのが wrangler.json(c)
です。最近まで toml でしたが json になりました。
wrangler.json
{
"$schema": "node_modules/wrangler/config-schema.json",
"name": "noisy-bush-ced6",
"main": "src/index.ts",
"compatibility_date": "2025-04-16",
"observability": {
"enabled": true
}
}
name はサービス固有名です。デフォルト設定だと
みたいなドメインにデプロイされます。
main
はエントリポイントです。pnpm wrangler dev src/main.ts
で明示的にエントリポイントを指定して立ち上げることもできます。
大事な点なのですが、wrangler には esbuild が組み込まれており、デフォルトでは esbuild でコンパイルしています。
カスタムビルドをしたかったら wrangler.json に次のような設定が必要です。
{
"build": {
"command": "npm run build",
"cwd": "build_cwd",
"watch_dir": "build_watch_dir"
}
}
これは簡単なものは楽に作れる反面、フレームワークのビルドパイプラインと干渉すると地獄が始まります。そうならないように祈るしかありません。
現代だと変な設定をしない限りは esbuild で十分です。
エントリポイントと Wrangler 環境
では、実際のエントリポイントのコードをみてみましょう。
src/index.ts
export default {
async fetch(request, env, ctx): PromiseResponse> {
return new Response('Hello World!');
},
} satisfies ExportedHandlerEnv>;
これは Node.js ではなく、 wrangler というサーバー環境で実行されます。
import で Node.js のように node_modules のライブラリを呼ぶことができるのですが、実際には wrangler にビルトインされている esbuild でバンドルされているだけです。
deploy せずにビルドだけして確かめてみます。
$ pnpm wrangler deploy --outdir=dist --dry-run
$ ls -al dist
.rw-r--r-- 194 mizchi 16 Apr 16:32 index.js
.rw-r--r-- 902 mizchi 16 Apr 16:32 index.js.map
.rw-r--r-- 116 mizchi 16 Apr 16:32 README.md
wrangler の事情はテストランナーにも現れています。vitest を普通に動かすのではなく、 wrangler を経由して動かすようになっています。
vitest.config.mts
import { defineWorkersConfig } from '@cloudflare/vitest-pool-workers/config';
export default defineWorkersConfig({
test: {
poolOptions: {
workers: {
wrangler: { configPath: './wrangler.jsonc' },
},
},
},
});
TypeScript 周りの設定
要は esbuild でビルドされていることを知っていればいいのですが、 @types/node
ではなく @cloudflare/workers-types
を呼んでいることを認識しておきましょう。
tsconfig.json
"types": [
"@cloudflare/workers-types/2023-07-01"
],
Cloudflare Workers には様々なバインディングがあるのですが、それは基本的に wrangler.json
に書くことになります。
wrangler types
を叩くと それらのバインディング定義に合わせて API の型定義ファイル worker-configuration.d.ts
を生成します。
$ pnpm wrangler types
✨ Types written to worker-configuration.d.ts
デプロイ
ログインしてる状態で pnpm wrangler deploy
$ pnpm wrangler deploy
⛅️ wrangler 4.11.1
-------------------
Total Upload: 0.19 KiB / gzip: 0.16 KiB
No bindings found.
--dry-run: exiting now.
(base)
Cloudflare Workers は反映がとにかく早く、多分 10 秒もせずに本番サーバーに反映されています。
デプロイすると管理画面の Worker & Pages
から、デプロイしたサービスの状態を確認できます。
デプロイ先を切り替える
wrangler deploy -e
で環境のバインディングを切り替えることができます。
例えば production や staging 等でデプロイするサービスを切り替えたい場合、 wrangler.json 内に env
を作ります。
例えば vars
でバインドする変数を変更する例です。
{
"$schema": "node_modules/wrangler/config-schema.json",
"main": "src/main.ts",
"vars": {
"XXX": "DEV"
},
"env": {
"prod": {
"vars": {
"XXX": "PROD"
}
}
}
}
これを書いた状態で pnpm wrangler types
で型を更新します。
ついでにソースコードからこの XXX を参照してみます。
src/main.ts
export default {
async fetch(request, env, ctx): PromiseResponse> {
return new Response('Hello World!' + env.XXX);
},
} satisfies ExportedHandlerEnv>;
これを wrangler deploy -e prod
でデプロイしてみましょう。
デフォルトのデプロイ先は
でしたが、 この場合
になります。
ここに別名を設定したい場合は、Workers の管理画面からドメインを追加したり色々します (略)
Cloudflare Access で認証を掛ける
これでデプロイできますが、Cloudflare Access を使うとデプロイした URL に対して Cloudflare のアカウントで認証を掛けることができます。これが開発時に便利で、開発者は Cloudflare アカウントでログインしてるはず。
注意: この機能はドメイン登録する必要があります。手っ取り早く試したいなら、管理画面内からドメインを買えるので、買って DNS を設定してください。
解説はこの記事に譲ります。
もう少し実践編: Cloudflare KV を使う
kv を使ってみます。これは結果整合な高速キャッシュです。
まず wrangler kv で namespace を作成します。
$ pnpm wrangler kv namespace create test-kv
{
"kv_namespaces": [
{
"binding": "test_kv",
"id": ""
}
]
}
バインディングを wrangler.json に追記保存します。 wrangler types も忘れずに。
これを使ったコードを書きます。1 分間だけ last_access のキーを保持するようにします。
const LAST_ACCESS_KEY = "last_access";
export default {
async fetch(request, env, ctx): PromiseResponse> {
const lastAccess = await env.test_kv.get(LAST_ACCESS_KEY);
if (lastAccess) {
return new Response(lastAccess);
} else {
await env.test_kv.put("last_access", Date.now().toString(), {
expirationTtl: 60,
});
return new Response("new_access");
}
},
} satisfies ExportedHandlerEnv>;
最初は new_access
で、以降 1 分間だけ new_access の UnixTime のレスポンスを返す例です。
他のサービス
これを眺めてください
代表的なもの
- Cloudflare R2: S3 互換 API のオブジェクトストレージ
- D1: 分散レプリケーション付きの sqlite
- Queue: バッチキュー
- Durable Objects: 強整合ステート
- Images: 画像最適化プロキシ
- Cron Trigger: 定期実行ジョブ
- Vectorize: ベクトル検索 DB
- Agents: MCP サーバー作るためのツールキット
- Stream: WebRTC Media Server
本気で使い込む場合に大事なのは、おそらく Durable Objects です。これが他の機能の基盤なので、これで実現できるかどうかで Cloudflare 自体のポテンシャルがわかります。
6 月に Cloudflare Container Registry が来るらしいので、そうなると Docker コンテナがデプロイできるようになる…らしいです。
割と流行りに応じて無節操になんでも作ってくる感じです。
次に覚えること
別記事で後で書く。
- 本番のログのデバッグ方法
- logpush