拡張子なしファイルを改名せずCloudflare AI Searchに登録する方法

Cloudflare AI Searchが、正しいHTTP Content-Typeを持つ拡張子なしファイルをR2からインデックス化できるようになりました。リネーム工程を省ける条件、残る同期・検証作業、メタデータ修復時のR2コスト、Workersでの実装方法、移行前に確認すべき制限を実務目線で解説します。

Saturday, September 12, 2026Omid Saffari
拡張子なしファイルを改名せずCloudflare AI Searchに登録する方法

Cloudflare AI Search2026年9月11日、R2への取り込みで問題になっていたファイル名の制約を緩和しました。拡張子なしファイルを安定したキーで保存していても、対応するHTTP Content-Typeを各オブジェクトに設定すれば、キーを変えずに検索可能にできます。

これにより、取り込みワークフローからリネーム工程を外せます。ただし、メタデータの整備、インデックス作成、ドキュメントが実際に検索可能になったかの確認は、引き続き必要です。

Cloudflare AI Searchで拡張子なしファイルを扱える仕組み

Cloudflare AI Searchは、自社コンテンツ向けのマネージド検索サービスです。データの取り込み元には、CloudflareのオブジェクトストレージであるR2バケットを指定できます。AI Searchはバケットを読み込み、対応するドキュメントを検索可能なテキストに変換し、アプリからクエリを送る際に使うインデックスを構築します。

従来、ファイル形式を確実に判定するにはファイル名の拡張子が必要でした。manual.pdfというキーなら、インデクサーはファイル形式を識別できます。一方、documents/manual-alphaのような安定したキーだけでは判定できませんでした。

今回から、AI Searchは拡張子のないオブジェクトに付いた通常のHTTP Content-Typeを利用できます。application/pdfなら中身はPDF、text/markdownならMarkdownだと判定されます。Cloudflareはこのほか、text/plainapplication/jsontext/htmltext/csv対応形式として挙げています。

ファイル拡張子が不要になったわけではありません。Cloudflareは今も、認識可能な拡張子を優先的かつ高速な判定経路としています。新しい経路が効くのは、キーを変えるとURL、データベース参照、テナントのマッピング、署名、既存のアップロード契約などが壊れてしまうケースです。

ここで混同しやすい点があります。Content-TypeはR2オブジェクトに付くHTTPメタデータです。カテゴリ、顧客、ドキュメントの状態といったフィルターにAI Searchが使うカスタムメタデータとは別物です。カスタムフィールドはx-amz-meta-*ヘッダーで渡し、AI Search側でスキーマを定義する必要があります。x-amz-meta-content-typeを追加しても、本来のHTTPフィールドの代わりにはなりません。

今回変わったのは、ドキュメントがインデックスに入る入口にあたるソース取り込みです。検索後に回答を生成するモデルは変わりません。GLM-5.3 Flashのアップデートは、その後段にある生成処理の変更です。

実務上の変化は、命名ルールをひとつ減らせること

不透明なキーが広く使われているのには理由があります。たとえば、安定したデータベースIDをR2キーにすれば、オブジェクトを差し替えてもアドレスは変わりません。ドキュメントサービスなら、顧客の元ファイル名を外部に見せずに済みます。署名付きURLがキーそのものに依存している場合もあります。

従来の回避策は、検索用コピーに拡張子付きの名前を付けるか、AI Searchがオブジェクトを見る前にリネーム工程を挟むことでした。その結果、保存・突合・削除の対象となる識別子がもうひとつ増えていました。

今回の更新では、HTTPメタデータが正しければ元のキーを維持できます。これが、ワークフロー上の実質的な削減です。

取り込み作業が更新前後でどう変わるかを整理すると、次のようになります。これはプロセスのモデルであり、実測ベンチマークでも、削減効果の保証でもありません。

状況更新前の作業現在の作業残る作業
新規の拡張子なしアップロードオブジェクトを書き込み、拡張子付きの検索用名を作成し、インデックス化して確認対応するContent-Typeを付けてオブジェクトを書き込み、インデックス化して確認形式の検証と確認
有効なHTTPメタデータを持つ既存オブジェクト検索用名を作成または維持し、インデックス化して確認キーを維持し、同期して確認同期と確認
HTTPメタデータが不正または欠落した既存オブジェクト型情報の不足をリネームで回避し、インデックス化して確認監査し、メタデータを修復して、同期・確認修復作業と確認
拡張子なしのR2オブジェクトが、固定されたオブジェクトキーのままContent-Type検証を通ってAI Searchインデックスへ進む構成モデル
キーは固定したままにできます。対応するHTTP Content-Typeがファイル形式の判定材料になりますが、その後もオブジェクトの同期と確認は必要です。

