× × N コスパいいと思って Cloudflare で IaC 化したら 大変だった話 Yokohama North Meetup #15
自己紹介 ゆうと 株式会社ゼンビット 所属 Webエンジニアなんでも屋 フロント、バック、インフラを担当してます。 趣味で IoT も触ってます 🎣 釣りとキャンプが好きです 最近ハマっているもの Hono / vinext など
まず聞いてください、CF こんなに安い&激アツ 他社と比較したざっくり料金感(2026年時点・概算) 項目 Cloudflare その他インフラ サーバーレス 無料 10万 req/日 従量課金 ストレージ R2: $0.015/GB + エグレス無料 S3: $0.023/GB + 通信費 LLM推論 有料最低ライン Workers AI (Llama 3.3 70B): $0.29 / $2.25 per 1M tok (in / out) $5/月 (Paid) エコシステム&vinext が神 Bedrock (Claude Sonnet 4.5): $3 / $15 per 1M tok ≒ 約 10 倍差 青天井 新Webプラットフォーム「Void」 Workers, R2, KV, Workers AI... 全部一箇所で完結。さらに Next.js (App Router) 最近発表された Void との親和性も抜群。Cloudflare のエッジインフラと組み合わせる すら Workers 上で動かせる神ツール vinext も登場。全部乗せ不可避な激アツ状 ことで、これまでにないゼロレイテンシの体験が作れる。まさに今がアツい!🚀
これだけあると、IaCで管理したくなる 今回のスタックは基本的にぜんぶ Cloudflare Workers (Next.js / Hono) R2 (画像・PDF) KV (セッション) DNS / カスタムドメイン Workers AI + Neon (DBだけ外) 管理対象のリソースがいっぱい… ダッシュボードでポチポチ設定するのはツライ! だから Pulumi (IaC) を導入 TypeScript で宣言的にインフラを書けば、 いい感じに依存関係を解決してデプロイしてくれる。
IaC 化の理想と、無情な現実
もちろん Pulumi で一元管理したい
new cloudflare.WorkersScript("api-worker", {
name: "nippou-api", content: fs.readFileSync("dist/worker.js"),
bindings: [{ name: "SESSION_KV", type: "kv", namespaceId: kv.id }],
});
しかしデプロイすると…
error: 400 Bad Request
Uncaught Error:
No such module "node:os"
そもそも Workers は Node.js じゃない(V8 isolates)
node:os
/ node:fs みたいな Node 組み込みモジュールは動かない
Pulumi (API 直叩き)
Wrangler CLI
苦渋の解決策: Pulumi から Wrangler CLI を呼ぶ A. IaC を諦める → 依存関係が追えなくなるので却下 B. Pulumi から Wrangler を呼び出す ← こっち @pulumi/command の local.Command (ローカルシェルを Pulumi リソースとして実行) これを使って、Pulumi のデプロイパイプラインから シェル経由で npx wrangler deploy を叩く。 Wrangler 呼び出しも IaC グラフに 組み込めるので、一元管理は保てる。 ただし Pulumi の Output 値(KV ID / シークレット等)は非同期解決、一方 Wrangler CLI は --config <ファイル> しか受け取らない → 中間ファイルを毎回書き出して渡すしかない Pulumi wrangler.generated.json Wrangler CLI (非同期 Output) 毎回書き出す物理ファイル (ファイル入力)
さらなる混沌: vinext の登場 フロントの Next.js も Workers に載せたい。 vinext Next.js App Router を Cloudflare Workers で SSR できる神ツール これを導入したら… vinext が wrangler.jsonc を ビルド時に勝手に生成してくる
同じ 1 枚の設定ファイルを、代わる代わる触る 1 vinext build が wrangler.jsonc を書く 2 Pulumi がそのファイルを "上書き" (Pulumi 管理の KV ID や 環境変数等を追記) 3 vinext deploy --skip-build がそれを読む
違和感の正体 IaC の境界 リソースと 依存関係 一致しない隙間 wrangler.jsonc CLI の境界 設定ファイルと 実行コマンド 気持ち悪さ = 悪い設計 気持ち悪さ = レイヤー境界の具現化
学び: "コスパ" は 2 軸ある 1. 料金のコスパ (インフラ費用) = Cloudflare、圧倒的に良い 2. 実装のコスパ (開発・運用工数) = エコシステムの 隙間 で減点されがち IaC 化のコストは "IaC 側の言語" じゃなく "ツール境界の摩擦" に現れる 分かった上でやれば、それでも Cloudflare + IaC は強い。
まとめ ■ Cloudflare は料金で圧勝(エグレス無料) ■ だが IaC で覆うと境界が現れる ■ 境界は「中間設定ファイル」として具現化 ■ vinext を挟むと3人の手を経由する奇妙な構成に それでも採用し続ける価値はある! ご清聴ありがとうございま した 質問どうぞ!