Amazon QuickからBrave Searchを使って日本語Web検索を利用する方法3パターン

記事タイトルとURLをコピーする

はじめに

こんにちは、久保(賢)です。

Amazon Quick は、組織内外のデータを活用してエージェンティック AI を利用できる、AWS のマネージドサービスです。

複雑な基盤を構築したり管理したりすることなく、組織の知識や外部データを活用して、エージェンティックAIを手軽に利用することができます。

今回は、Amazon Quick を使用して日本語圏のWeb検索を行う方法について説明します。

本記事の対象

  • Amazon Quick を使用して日本語圏のWeb検索を行いたいがうまく検索されず困っている方
  • Amazon Quick でBrave Search APIを利用する方法を知りたい方

Amazon Quick におけるWeb検索の制限

Amazon Quickは東京リージョンでも一般提供されており、Web検索機能も利用可能です。

ただし、本記事執筆時点ではWeb検索の機能については東京リージョンでは実行されず、米国東部(バージニア北部)リージョンで実行される仕様となっています。

AWS Regions, websites, IP address ranges, and endpoints - Amazon Quick

Amazon Quick makes cross-Region calls for web search functionality in Chat, Agents, and Research features. When using web search, requests are processed in the US East (N. Virginia) Region, even for requests originating outside the US East (N. Virginia) Region and the US geography. For customers in EMEA Regions, web search queries are processed in the Europe (Ireland) Region. Users in Asia Pacific (Sydney) and Asia Pacific (Tokyo) will receive an explicit notification that web search queries are processed in the US and must acknowledge this before proceeding.

(機械翻訳)

Amazon Quick は、Chat、Agents、Research の各機能におけるウェブ検索機能のために、リージョン間の呼び出しを行います。ウェブ検索を使用する場合、リクエストは、米国東部(バージニア北部)リージョンおよび米国地域外から発信されたリクエストであっても、米国東部(バージニア北部)リージョンで処理されます。EMEA リージョンのお客様については、ウェブ検索クエリは欧州(アイルランド)リージョンで処理されます。アジアパシフィック(シドニー)およびアジアパシフィック(東京)のユーザーには、ウェブ検索クエリが米国で処理されることについて明示的な通知が表示され、続行する前にこれを承認する必要があります。

そのような仕様のためか、検索結果は英語圏のWebサイトが中心となり、日本語での検索については期待する精度が得られない場合があります。

例えば、弊社サーバーワークスの代表取締役社長と取締役について調べることができません。(正解=代表取締役社長:大石 良 取締役: 羽柴 孝)

「サーバーワークスの代表取締役社長と取締役は誰ですか?」の結果

英語で同じ質問をしてみると、米国にある ServerWorks社 とともに弊社も検索され、社長の大石だけ回答されました。

Who are the President and CEO and directors of Serverworks?

検索結果が得られた場合は「ソース」ボタンが表示されています。
クリックしてみるとわかるとおり、ソースはすべて海外の英語圏のサイトです。

このように、執筆時点ではAmazon QuickのWeb検索機能は日本語圏のWebサイトを十分にカバーできていないため、日本語での検索で期待する結果が得られない場合があります。(うまくいく検索もあります)

解決策

日本語圏の検索に対応した検索サービスの API や MCP サーバーを Amazon Quick のアクションとして登録することで、Quick から日本語圏の Web 検索を利用できます。

Tavily や Brave SearchといったサービスがAPIを提供しているため、これらを利用することができます。

これらは双方ともにAWS Marketplaceで提供されているため、AWSをご利用の方は簡単に利用を開始することができ、個別の外部サービスとの契約を新たに処理することなく、サブスクライブ可能です。料金もAWS利用料に含まれるため、請求も一元化されます。

さらにBrave Search APIの場合、1リクエストあたり$0.005 (執筆時点) で完全に従量課金で利用できるため、コストを抑えながら日本語圏のWeb検索を実装することができます。

aws.amazon.com

TavilyとBrave Searchの比較については弊社の過去ブログ記事をご参照ください。

blog.serverworks.co.jp

本記事では Amazon Quick でBrave Search APIを利用して日本語圏のWeb検索を行う方法について説明します。

実装パターン

本記事では3つの実装パターンを紹介します。