この表が意図的に金額を示していない点には理由があります。Cloudflareはこの機能による時間削減を公表しておらず、今回のリリースが既存のメタデータを書き換えてくれるわけでもありません。

残る作業にはどれだけコストがかかるか

AI Searchはオープンベータ期間中、Workersプランの上限内で無料です。ストレージとベクトルインデックス作成も含まれます。Workers AIとAI Gatewayの利用には別途料金が発生する場合がありますが、今回の取り込み変更によってその料金体系は変わりません。

一方、メタデータの修復はR2の請求に影響することがあります。ListObjectsPutObjectCopyObjectはClass Aオペレーションとして数えられます。修復ツールがオブジェクトの確認や読み取りに使う可能性があるHeadObjectGetObjectは、Class Bオペレーションです。

Standardストレージでは、月間100万回の無料枠を超えると、Class Aリクエストは100万回あたり$4.50です。Infrequent Accessには無料枠がなく、Class Aリクエストは100万回あたり$9.00です。オブジェクトの読み取りやコピー時には、GBあたり$0.01が加算される場合もあります。

予算を考える際の基準は明快です。Content-Typeが正しいオブジェクトなら、リネームのための修復は必要ありません。値が誤っていれば、利用するツール次第で書き込みまたはコピーが必要になります。バケット全体の修復を予定する前に、発生するオペレーション数を数えておくべきです。

AI Search側では規模の上限にも注意が必要です。Workers Freeのインスタンスあたり上限は100,000ファイルです。Workers Paidでは100万ファイル、ハイブリッド検索を有効にした場合は500,000ファイルまで利用できます。4 MBのファイル上限は、どちらのプランでも変わりません。

明日から活用できるのは誰か

安定したアップロードIDを使う個人SaaS開発者

データベースに保存済みのR2キーはそのまま使い、アップローダーがオブジェクトを書き込む際に正しいMIMEタイプを付けるようにします。これでサポート検索は、ファイル名用の列を追加したり、検索用コピーを作るバッチジョブを用意したりせず、同じオブジェクトを取り込めます。

顧客がドキュメントを差し替え、削除し、移動したときに突き合わせる識別子が減るのが利点です。ただし、検索対象にするオブジェクトが汎用バイナリ型で届いた場合は、アップロード時に拒否する必要があります。

レガシーバケットを抱えるプラットフォームエンジニア

拡張子なしオブジェクトとそのHTTPメタデータを一覧にし、Cloudflareが対応するMIMEタイプと各値を比較して、失敗対象を切り分けます。バケット全体に手を入れる前に、小さなサンプルで修復を試します。

利点は、移行範囲を限定できることです。修復費用を必要なオブジェクトだけに使い、有効なメタデータを持つキーはそのまま同期と確認へ進められます。

マルチテナント製品の開発チーム

元のファイル名が外部に漏れない不透明なオブジェクトキーを維持し、アップロード時に信頼できるサーバー側の検査結果からContent-Typeを設定します。テナントごとにインデックス範囲を分ける必要がある場合は、AI Searchのパスフィルターやプレフィックスを別途適用します。

利点は、アーキテクチャに一貫性を持たせられることです。ストレージ上の識別子をファイル表示名から独立させたまま、インデクサーには検証可能な型情報を渡せます。

顧客のナレッジベースを運用するエージェンシー

運用手順では、メタデータの役割を分けて扱います。拡張子なしファイルを取り込めるかどうかはHTTP Content-Typeで決まります。インデックス済みの検索結果をどう絞り込むかは、スキーマ定義後のカスタムx-amz-meta-*フィールドで決まります。

こうしておけば、原因の切り分けが明確になります。ドキュメントが見つからないとき、フィルタールールや回答モデルを変更する前に、チームはまず取り込み用メタデータを確認できます。

拡張子なしオブジェクトを対応する取り込み経路に載せる

CloudflareのR2 Workers APIでは、リクエストヘッダーをhttpMetadataとして渡せます。次のWorkerはリクエストパスをそのままオブジェクトキーとして使い、Content-Typeがないアップロードを拒否します。

DOCSという名前でR2バケットをwrangler.jsoncにバインドします。

Jsonc
{
  "$schema": "./node_modules/wrangler/config-schema.json",
  "name": "r2-document-upload",
  "main": "src/index.ts",
  "compatibility_date": "2026-09-11",
  "r2_buckets": [
    {
      "binding": "DOCS",
      "bucket_name": "your-bucket"
    }
  ]
}

