◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SONNET 4.5 — Claude API での提供終了は 11/30、残り32日。API 連携を足したアプリは移行先の確認を●SDK 58 ISSUE — Android ウィジェットが定期更新されない、Stripe が静的リンクになるなど初期報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SONNET 4.5 — Claude API での提供終了は 11/30、残り32日。API 連携を足したアプリは移行先の確認を●SDK 58 ISSUE — Android ウィジェットが定期更新されない、Stripe が静的リンクになるなど初期報告が出ています●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/アプリ開発
◇ アプリ開発/2026-10-29上級

アップロード前に一度だけ取りにいかれた画像が、エッジで 404 のまま残りました。保持の規則をステータス別に分け、アップロードと消去を一組にしました

新しい壁紙が、一部の地域でだけ 404 のまま表示されない。原因は、アップロード前に一度だけ取りにいかれた 404 を、CDN が画像と同じ長さで保持していたことでした。ステータス別の保持、診断の二本立て、アップロードと消去の一組を、手元で動かして確かめた記録です。

CDN3キャッシュ6404TTL壁紙アプリ29個人開発234運用10

✦ プレミアム記事

壁紙を一枚足して、一覧を更新します。手元の端末では、ちゃんと表示されます。ところが、離れた地域の端末からは、その一枚だけが空のままです。

何度か見直しても、サーバーにはファイルがあります。アプリの側にも、おかしな点が見当たりません。

404 は「まだ無い」という知らせであって、「この先もずっと無い」という約束ではありません。ところが CDN は、設定しだいで 404 を約束として長く覚えます。 この一文に、直したあとの考え方が収まりました。

個人開発で運用している壁紙アプリの、画像配信で起きた話です。Rork が書き出す Expo のアプリでも、画像をリモートから配信しているなら同じ型が起きうると考えて、保持の規則だけを写した小さな模型を JavaScript で組み、Node 22 で動かして確かめました。CDN の内部を再現したものではなく、実際の配信網での確認とも別です。その線引きは、各所に書き添えます。

声は「その一枚だけ出ない」でした

症状から読み取れることを、先に表へ置いておくと、疑う順番を間違えにくくなります。ここに書いたのは、私が立てた調べる順で、画面を観察した記録ではありません。

見えた症状最初に調べること
新しい画像だけ出ない(古い画像は出る)アプリの読み込みより先に、画像の URL の応答を見ます
地域によって出たり出なかったりするキャッシュはエッジごとに別です。ひとつの地域の記憶を疑います
時間が経っても直らない応答の保持時間を見ます。404 が何秒覚えられる設定かを確かめます
ファイルはオリジンにある「無い」ではなく、「無かったという記憶が残っている」を疑います

重なっていた三つのこと

原因は一つではなく、三つが重なって、はじめて「1年間 404 のまま」になっていました。

一つ目は、順序です。一覧の更新が先に端末へ届き、アップロードの完了より前に、端末が画像を取りにいく瞬間がありました。

二つ目は、保持の規則です。CDN の設定で、200 だけでなく 404 も、画像と同じ1年の長さで保持する形になっていました。「無かった」という応答が、そのまま1年分の記憶になります。

三つ目は、消す手順です。私の工程では、アップロードのあとに、そのパスのキャッシュを消す作業が組み込まれていませんでした。ファイルが届いても、エッジはすでに答えを持っているので、オリジンを見にいきません。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦新しく足した画像が一部の地域でだけ出ないとき、オリジンにまだ無いのか、エッジが 404 を抱えているのかを、二本の問い合わせで切り分けられるようになります
✦404 と 5xx の保持を画像と分ける前に、短くした代償(オリジンに届く回数)と、誤って保持したときの被害を数えて、自分の設定値を決められるようになります
✦アップロードの直後にそのパスを消す手順を一組にして、次に足す画像が同じ穴に落ちるのを先回りして防げるようになります
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

◇ アプリ開発2026-08-28
定期ジョブの取りこぼしに二週間気づけなかったのは、成功ログだけを見ていたからです
1日2回動くはずのアセット処理ジョブが半分しか発火せず、それでもログは全て成功でした。実行されなかった回を検出する台帳と、滞留の傾きを見る二つ目の番兵を、実行結果つきで組み立てます。
◇ アプリ開発2026-08-24
サムネイルの移設は、配信中の版が旧パスを要求し続ける前提で組みました
サーバー側で画像の置き場所を変えても、ストアで配信中の版はビルド時のパス組み立てを持ち続けます。旧新どちらのパスでも 200 を返す双方向フォールバック、画像とカタログの更新順序、CDN を挟んだまま実応答を確かめる手順を、壁紙アプリの運用で使っている形のまま共有します。
◇ アプリ開発2026-10-26
段階公開の最初の5%で見えた Crash-free 99.7%、何ユーザーから信じてよいのか
段階公開 5% の Crash-free 率は、母数が小さいほど区間が広く、進む・止めるの根拠になりません。Wilson 区間で「進む・待つ・止める」を判定する Python と、毎回見ると誤って止める確率の実測をまとめます。