基本的には(1)の方法が手軽ですが、より柔軟な対応を行いたい場合は(3)のようにLambdaでBrave Search MCPサーバーをホストする方法が考えられます。また、できるだけ公式リソースを利用しメンテナンスを最小限にしたい場合は(2)のAgentCore Runtimeのパターンが適しています。 お急ぎの方は(1)のみお読みいただければ十分です。

AgentCore Gateway にはターゲットの「統合」の選択肢として"Brave"が提供されていますが、日本語での利用においてはレスポンスが文字化けする現象があり、執筆時点では日本語では期待通りに利用できませんでした。こちらは本記事では扱いません。

前提条件

APIキー

Brave Search APIのAPIキーは発行済とします。

Marketplaceでサブスクライブすることで、APIキーを発行することが可能です。

aws.amazon.com

Amazon Quick環境

Amazon Quick の管理者権限を持っていることが前提となります。
東京リージョンでの利用を想定しています。

(1) OpenAPI 仕様で Quick に Brave Search API を登録

Amazon Quick では、OpenAPI 仕様 を使用して外部APIを登録することができます。

(1-1) OpenAPI 仕様の作成

Brave Search API は以下の公式APIドキュメントにて仕様を公開しています。

Brave Search - API

ただし、OpenAPI仕様は公開されていません。
ここでは最低限GETによるWeb検索が可能なOpenAPI仕様を自分で作成したものを使用します。

公式のOpenAPI仕様ではないため動作の保証はいたしかねます。ご了承の上ご利用ください。

QuickではJSON形式のOpenAPI仕様のみサポートされているため、JSON形式で用意します。

以下の内容を brave-search-openapi.json というファイル名で保存します。

{
  "openapi": "3.0.3",
  "info": {
    "title": "Brave Search API",
    "version": "1.0.0",
    "description": "Minimal OpenAPI schema for Brave Web Search API."
  },
  "servers": [
    {
      "url": "https://api.search.brave.com/res/v1"
    }
  ],
  "components": {
    "securitySchemes": {
      "ApiKeyAuth": {
        "type": "apiKey",
        "in": "header",
        "name": "X-Subscription-Token"
      }
    }
  },
  "security": [
    {
      "ApiKeyAuth": []
    }
  ],
  "paths": {
    "/web/search": {
      "get": {
        "operationId": "braveWebSearch",
        "summary": "Search the web with Brave Search",
        "description": "Performs a web search using Brave Search API.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 400
            },
            "description": "Search query."
          },
          {
            "name": "count",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 20,
              "default": 10
            },
            "description": "Number of search results to return. Maximum is 20."
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9,
              "default": 0
            },
            "description": "Page offset for pagination."
          },
          {
            "name": "country",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "default": "JP"
            },
            "description": "Country code for search results, such as JP or US."
          },
          {
            "name": "search_lang",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "default": "ja"
            },
            "description": "Language code for search results, such as ja or en."
          },
          {
            "name": "safesearch",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "off",
                "moderate",
                "strict"
              ],
              "default": "moderate"
            },
            "description": "Adult content filter."
          },
          {
            "name": "freshness",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Time filter. Supported values include pd, pw, pm, py, or YYYY-MM-DDtoYYYY-MM-DD."
          }
        ],
        "responses": {
          "200": {
            "description": "Search results.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    }
  }
}

(1-2) Amazon Quickに登録

Amazon Quickの "Connectors" からOpenAPI仕様を登録します。

「Connectors」をクリックし、「Create for your team」をクリックします。

検索欄に"Open"を入力して検索します。 「OpenAPI Specification」をクリックします。

「スキーマのインポート」をクリックし、先ほど作成した brave-search-openapi.json をアップロードします。

アップロードしたjsonが表示されます。「次へ」をクリックします。

以下のように入力し「次へ」をクリックします。

項目
名前 Brave Search API
説明 This API provides reliable, up-to-date web search capabilities via Brave Search.
接続タイプ パブリックネットワーク
OAuth Configuration API Key
ベースURL https://api.search.brave.com/res/v1
APIキー Brave Search APIのAPIキーを入力
Eメール 空欄でOK

「作成して続行」をクリックします。

