The Hidden Cost of Dynamic Convenience: Why “Just Fetch It at Runtime” Is a Design Smell
Hatched by John Smith
Jun 19, 2026
1 min read
2 views
71%
便利さは、どこまで本当に便利なのか
APIが無料で使えて、サーバーの外から自由に叩けて、画像もリクエスト時にその場で生成できる。ここまで聞くと、現代のWeb開発はかなり理想に近づいたように見える。ところが実際には、「動く」ことと「安定して動く」ことの間に、見えにくい断層がある。
たとえば、あるSNSのAPIをCloudflare Workersから操作するのは、ぱっと見ではとても合理的だ。エッジで軽く処理し、必要なときだけ外部APIを呼び、アプリを小さく保てる。ところが、同じ発想でOG画像を動的に生成しようとすると、静的な画像なら問題ないのに、動的ルートではフォントがデプロイに含まれず、実行時に必要な資産が消えてしまうことがある。そこで最後に残る解決策が、CDNからフォントを取りにいき、Node.jsランタイムを選ぶことだったりする。
ここに、現代のWeb開発の重要な問いがある。
「オンデマンドで動く」ことは、本当に「自由」なのか。それとも、必要なものをその場で必ず再構築できるという、より高い運用能力を要求しているだけなのか。
この問いは、API連携と画像生成という一見別々の話をつなぐ。どちらも共通しているのは、ローカルに閉じた完成品を配るのではなく、その場で組み立てるシステムになっていることだ。そこで必要になるのは、速度だけではない。実行環境が何を持ち込み、何を持ち込めず、何を失いやすいかを理解する設計思想だ。
「無料API」と「実行時生成」が示す、同じ自由の罠
無料のAPIは魅力的だ。プロトタイピングが早くなり、サーバーを自前で持たずに外部サービスを操作できる。Cloudflare Workersのようなエッジ実行環境はさらにこの流れを加速させる。配置は軽く、応答は速く、スケールの心配も少ない。これだけ見ると、ソフトウェアはどんどん抽象化され、どんどん簡単になっているように見える。
でも、抽象化には必ず見えない依存が増える。APIに依存すれば認証、制限、仕様変更、レートリミットに依存する。実行時レンダリングに依存すれば、ファイルの同梱、ランタイムの差異、フォントの入手性に依存する。つまり、便利になればなるほど、コードの中ではなく、環境の外側にある条件が重要になる。
このズレを見抜くには、Webアプリを「完成品」ではなく、毎回その場で作られる舞台装置として見るとわかりやすい。静的な配布物は、舞台裏で照明も衣装もあらかじめ揃っている。しかし動的な生成は、上演のたびに小道具を調達し、役者に衣装を着せ、照明の色まで決め直すようなものだ。観客には柔軟に見えるが、裏では失敗点が増えている。
特にOG画像のような機能は、その性質が露骨に出る。静的に書き出される画像なら、フォントもレイアウトも一緒に固められる。だが動的ルートでは、リクエストが来た瞬間に画像を組み立てるため、フォントファイルがデプロイに含まれていなければ、その場で見つけられない。ここで起きる問題は単なるバグではない。「あとから作る」設計に切り替えた瞬間、資産の所在がローカルから分散へ変わるという構造問題だ。
本当の敵は複雑さではなく、資産の所在が曖昧になること
多くのチームは、動的化や外部API利用を「複雑だから避ける」べきだと思いがちだ。しかし実際の敵は、複雑さそのものではない。もっと厄介なのは、何がどこにあるのかが曖昧になることだ。
無料APIを使う場合、データの真実は自分のDBではなく外部サービスにある。動的OG画像を生成する場合、画像の真実はソースコードだけではなく、フォントや実行環境にも分散する。これらはどちらも、システムの状態が一箇所に閉じていないという意味で同型だ。
この状態をうまく扱うための鍵は、「コード」「資産」「実行環境」を別々の層として設計することだ。コードはロジック、資産は見た目や表現、実行環境は制約と能力を持つ。これらを同じ箱に入れて考えると、デプロイ時に初めて欠落に気づく。逆に、最初から層を分けて考えると、何をバンドルすべきか、何をフェッチすべきか、何を静的化すべきかが明確になる。
ここで重要なのは、静的か動的かという二択ではない。どの資産を固定し、どの資産を遅延させ、どの資産を外部化するかという分割の問題だ。たとえばフォントは、見た目の一貫性に直結するなら固定したい。一方で、SNS投稿の内容やプロフィール情報のように更新頻度が高いものは、APIから取得するほうが合理的だ。つまり、最適な設計は一枚岩ではなく、資産ごとの性格によって変わる。
優れたシステム設計とは、すべてを静的にすることでも、すべてを動的にすることでもない。失敗しやすい部分だけを先回りして固定することだ。
この視点を持つと、OG画像のフォント問題は単なる実装の細部ではなくなる。それは、動的生成がどこまで責任を持つべきかを問う、設計上のテストケースになる。外部APIも同じだ。データを自前で保持しない選択は、運用を軽くする一方で、可用性や再現性の責任を外へ押し出す。自由は増えるが、管理の対象は別の場所へ移る。
エッジとランタイムが教える、ソフトウェアの新しい現実
Cloudflare Workersのようなエッジ環境は、軽量で速い。その魅力は、地理的に近い場所でコードが走り、レスポンスが短縮されることにある。無料APIとの相性も良く、少ない構成で大きなことができる。しかし、こうした環境はしばしば、ローカル開発の感覚をそのまま持ち込むと危険だ。
ローカルでは、フォントは手元にある。ファイルシステムも自由だ。外部ネットワークも比較的安定している。だが本番では、実行時に必要なものが存在しないことがある。しかも、その欠落はエラーとして明示されず、出力の見た目の崩れとして現れることもある。OG画像はまさにそうだ。画像は生成されるが、フォントが違うだけでブランドの印象は壊れる。これは機能停止ではなく、品質の静かな劣化だ。
この種の失敗は厄介だ。なぜなら、単体テストでは通りやすいのに、デプロイ後の実行環境でだけ壊れるからだ。ここで必要なのは、コードの正しさだけでなく、環境の再現性を設計することだ。ローカルで再現できることは最低条件であって、十分条件ではない。
その意味で、CDNからフォントを取得するという対応は、単なる回避策以上の示唆を持つ。重要なのは「どこに置くか」ではなく、実行時に確実に手に入る経路を持つかだ。資産を同梱できないなら、取りにいく経路を明確にし、失敗時の挙動も含めて設計する。これは、API利用にもそのまま当てはまる。相手のサービスを使うなら、認証方式や障害時のリトライ、キャッシュ、フォールバックを含めて考える必要がある。
つまり、エッジ環境や動的生成は、開発者に「もっと速く」ではなく、**「もっと厳密に」**を要求している。速さは副産物であって、本質は境界条件を扱う力にある。ここで弱い設計は、見えない場所で壊れる。強い設計は、失敗する可能性を先に名前で呼び、そこに対策を置いている。
実務で効くのは、静的化ではなく「境界の明文化」
このテーマから得られる最も実践的な教訓は、あらゆるものを静的に固定せよ、という話ではない。むしろ逆だ。境界を明文化せよということだ。
たとえば次のように分けて考えると、設計がかなりクリアになる。
-
固定すべきもの フォント、ブランドカラー、レイアウトルール、OG画像のテンプレートの骨格など。これらは体験の一貫性に直結するため、できるだけ予測可能に保つ。
-
動的にするもの 投稿内容、ユーザー名、最新の状態、APIから取得する外部データなど。更新頻度が高く、静的化のメリットが小さいもの。
-
外部化してよいもの 一時的なメディアや、重くて同梱しにくい資産。ここではCDNやオブジェクトストレージが有効になる。
-
フォールバックが必要なもの API失敗時のキャッシュ、フォント取得失敗時の代替書体、動的画像生成失敗時の簡易画像など。
この整理の価値は、アーキテクチャを美しくすることではない。障害の形を先に決められることにある。障害は必ず起こる。問題は、起きたときにシステムが「どこで」「何を失ったのか」を把握できるかどうかだ。
ここでひとつ、よくある誤解を壊しておきたい。多くの人は、静的配信は古く、動的生成は新しいと考える。しかし本質は新旧ではない。静的化は「事前に確定させる技術」であり、動的化は「実行時に決定を委ねる技術」だ。どちらが優れているかではなく、どの不確実性を前倒しで処理し、どの不確実性を残すかが問われている。
API利用も同じだ。外部サービスを使うこと自体が問題なのではなく、外部依存を曖昧にしたまま使うことが問題になる。無料であることは魅力だが、無料であるがゆえに運用ルールが変わる可能性もある。だからこそ、APIは「便利な部品」ではなく、契約に近い存在として扱うべきだ。
Key Takeaways
- 「動的」は自由ではなく、責任の移動だと理解する。ローカルにあった資産や前提が、実行時に保証されるとは限らない。
- コード、資産、実行環境を分けて設計する。特にフォントやテンプレートのような資産は、バンドルか外部化かを明示する。
- 失敗しやすいものから固定する。ブランド体験に直結する要素は静的化し、変化の激しいデータだけを動的にする。
- 外部APIは契約として扱う。認証、レート制限、障害時の代替動作まで含めて設計する。
- 本番でしか壊れない箇所を先に疑う。ローカルで動いたことより、デプロイ後に再現できることを重視する。
結論: 速いシステムとは、軽いシステムではなく、失われるものが予測できるシステム
Web開発の進化は、私たちに「何でもその場でできる」感覚を与えた。APIを呼べば世界とつながり、エッジで処理すれば応答は速く、実行時に画像を作れば表現は柔軟になる。だが、その裏で起きているのは、単純な自由化ではない。ものが散らばることへの適応だ。
本当に成熟した設計は、便利さを最大化することではない。どこで壊れるかを先に知り、その壊れ方まで設計に含めることだ。無料APIを使うことも、動的OG画像を生成することも、それ自体は素晴らしい。問題は、何がその場に存在していると仮定しているかを忘れることにある。
だから次に「とりあえず動的にすればいい」と思ったら、少し立ち止まってほしい。問うべきは、動的か静的かではない。その機能が依存しているものは、どこにあり、いつ、どの条件で確実に手に入るのかだ。
この視点を持つと、Web開発は単なる実装作業ではなくなる。見えない依存を見抜き、失われやすいものを先に守る、かなり知的な設計作業になる。速さの正体は、軽さではない。不確実性を制御できることなのだ。
Sources
Hatch New Ideas with Glasp AI 🐣
Glasp AI allows you to hatch new ideas based on your curated content. Let's curate and create with Glasp AI :)
Start Hatching 🐣