Amazon Bedrock Web Search のドメインフィルタで、DevelopersIO を許可・除外してみた

Amazon Bedrock Web Search のドメインフィルタで、DevelopersIO を許可・除外してみた

Amazon Bedrock Web Search のドメインフィルタ(allowed_domains / blocked_domains)を試しました。DevelopersIO の除外で引用から dev.classmethod.jp が消え、許可外の example.com は開けませんでした。
2026.10.26

はじめに

2026年10月23日、Web Search on Amazon Bedrock にドメインフィルタが加わりました。結果に含めるドメインと除外するドメインを、リクエストで指定できます。

https://aws.amazon.com/about-aws/whats-new/2026/10/bedrock-web-search-domain-user-location/

この記事は、Web Search の一般提供直後の記事(先行記事1)と、External Web Access を扱った記事(先行記事2)の続編です。

https://dev.classmethod.jp/articles/bedrock-mantle-gpt56-web-search/

https://dev.classmethod.jp/articles/bedrock-web-search-external-web-access/

DevelopersIO の記事を尋ねる同じ質問を、フィルタなし・allowed_domains・blocked_domains の3条件で各3回実行しました。検索クエリ、open_page、引用の違いをログで確認しました。あわせて、許可していない URL や除外した URL を開かせたときの挙動も調べました。

設定

取得先の制御

Web Search で回答の根拠にするサイトを決める手段は、次のように加わってきました。

時期 追加されたもの 取得先を決める手段
2026-08-04 Web Search の一般提供 Amazon が運用する Web インデックスで検索する。先行記事1では、モデルが追加の検索に site: を付けて AWS 公式ドメインに絞っていた
2026-08-19 External Web Access IAM の bedrock-websearch:ExternalWebAccess と、リクエストの external_web_access で、公開 Web からの取得を許可するかを決める。取得先のサイトを指定する手段は告知に書かれていない
2026-10-23 ドメインフィルタ filters の allowed_domains / blocked_domains で、結果に含めるドメインと除外するドメインをリクエストに書く

https://aws.amazon.com/about-aws/whats-new/2026/08/amazon-bedrock-web/

https://aws.amazon.com/about-aws/whats-new/2026/08/amazon-bedrock-web-access-web-search/

IAM ガイドに載っている Web Search の条件キーは、リージョンで制限する aws:RequestedRegion の1つだけです。アクションが対象にできるリソースも * だけで、取得先のサイトを IAM で指定する方法はガイドにありません。

https://docs.aws.amazon.com/bedrock/latest/userguide/security-web-search.html

filters の書き方

web_search ツールの filters に、allowed_domains か blocked_domains を指定します。告知では、allowed_domains は結果を信頼できるソースに限る用途、blocked_domains は特定のソースを除外する用途とされています。各リストには100件まで指定できます。

ドメインは http:// や https:// を付けずに書きます。各エントリはサブドメインにも一致し、ガイドの例では aws.amazon.com を指定すると docs.aws.amazon.com も含まれます。

https://docs.aws.amazon.com/bedrock/latest/userguide/web-search.html

検証で使った tools の値は次の2つです。後述の呼び出しスクリプトでは、--tools 引数にそのまま渡しました。

[
  {
    "type": "web_search",
    "external_web_access": true,
    "filters": {
      "allowed_domains": ["dev.classmethod.jp"]
    }
  }
]
[
  {
    "type": "web_search",
    "external_web_access": true,
    "filters": {
      "blocked_domains": ["dev.classmethod.jp"]
    }
  }
]

前提

エンドポイント

Web Search はサーバーサイドツールで、bedrock-runtime の Responses API では使えません。bedrock-mantle の Responses API で呼びます。bedrock-mantle のガイドにも、bedrock-runtime ではサーバーサイドツールと事前構成ツール(Web Search を含む)が使えないと書かれています。同じガイドは新規アプリケーションに bedrock-runtime を勧めており、bedrock-mantle を bedrock-runtime に無い機能が必要なときに使うものと位置づけています。

https://docs.aws.amazon.com/bedrock/latest/userguide/bedrock-mantle.html

bedrock-runtime に、モデル(us.openai.gpt-5.6-luna)と入力を揃えて、tools なしと web_search ありの2通りで送りました。tools なしでは HTTP 200 が返り、web_search を付けると次の 400 が返りました。

REQUEST_URL=https://bedrock-runtime.us-east-1.amazonaws.com/openai/v1/responses
REQUEST_BODY={"model": "us.openai.gpt-5.6-luna", "input": "web search bedrock bedrock-websearch:ExternalWebAccess", "store": false, "tools": [{"type": "web_search", "external_web_access": true}]}
HTTP_STATUS=400
{
  "error": {
    "message": "web search is not supported for this request",
    "type": "invalid_request_error",
    "param": null,
    "code": "validation_error"
  }
}