続いて、次のWorkerを使います。

TypeScript
interface Env {
  DOCS: R2Bucket;
}

export default {
  async fetch(request, env): Promise<Response> {
    if (request.method !== "PUT") {
      return new Response("Method Not Allowed", { status: 405 });
    }

    const key = new URL(request.url).pathname.replace(/^\//, "");
    const contentType = request.headers.get("content-type");

    if (!key || !contentType) {
      return new Response("Key and Content-Type are required");
    }

    await env.DOCS.put(key, request.body, {
      httpMetadata: request.headers,
    });

    return new Response(`Stored ${key}`);
  },
} satisfies ExportedHandler<Env>;

npx wrangler devを実行し、Wranglerが表示したローカルアドレスをWORKER_URLに設定します。そのうえで、ローカルのPDFを拡張子のない保存先へアップロードします。

Bash
curl "$WORKER_URL/documents/manual-alpha" \
  --request PUT \
  --header "Content-Type: application/pdf" \
  --data-binary @manual.pdf

この例で確認できるのはストレージへの保存までで、インデックス作成までは証明できません。本番環境では認証を追加し、ユーザーのファイル名だけに頼らず信頼できる検査から型を判定し、Cloudflareの対応形式一覧と照合してください。

アップロード成功だけでは検索可能とは限らない

R2への書き込みには強い整合性があるため、書き込み成功後はオブジェクトとメタデータを確認できます。一方、AI Searchのインデックス作成は別の非同期ジョブです。同期リクエストが受理されても、後からアイテムが失敗することはあります。

R2を取り込み元にするインスタンスの同期は、デフォルトで6時間ごとです。間隔は1、2、4、6、12、24時間から選べるほか、次のコマンドで自分でジョブを開始できます。

Bash
npx wrangler ai-search jobs create <INSTANCE_NAME>

手動のソース同期を実行できるのは、最短でも30秒に1回です。再試行の回数を増やしても、不正なメタデータは直りません。

ジョブの完了後に、アイテムログ、アイテム詳細、またはインスタンス統計を確認します。AI Searchが検出したファイル形式を受け付けられないときは、アイテム単位のエラーとしてunsupported_typeが記録されます。オブジェクトを修正し、そのアイテムまたはソースをもう一度同期してください。

すべてのR2キーに認識可能な拡張子が付いているなら、今回の変更による影響はありません。AI Searchのソースが外部R2バケットではなく、Webサイトや組み込みストレージである場合も同様です。未対応の形式や上限を超えるファイルが、この変更でインデックス可能になるわけではありません。

次の月曜日にやること

最初に行うべきは、一括書き換えではなく監査です。

  1. 取り込まれなかった拡張子なしオブジェクトを見つける

    httpMetadataを含めてR2オブジェクトを一覧取得し、truncatedがfalseになるまでページをたどります。最後のパス部分に拡張子がないキーを抽出し、AI Searchのアイテムログやunsupported_typeエラーと突き合わせます。

  2. メタデータを分類する

    対応するMIMEタイプと、欠落、不正、未対応、application/octet-streamの値を分けます。カスタムx-amz-meta-*フィールドは別の問題を解決するものなので、この確認には含めません。

  3. 小規模な取り込みで修復を試す

    実際に保存している形式から、偏りのない小さなサンプルを選びます。利用するツールで可能なら元のキーを保ったまま、正しいHTTP Content-Typeを付けて各オブジェクトを書き込むかコピーします。

  4. 同期し、検索できることを確かめる

    ソース同期を一度実行します。アイテムの処理完了を待ってログを確認し、各ドキュメント内の既知の語句を検索します。ストレージへの書き込み成功がゴールではありません。ソースの該当箇所が返って初めて完了です。

  5. 検証できてから範囲を広げる

    修復方法によって発生するClass AとClass Bのオペレーション数を見積もり、R2のストレージクラスを確認してからバッチを拡大します。同時にアップローダーも更新し、新しい拡張子なしオブジェクトに対応するメタデータが付くようにします。

安定した、または不透明なR2キーのためにAI Search用の別の命名経路を維持しているなら、今週中に対応する価値があります。既存オブジェクトに信頼できる型情報がないなら、書き換え前に分類計画が必要なので待つべきです。認識可能な拡張子だけで取り込みを問題なく運用できているなら、何もする必要はありません。

次のプラットフォーム変更も運用判断まで落とし込んで読みたい方は、ニュースレターにご登録ください

最終更新
2026年9月12日
カテゴリー
Explained

Googleでこのサイトを優先する

omidsaffari.comをGoogle検索の優先ソースに追加

omidsaffari.comを優先ソースに設定すると、GoogleがTop Stories・AI Overviews・AI Modeであなたのために優先表示します。

Vercelのコード サンドボックスが64 GBに──大規模ジョブはどう変わる?

Vercelのコード サンドボックスが64 GBに──大規模ジョブはどう変わる?

Vercel Sandboxの作業ストレージが32 GBから64 GBへ拡大しました。リポジトリ、ビルド、AIエージェント、データ処理のどのジョブがコード サンドボックス内に収まるのかを解説します。移行前に測るべきピーク容量、永続化と料金の違い、実運用での検証手順と判断ポイントまで整理します。2026年9月12日Explained
Cloudflare Workflowsの保存期間が7日に短縮:実行履歴とコストの設計法

Cloudflare Workflowsの保存期間が7日に短縮:実行履歴とコストの設計法

Cloudflare Workflowsでは、新規のWorkers Paid Workflowの完了・エラー状態の既定保存期間が30日から7日に短縮されました。成功履歴とエラー履歴を分け、障害調査に必要な期間を守りながらストレージ料金を見積もる方法を、設定例と具体的なコストモデルで解説します。2026年9月11日Explained
AIレポート作成を週次業務に組み込む:ChatGPT Data実践ガイド

AIレポート作成を週次業務に組み込む:ChatGPT Data実践ガイド

ChatGPT Dataを使い、承認済みの業務データから週次レポートやダッシュボードを作る方法を解説します。指標定義、データ権限、公開範囲、人による承認、Work・Codex・DWH・BIを含む実コストを整理。AIレポート作成を安全に試し、毎週の引き継ぎを減らすための手順と、導入前に確認すべき限界をまとめました。2026年9月11日Explained
Cursor 使い方ガイド:Projectsでチーム開発をレビューキューへ

Cursor 使い方ガイド:Projectsでチーム開発をレビューキューへ

Cursor Projectsは、共有コンテキストとコーディネーター、定期トリガーでAIコーディングの仕事単位をどう変えるのか。チーム導入前に押さえたいCursor 使い方の要点、レビュー負荷、料金、検証手順を、20件に限定したパイロットとモデル利用料・人件費の試算を交えて実務目線で解説します。2026年9月11日Explained
Codex 料金ガイド:ChatGPT Deep ResearchとWorkの共有予算

Codex 料金ガイド:ChatGPT Deep ResearchとWorkの共有予算

ChatGPT WorkのDeep Researchは、Codexと同じ利用枠またはクレジットを消費します。Codex 料金の計算方法、通常のChatとの違い、共有予算を守る運用手順を整理。具体的なクレジット試算から、成果物と引用を人が確認するポイントまで分かりやすく解説します。2026年9月10日Explained
Vercel 料金改定:非公開の本番サイトはいくらかかる?

Vercel 料金改定:非公開の本番サイトはいくらかかる?

Vercel 料金改定を解説。追加$0のVercel Authenticationと、Proで1プロジェクト月額$20のPassword Protectionを比較します。1、5、8件の試算から、社内ツール、顧客確認用サイト、既存の月額$150プランで選ぶべき方式と設定時の注意点を整理します。2026年9月10日Explained
ChatGPT 音声会話の制限で見直す、1日分の業務コスト

ChatGPT 音声会話の制限で見直す、1日分の業務コスト

ChatGPT 音声会話の制限が変わり、GoとPlusはローリング24時間で3時間、Pro $100は15時間、Pro $200は無制限になりました。プラン別のモデル、上限到達後の挙動、Desktop Voiceとの違いを整理し、音声中心の仕事を止めないプラン選びと利用記録の付け方を解説します。2026年9月9日Explained
Vercel 料金はどこまで定額に?Flat Rate CDNの仕組みを解説

Vercel 料金はどこまで定額に?Flat Rate CDNの仕組みを解説

Vercel ProのFlat Rate CDNで、CDN料金はどこまで固定できるのか。4段階の容量、スパイク保護、オンデマンドとの違い、対象外コストを整理。SaaSや制作会社がBillingで選ぶべきティアを具体例から解説し、月額$20から始まる容量料金と、請求総額が定額にならない理由までわかりやすく紹介します。2026年9月9日Explained
ニュースレター

毎週日曜、一通の手紙。動くシステムの話。感想戦ではなく。

週刊。スパムなし。いつでも解除できます。