公開範囲を選択します。ここでは組織内に全体公開にして「公開」をクリックします。

これでBrave Search APIがAmazon Quickのコネクタとして登録されました。

(1-3) 動作確認

チャットアイコンをクリックすることでチャットエージェントですぐ試すことができますが、私の環境ではうまくいかなかった(実際には有効なのにセッションが有効期限切れといったエラー)ので、チャットエージェントを新しく開いて試します。

チャットエージェントで「すべてのデータ」の部分をクリック→「+追加」をクリックします。 「Brave Search API」をチェックし「保存」をクリックします。

チャットエージェントのツールとして"Brave Search API"が表示されていることを確認し、組み込みのWeb検索機能はオフにします。
改めて聞いてみます。

正しい情報が得られました。

ただし、注意点として、Amazon QuickのWeb検索機能以外のアクションで取得した情報の「ソース」は、下図のとおりアクション名が表示されるだけとなります。
参照したURLなどの情報が必要な場合は、チャットエージェント等のプロンプトで、ソースURLを出力するように指示する必要があります。

ソースはアクション名のみとなる

また、「レスポンスイベント」をクリックして展開するとAIエージェントが行った行動が確認可能です。
以下のとおりBrave Search APIが2回利用されています。

以上が、OpenAPI 仕様 で Quick に Brave Search API を登録する方法です。

このあとの方法も共通ですが、Connectorsに登録したアクションはチャットエージェント、スペース、フロー、研究など、Amazon Quickの様々な機能から利用することが可能です。

(2) 公式のMCPサーバー用コンテナイメージをAgentCore Runtimeにデプロイして利用

AWS Marketplaceで、"Brave Search MCP Server"という製品も提供されています。("Brave Search API"とは別です)

aws.amazon.com

こちらをサブスクライブすることで、Bedrock AgentCore Runtime等にBrave Search MCPサーバーをデプロイして利用することが可能です。
コンテナイメージはBraveにてメンテナンスされています。

当パターンはECRイメージの提供がus-east-1のみであるため、us-east-1にのみデプロイ可能です。ご注意ください。

(2-1) Brave Search APIキーをSecrets Managerに登録

まず最初にBrave Search APIキーをAWS Secrets Managerに登録しておきます。

quick-mcp/brave-api-key という名前で登録します。

マネジメントコンソールから登録もしくは以下のコマンドで登録します。

$ export AWS_PROFILE=your-aws-profile
$ aws secretsmanager create-secret --name quick-mcp/brave-api-key --secret-string "<API_KEY_FOR_BRAVE_SEARCH>" --region ap-northeast-1 2>&1

(2-2) AWS Marketplaceで、"Brave Search MCP Server"をサブスクライブ

https://aws.amazon.com/marketplace/pp/prodview-6yt3tbr7ucbjy にアクセスし、「購入オプションを表示」をクリックします。

製品の詳細や利用規約を確認し、問題なければ「サブスクライブ」をクリックします。
(当製品自体には料金はかかりません。AgentCore Runtime等のAWSサービスの料金が必要となります)

数分以内に購入完了となります。
「ソフトウェアを起動」をクリックします。

ここではコンテナのデプロイは行いません。コンテナイメージのURLの確認のみ行います。 「アマゾンベッドロックエージェントコア」をクリックし、画面最下部までスクロールします。 最下部にAmazon ECRイメージURLがありますのでこちらを確認しておきます。

Marketplaceでサブスクライブしない限り上記ECRイメージはpullできません。

(2-3) AWS CDKで構築

以下でAWS CDKのコードを公開しております。Marketplaceのサブスクライブさえ済んでいれば、cdk deployのみで環境構築が可能です。

https://github.com/knziiy/sample-quick-with-bravesearch

以下のとおりデプロイします。 なお、cdk.json でBrave Search MCP ServerのコンテナイメージURLを設定します。さきほどMarketplaceで確認したイメージURLを利用する場合は変更してください。

$ git clone https://github.com/knziiy/sample-quick-with-bravesearch.git
$ cd agentcore-gw-runtime
$ npm install
$ export AWS_REGION=us-east-1
$ npm run deploy

deploy完了時に、以下のように各種情報が出力されます。