Mantle のベース URL のパスは、モデル openai.gpt-5.6-luna では /openai/v1 です。/v1 を指定すると、別の 400 が返りました。

REQUEST_URL=https://bedrock-mantle.us-east-1.api.aws/v1/responses
HTTP_STATUS=400
    "message": "The model 'openai.gpt-5.6-luna' does not support the '/v1/responses' API",

/openai/v1 では HTTP 200 が返りました。

REQUEST_URL=https://bedrock-mantle.us-east-1.api.aws/openai/v1/responses
HTTP_STATUS=200

検証環境

検証は 2026-10-25 に us-east-1 で実施しました。ベース URL は https://bedrock-mantle.us-east-1.api.aws/openai/v1、モデルは openai.gpt-5.6-luna で、bedrock-websearch:ExternalWebAccess の権限を持つ認証情報から短期 Bearer トークンを生成して呼び出しました。リクエストでは external_web_access を true にしています。

スクリプトは、pip で openai==2.40.0 と aws-bedrock-token-generator==1.1.0 を入れた環境で実行し、認証情報は環境変数で渡しました。

検証方法

質問と条件

検索と引用への効き方は、「DevelopersIO の Amazon Bedrock Web Search の External Web Access を検証した記事を教えて」という質問で確かめました。フィルタなし、allowed_domains に dev.classmethod.jp、blocked_domains に dev.classmethod.jp の3条件を、3回ずつ実行しました。

ページの取得(Fetch)への効き方は、「https://example.com/ を開いて、書かれている内容を原文のまま答えて」という質問で確かめました。Fetch は、応答の web_search_call に open_page として記録されます。フィルタなし、allowed_domains に dev.classmethod.jp、blocked_domains に example.com の3条件を、各2回実行しました。

スクリプト

Responses API を1回呼び出して、HTTP ステータスと応答本文をそのまま出力するスクリプトを使いました。

ws_call.py
"""Responses API を 1 回呼び、HTTP ステータスと応答本文(JSON)をそのまま出力する。

認証情報は環境変数(AWS_ACCESS_KEY_ID など)で受け取り、短期 Bearer トークンを生成する。
SDK の例外で握りつぶさず、エラー時も HTTP ステータスと本文の原文を出す。
"""
import argparse
import json
import sys

import httpx
from aws_bedrock_token_generator import provide_token

p = argparse.ArgumentParser()
p.add_argument("--base-url", required=True)
p.add_argument("--model", required=True)
p.add_argument("--question", required=True)
p.add_argument("--tools", default="[]", help="tools 配列の JSON")
p.add_argument("--region", default="us-east-1")
a = p.parse_args()

token = provide_token(region=a.region)
body = {"model": a.model, "input": a.question, "store": False}
tools = json.loads(a.tools)
if tools:
    body["tools"] = tools

print("REQUEST_URL=" + a.base_url.rstrip("/") + "/responses")
print("REQUEST_BODY=" + json.dumps(body, ensure_ascii=False))
r = httpx.post(
    a.base_url.rstrip("/") + "/responses",
    headers={"Authorization": "Bearer " + token, "Content-Type": "application/json"},
    json=body,
    timeout=300,
)
print("HTTP_STATUS=%d" % r.status_code)
try:
    print(json.dumps(r.json(), ensure_ascii=False, indent=2))
except ValueError:
    print(r.text)
sys.exit(0 if r.status_code < 400 else 1)

実行は次の形です。blocked_domains の例を示します。

python ws_call.py \
  --base-url https://bedrock-mantle.us-east-1.api.aws/openai/v1 \
  --model openai.gpt-5.6-luna \
  --question "DevelopersIO の Amazon Bedrock Web Search の External Web Access を検証した記事を教えて" \
  --tools '[{"type":"web_search","external_web_access":true,"filters":{"blocked_domains":["dev.classmethod.jp"]}}]'

ログの抽出

出力は REQUEST_URL、REQUEST_BODY、HTTP_STATUS の3行のあとに JSON が続きます。その JSON 部分を response.json に保存し、検索クエリ、open_page の URL、引用 URL を jq で取り出しました。

jq -r '(.output[] | select(.type=="web_search_call") | .action | "\(.type)\t\(.query // .url)"), ([.output[] | select(.type=="message") | .content[].annotations[].url] | unique[] | "cited\t\(.)")' response.json

計測結果

指定ドメインの検索