項目名 値の説明
GatewayUrl Quick からリモート MCP サーバーとして登録する AgentCore Gateway の MCP エンドポイント URL
OAuthClientId Gateway への認証に使用する Cognito OAuth クライアント ID
OAuthClientSecretArn OAuth クライアントシークレットを保存している AWS Secrets Manager の Secret ARN
OAuthScope Gateway の MCP 呼び出しに必要な OAuth スコープ
OAuthTokenUrl OAuth アクセストークンを取得するための Cognito トークンエンドポイント URL
RuntimeArn 作成された AgentCore Runtime の ARN

OAuthClientSecretArnはクライアントシークレットの値を直接出力するのではなく、Secret ARNを出力するようにしています。 このARNをもとにAWS Secrets Managerからクライアントシークレットの値を確認してください。

AWS CLIでの確認例

aws secretsmanager get-secret-value --secret-id <ARN> --query SecretString --output text

AgentCore Gatewayでは、ターゲットの登録先にAgentCore Runtimeを指定することが可能ですが、CloudFormation/AWS CDKでは未対応です(マネジメントコンソールからのみ登録可能)。そのため、本例のAWS CDKコードでは MCP サーバーとしてターゲットを登録する方式にしています。詳しくはコードをご確認ください。

(2-4) Amazon QuickにリモートMCPサーバーとして登録

「Connectors」をクリックし、「Create for your team」をクリックします。

検索欄に"Model"を入力して検索します。 「Model Context Protocol」をクリックします。

すでに他の登録がある場合はさらに「No, create new」をクリックします。

以下のように入力し、「次へ」をクリックします。