3条件の集計です。引用した回は引用 URL のドメインで数え、web_search_call の件数は jq の出力の search と open_page の行を合わせた数と同じです。

条件 dev.classmethod.jp を引用した回 引用に出たドメイン(3回分) web_search_call の件数(1〜3回目)
フィルタなし 3/3 dev.classmethod.jp 2, 1, 2
allowed_domains: dev.classmethod.jp 3/3 dev.classmethod.jp 2, 2, 1
blocked_domains: dev.classmethod.jp 0/3 b.hatena.ne.jp, zenn.dev 11, 9, 10

以降の出力は、各条件の1回目のものです。フィルタなしでは次のとおりでした。

search	site:dev.classmethod.jp Amazon Bedrock Web Search External Web Access 検証
open_page	https://dev.classmethod.jp/articles/bedrock-web-search-external-web-access/
cited	https://dev.classmethod.jp/articles/bedrock-web-search-external-web-access/

この質問では、フィルタを指定しなくても、モデルは site:dev.classmethod.jp を付けて検索し、DevelopersIO の記事1本を引用しました。

allowed_domains を指定した1回目の出力は、フィルタなしと同じ3行でした。3回とも、検索は site:dev.classmethod.jp 付きで、引用はフィルタなしと同じ記事1本でした。この質問では、フィルタなしでも検索が dev.classmethod.jp に向いていました。

blocked_domains を指定すると、次のとおりでした。

search	site:dev.classmethod.jp Amazon Bedrock Web Search External Web Access 検証
search	DevelopersIO Amazon Bedrock Web Search 外部ウェブアクセス
search	site:dev.classmethod.jp/articles/ "Web Search" "Bedrock" "External"
search	DevelopersIO Amazon Bedrock Web Search 検証 外部アクセス
search	"Amazon Bedrock Web Search の external_web_access が有効化されたので"
search	site:dev.classmethod.jp/articles/ "GPT-5.6 Luna"
open_page	https://b.hatena.ne.jp/entry/s/dev.classmethod.jp/articles/dedicated-ips-managed-feature/
open_page	https://dev.classmethod.jp/search/?q=external_web_access
search	"Amazon Bedrock Web Search の external_web_access" -hatena
open_page	https://b.hatena.ne.jp/q/amazon%20bedrock%20web%20search%20external_web_access
search	dev.classmethod.jp/articles/ "Amazon Bedrock Web Search の external_web_access が有効化されたので"
cited	https://b.hatena.ne.jp/entry/s/dev.classmethod.jp/articles/dedicated-ips-managed-feature/
cited	https://zenn.dev/aws_japan/articles/bedrock-web-search-external-access

blocked_domains に dev.classmethod.jp を指定すると、dev.classmethod.jp は3回とも引用から外れました。モデルは site:dev.classmethod.jp を付けた検索も含め、クエリを言い換えながら検索を重ねました。web_search_call は、フィルタなしの1〜2件から9〜11件に増えています。

3回とも dev.classmethod.jp 宛ての open_page が記録されていました。2回目の回答は「DevelopersIO 本体の直接URLは取得できませんでした」と述べました。

パスに dev.classmethod.jp を含む b.hatena.ne.jp の URL は、blocked_domains を指定した条件でも引用に出ました。

ページの取得

3条件の結果です。

条件 実行回数 回答
フィルタなし 2 2回ともページの内容を原文で返した(Example Domain / This domain is for use in illustrative examples in documents. …)
allowed_domains: dev.classmethod.jp 2 2回とも開けなかったと答えた
blocked_domains: example.com 2 2回とも開けなかったと答えた

どの条件でも、web_search_call の status は completed で、action の type は open_page、url は https://example.com/ でした。先行記事2で見た、権限なしの外部 Fetch が failed(url は null)になる記録とは異なります。この3条件では、取得に成功したかどうかを API 応答の status から区別できなかったため、回答の本文で判断する必要があります。

まとめ

OpenAI の Responses API で利用できていた Web Search のドメインフィルタが、今回 Bedrock でも Mantle エンドポイントで利用できるようになりました。

特定の公開サイト内の情報を案内する仕組みや、除外したいサイトがあるワークロードで、Bedrock にドメインフィルタが無かったためにプロンプトの調整で対処していた場合は、今回のアップデートを試してみてください。


AI白書2026 配布中

クラスメソッドが独自に行なったAI診断調査をもとに、企業のAI活用の現在地を調査レポートとしてまとめました。企業規模別の活用度傾向に加え、規模を超えてAI活用を進める企業に共通する取り組みまで、自社の現在地を捉えるためのヒントにぜひ。

AI白書2026

無料でダウンロードする

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事