項目
Name Brave Search MCP AgentCore
description This MCP server provides reliable, up-to-date web search capabilities via Brave Search.
MCP server endpoint AWS CDKのデプロイで出力された GatewayUrl の値を入力 (例: https://quick-brave-runtime-gateway-xxxxxxxxxxxx.gateway.bedrock-agentcore.us-east-1.amazonaws.com/mcp)
Connection type Public network

以下のように入力し「作成して続行」をクリックします。

項目
認証設定 サービス認証
OAuth Configuration サービス間OAuth
クライアントID AWS CDKのデプロイで出力された OAuthClientId の値を入力
クライアントシークレット AWS Secrets Managerの OAuthClientSecretArn が指すシークレットの
トークンURL AWS CDKのデプロイで出力された OAuthTokenUrl の値を入力

「次へ」をクリックします。

公開範囲を選択します。ここでは組織内に全体公開にして「Publish」をクリックします。

これで登録完了です。
登録されたMCPサーバーをクリックします。

登録設定時はlistToolsのアクションしか見えていませんでしたが、しばらくすると以下のとおり6種類のアクションが表示されるようになります。これらがBrave Search APIを呼び出すためのアクションです。

(2-5) 動作確認

チャットエージェントで登録したMCPサーバーのアクションが利用できることを確認します。

正しい回答が得られました。

レスポンスイベントを展開して確認すると、MCPサーバーのアクションが呼び出されていることがわかります。

以上が、公式のMCPサーバー用コンテナイメージをAgentCore Runtimeにデプロイして利用する方法です。

(3) Lambda で Brave Search MCP サーバーをサーブ

最後に、Lambda で Brave Search MCP サーバーをホストする方法を紹介します。

Brave はGitHubでMCPサーバーの実装を公開しています。

github.com

さらに、npmパッケージも公開されており、公式のMCPサーバーを簡単に構築することができます。

(3)の方法では、このnpmパッケージを利用してLambdaでMCPサーバーをホストし、AgentCore GatewayでM2M認証(サービス間認証)を設定することで、Amazon QuickからリモートMCPサーバーとして利用する方法を紹介します。
こちらは自身でMCPサーバーの処理を用意するため、検索の前後に自由に処理を追加することも可能です。

(3-1) Brave Search APIキーをSecrets Managerに登録

まず最初にBrave Search APIキーをAWS Secrets Managerに登録しておきます。

quick-mcp/brave-api-key という名前で登録します。

マネジメントコンソールから登録もしくは以下のコマンドで登録します。

$ export AWS_PROFILE=your-aws-profile
$ aws secretsmanager create-secret --name quick-mcp/brave-api-key --secret-string "<API_KEY_FOR_BRAVE_SEARCH>" --region ap-northeast-1 2>&1

(3-2) AWS CDKで構築

以下でAWS CDKのコードを公開しております。

https://github.com/knziiy/sample-quick-with-bravesearch

以下のとおりデプロイします。

$ git clone https://github.com/knziiy/sample-quick-with-bravesearch.git
$ cd agentcore-gw-lambda
$ npm install
$ npm run deploy

deploy完了時に、以下のように各種情報が出力されます。

項目名 値の説明
DiscoveryUrl OAuth/OIDC の設定情報を取得するための Cognito OpenID Configuration URL
GatewayArn 作成された AgentCore Gateway の ARN
GatewayId 作成された AgentCore Gateway の一意な ID
GatewayUrl Quick からリモート MCP サーバーとして登録する AgentCore Gateway の MCP エンドポイント URL
LambdaFunctionArn Brave Search MCP サーバーをサーブする Lambda 関数の ARN
OAuthClientId Gateway への認証に使用する Cognito OAuth クライアント ID
OAuthClientSecretArn OAuth クライアントシークレットを保存している AWS Secrets Manager の Secret ARN
OAuthScope Gateway の MCP 呼び出しに必要な OAuth スコープ
OAuthTokenUrl OAuth アクセストークンを取得するための Cognito トークンエンドポイント URL

OAuthClientSecretArnはクライアントシークレットの値を直接出力するのではなく、Secret ARNを出力するようにしています。 このARNをもとにAWS Secrets Managerからクライアントシークレットの値を確認してください。

AWS CLIでの確認例

aws secretsmanager get-secret-value --secret-id <ARN> --query SecretString --output text

(3-3) Amazon QuickにリモートMCPサーバーとして登録

「Connectors」をクリックし、「Create for your team」をクリックします。

検索欄に"Model"を入力して検索します。 「Model Context Protocol」をクリックします。

すでに他の登録がある場合はさらに「No, create new」をクリックします。

以下のように入力し、「次へ」をクリックします。

項目
Name Brave Search MCP
description This MCP server provides reliable, up-to-date web search capabilities via Brave Search.
MCP server endpoint AWS CDKのデプロイで出力された GatewayUrl の値を入力 (例: https://quick-brave-runtime-gateway-xxxxxxxxxxxx.gateway.bedrock-agentcore.us-east-1.amazonaws.com/mcp)
Connection type Public network

以下のように入力し「作成して続行」をクリックします。

項目
認証設定 サービス認証
OAuth Configuration サービス間OAuth
クライアントID AWS CDKのデプロイで出力された OAuthClientId の値を入力
クライアントシークレット AWS Secrets Managerの OAuthClientSecretArn が指すシークレットの
トークンURL AWS CDKのデプロイで出力された OAuthTokenUrl の値を入力

「次へ」をクリックします。

公開範囲を選択します。ここでは組織内に全体公開にして「Publish」をクリックします。

これで登録完了です。
登録されたMCPサーバーをクリックします。

登録設定時はlistToolsのアクションしか見えていませんでしたが、しばらくすると以下のとおり4種類のアクションが表示されるようになります。これらがBrave Search APIを呼び出すためのアクションです。

(3-4) 動作確認

チャットエージェントで登録したMCPサーバーのアクションが利用できることを確認します。

正しい回答が得られました。

レスポンスイベントを展開して確認すると、MCPサーバーのアクションが呼び出されていることがわかります。

以上が、Lambda で Brave Search MCP サーバーをサーブする方法です。

おわりに

今回はAmazon QuickでBrave Searchを利用して日本語圏のWeb検索を行う方法について紹介しました。

Amazon Quickは活発に機能追加や改善が実施されているため、今回紹介した内容は将来的には変わってくる可能性があります。

東京リージョンで日本のリージョンを基盤とするWeb検索が可能になることが期待されますが、現状では今回紹介した方法でBrave Search APIを利用することで、日本語圏のWeb検索を実現することが可能です。

もしAmazon QuickのWeb検索でお困りの場合は、自組織のセキュリティ方針や運用方針に合うパターンでご利用いただければと思います。

久保 賢二(執筆記事の一覧)

猫とAWSが好きです。