Amazon Bedrock Agents + Knowledge Bases + GuardrailsでECサイトのAIアシスタントを構築してみる

Amazon Bedrock Agents + Knowledge Bases + GuardrailsでECサイトのAIアシスタントを構築してみる

2026.04.15

はじめに

みなさんこんにちは、クラウド事業本部コンサルティング部の浅野です。

最近、ECサイトや企業サイトで生成AIを活用したカスタマーサポートやチャットボットをよく見かけるようになりました。こうしたサポートを実際に作ろうとすると、FAQ応答だけでなく、ドキュメント検索や業務システムとの連携、個人情報の保護といった要素を組み合わせる必要があります。

Amazon Bedrockにはこれらに対応するKnowledge Bases・Agents・Guardrailsといった機能が揃っていますが、個別の機能説明だけだと全体像がなかなかイメージしにくいなと感じていました。

そこで本記事では、架空のECサイトを題材にこれらの機能を組み合わせたAgentを構築し、Bedrockのみでどんな体験ができるのかを実際に試してみました。

構成

本記事では以下構成をコンソールから一式構築し、テストまでの動作確認を行いました。

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-01

今回構成のシチュエーションとして、架空のECサイトのカスタマーサポートを想定しています。

ユーザーからの問い合わせに対して、Agentが以下のようなケースで適切に回答できるように想定し構成を組みました。

例:

  • 「送料無料の条件は?」→ FAQドキュメントから回答(Knowledge Bases)
  • 「注文番号**********の状況を教えて」→ 注文照会APIを呼び出して回答(Action Groups)
  • 「注文番号**********をキャンセルしたい」→ キャンセルAPIを実行して結果を返す(Action Groups)
  • 「Amazonと比べてどっちが安い?」→ 競合比較として質問自体をブロック(Guardrails)
  • 「私のメールはtest@example.comです」→ 個人情報につながるものをマスク(Guardrails)

やってみた

AWSマネジメントコンソール上で全てのリソースを作成しており、手順が非常に長いので各セクションごとに折りたたんで記述しています。

ナレッジドキュメントの用意

ECサイトのユーザーからのお問い合わせを事実ベースで回答させる必要があるため、Knowledge Basesのデータソースとして、生成AIを用いて以下3つのドキュメントを用意しあらかじめ用意していたS3バケットにアップロードしました。

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-02

商品カタログ(products.csv)

架空の家電・日用品15品目のカタログです。「商品ID・商品名・カテゴリ・価格・在庫状況・保証期間・商品説明」の項目を含んでいます。

products.csv の内容
商品ID,商品名,カテゴリ,価格(円),在庫状況,保証期間,商品説明
CM-001,{架空の企業名} スマートスピーカー Lite,スマートホーム,4980,あり,1年,音声操作対応のコンパクトなスマートスピーカー。照明・エアコンなどの家電をハンズフリーで操作できる。Wi-Fi / Bluetooth 対応。
CM-002,{架空の企業名} スマート電球 3個セット,スマートホーム,2480,あり,1年,スマートフォンアプリで色温度・明るさを調整できるLED電球。スケジュール設定・音声アシスタント連携対応。E26口金。
CM-003,{架空の企業名} スマートプラグ,スマートホーム,1980,あり,1年,既存のコンセントをスマート化するWi-Fiプラグ。電力消費量のモニタリング・タイマー設定が可能。
CM-004,{架空の企業名} ワイヤレスキーボード,PC・周辺機器,6800,あり,1年,Bluetooth 5.0対応の薄型キーボード。最大3台のデバイスとペアリング可能。単4電池2本で最大12ヶ月使用できる。
CM-005,{架空の企業名} ワイヤレスマウス,PC・周辺機器,3480,あり,1年,2.4GHz無線接続の静音マウス。DPI切替(800/1200/1600)対応。USB-Cで充電しフル充電で約60日使用可能。
CM-006,{架空の企業名} USBハブ 7ポート,PC・周辺機器,4280,あり,1年,USB-A×4・USB-C×2・SDカードスロット×1の7ポートハブ。最大100W PD充電対応。アルミ合金製で放熱性に優れる。
CM-007,{架空の企業名} モバイルモニター 15.6インチ,PC・周辺機器,24800,残りわずか,1年,フルHD(1920×1080)対応の軽量モバイルモニター。USB-C1本で映像出力・給電が可能。折りたたみスタンド付属。
CM-008,{架空の企業名} ワイヤレスイヤホン Pro,イヤホン・オーディオ,12800,あり,1年,アクティブノイズキャンセリング搭載の完全ワイヤレスイヤホン。イヤホン単体で8時間ケース込みで32時間使用可能。IPX4防水対応。
CM-009,{架空の企業名} Bluetoothスピーカー,イヤホン・オーディオ,8980,あり,1年,360度サウンド対応のポータブルスピーカー。IP67防水・防塵。最大20時間再生。USB-C充電対応。
CM-010,{架空の企業名} 空気清浄機 コンパクト,生活家電,18000,あり,2年,6畳〜10畳向けのコンパクト空気清浄機。HEPAフィルター搭載で花粉・PM2.5・ペットの毛を除去。稼働音25dBの静音設計。
CM-011,{架空の企業名} 電動歯ブラシ,生活家電,5480,あり,2年,音波振動式電動歯ブラシ。3種のブラッシングモード搭載。USB充電式で1回の充電で約30日使用可能。替えブラシ2本付属。
CM-012,{架空の企業名} コードレス掃除機,生活家電,28000,残りわずか,2年,最大65分連続使用できるコードレス掃除機。吸引力22kPa。床・カーペット・布団に対応するアタッチメント3種付属。
CM-013,{架空の企業名} スマートウォッチ,健康・フィットネス,19800,あり,1年,心拍数・血中酸素・睡眠・ストレスをモニタリングできるスマートウォッチ。GPS内蔵。バッテリー最大14日間。5ATM防水対応。
CM-014,{架空の企業名} 体組成計,健康・フィットネス,6800,あり,1年,体重・体脂肪率・筋肉量・骨量など13項目を計測できるスマート体組成計。アプリと連携してデータを自動記録。最大8ユーザー登録可能。
CM-015,{架空の企業名} ヨガマット,健康・フィットネス,3980,あり,なし,厚さ8mmの高密度NBRフォーム製ヨガマット。滑り止め加工・吸汗素材。183cm×61cmのスタンダードサイズ。収納用ストラップ付属。

よくある質問(faq.md)

配送・支払い・キャンセル・アカウントなど、カスタマーサポートで実際に受けそうな質問と回答をまとめたドキュメントを生成しました。

faq.md の内容
# {架空の企業名} よくある質問(FAQ)

## 配送について

**Q. 配送にかかる日数はどのくらいですか?**
A. ご注文確定後、通常2〜3営業日以内にお届けします。離島・一部地域は追加で2〜3日かかる場合があります。

**Q. 送料はいくらですか?**
A. 1回の注文金額が5,000円(税込)以上の場合、送料無料です。5,000円未満の場合は全国一律550円(税込)の送料がかかります。

**Q. 配送状況を確認できますか?**
A. はい。注文確定メールに記載されている注文IDを使って、{架空の企業名}のマイページ「注文履歴」から配送状況をリアルタイムで確認できます。

**Q. 時間指定はできますか?**
A. はい。午前中・14〜16時・16〜18時・18〜20時・19〜21時の5つの時間帯から選択できます。注文時にご指定ください。

**Q. 置き配は対応していますか?**
A. はい。注文時に「置き配を希望する」を選択し、置き場所(玄関前・宅配ボックス等)を指定することができます。

## 支払いについて

**Q. 使えるクレジットカードは?**
A. VISA・Mastercard・JCB・American Express・Diners Clubに対応しています。

**Q. 後払い(コンビニ払い)はできますか?**
A. はい。コンビニ払い(セブン-イレブン・ローソン・ファミリーマート)と銀行振込が利用できます。いずれも注文確定から5日以内にお支払いください。

**Q. 分割払いはできますか?**
A. クレジットカードの分割払いはカード会社の規定に従いご利用いただけます。{架空の企業名}独自の分割サービスは現在提供しておりません。

**Q. 領収書は発行できますか?**
A. はい。マイページ「注文履歴」から PDF 形式の領収書をダウンロードできます。宛名・但し書きの変更は発行後にはできかねますのでご注意ください。

## 注文・キャンセルについて

**Q. 注文後にキャンセルできますか?**
A. 発送準備に入る前であればキャンセル可能です。マイページ「注文履歴」からキャンセル手続きを行ってください。発送後のキャンセルは返品対応となります。

**Q. 注文内容(数量・配送先)を変更できますか?**
A. 発送準備前であれば、カスタマーサポートへご連絡いただくことで対応できる場合があります。発送後の変更はできかねます。

**Q. 在庫がない商品はいつ入荷しますか?**
A. 入荷時期は商品ページの「入荷お知らせを受け取る」ボタンから登録いただくと、入荷次第メールでご連絡します。具体的な入荷日のお答えは難しい場合があります。

## アカウントについて

**Q. パスワードを忘れました。**
A. ログイン画面の「パスワードをお忘れの方」からメールアドレスを入力してください。パスワードリセット用のメールをお送りします。

**Q. メールアドレスを変更したい。**
A. マイページ「アカウント設定」→「メールアドレス変更」から手続きできます。新しいメールアドレスに確認メールが届きますので、リンクをクリックして変更を完了してください。

**Q. 退会したい。**
A. マイページ「アカウント設定」→「退会手続き」から申請できます。未配送の注文がある場合や、未払いの残高がある場合は退会できません。退会後のデータ復元はできませんのでご注意ください。

## その他

**Q. ギフト包装はできますか?**
A. はい。注文時に「ギフト包装を希望する」を選択してください。ギフトメッセージカードの同封も可能です(無料)。

**Q. 領収書の宛名を会社名にできますか?**
A. はい。注文時または領収書ダウンロード時に宛名を入力してください。

**Q. 問い合わせ方法を教えてください。**
A. カスタマーサポートはチャット(平日10〜18時)またはメール(24時間受付、返答は翌営業日以内)で対応しています。

返品ポリシー(return_policy.pdf)

返品受付条件・手続き・返金までの流れをまとめたPDFドキュメントです。購入から30日以内の返品受付、返品不可商品の条件、交換対応の有無などをリアルに記載しています。

return_policy.pdf の内容イメージ

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-03

Guardrailsの作成

ナレッジドキュメントのソースを用意したので、まずGuardrailsの作成からはじめます。

GuardrailsはAgentの入出力に対してフィルタリングを適用する機能です。今回は以下の5つを設定しました。

設定項目 内容
コンテンツフィルタ 憎悪・侮辱・性的・暴力・不正行為の有害カテゴリとプロンプト攻撃をフィルタリング
拒否トピック 競合ECサイト(Amazon、楽天など)との比較に関する質問をブロック
ワードフィルタ 冒涜的表現のフィルタに加え、競合企業名(Amazon、楽天等)を単語レベルでブロック
機密情報フィルタ(PIIマスキング) メールアドレスや電話番号のマスク、クレジットカード番号のブロック
コンテキストグラウンディングチェック ソース情報に基づかない回答(ハルシネーション)を検出・ブロック
構築手順

ガードレールの基本設定

「Amazon Bedrock」>「ガードレール」>「ガードレールを作成」を選択し、以下の情報を入力します。その他はデフォルトで進めます。

  • 名前: 適宜
  • 説明: 適宜
  • ブロックされたプロンプトのメッセージを表示: 有害コンテンツ、禁止事項として判断された質問に対して回答するべき文章を設定できます。
    • 「申し訳ありませんが、モデルはこの質問に回答できません。」

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-04

コンテンツフィルターの設定

有害カテゴリ別に「テキスト/画像」、「閾値」と「アクション」を設定できます。

  • 憎悪
  • 侮辱
  • 性的
  • 暴力
  • 不正行為

また、デフォルトでテキストベースのプロンプト攻撃のフィルターが有効になっているのでそのまま設定しています。

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-05

拒否されたトピックを追加

あらかじめ予期できる特定の有害な質問やお問い合わせフレーズを設定して、そのトピックが出現したらブロックできる機能です。

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-06

設定画面で「入力」と「出力」のブロックアクションを設定しました。

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-07

今回は架空ECサイトの競合他社についてのトピックをブロックするように、以下の設定を行いました。

  • 名前: competitor-comparison
  • 定義: "Prohibit any comparison with or mention of competing e-commerce sites such as Amazon, Rakuten, Yahoo Shopping, or other online retailers."
  • サンプルフレーズ
    • Is this cheaper than Amazon?
    • Compared to Rakuten
    • Yahoo Shopping is better
    • Should I buy from another site?

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-08

「サンプルフレーズ」を今回は英語で設定しましたが、「コンテンツフィルタ」と「拒否されたトピック」にはTierが設定でき、Tierが「Classic」の場合は日本語はサポートされていないので注意が必要です。

ワードフィルターを追加

続いて、トピックよりもさらに細分化した特定の「単語」や「フレーズ」単位でのフィルタリングも設定可能です。

今回はAWSがあらかじめ用意している「冒涜的な表現フィルター」を「入力」&「出力」に対してブロックを行い、追加でカスタムで以下のECサイトの競合他社に対してのフィルターフレーズを設定しました。

  • Amazon
  • 楽天
  • Rakuten

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-09

機密情報フィルターを追加

さらに機密情報フィルターを使ってPIIの「マスク/ブロック」が設定できます。今回はECサイトを想定して以下の設定にしています。

「ブロック」は機密情報と判断された内容を含む「入力」や「出力」そのものが拒否され、「マスク」は実際の値を{EMAIL}のように置換することが可能です。

PII タイプ Input action Output action
CREDIT_DEBIT_CARD_NUMBER ブロック ブロック
PHONE マスク マスク
EMAIL マスク マスク
NAME マスク マスク

正規表現でもパターンを追加できますが、今回は未設定にしました。
2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-10

コンテキストグラウンディングチェックを追加

モデルの応答がソース情報に基づいているか(グラウンディング)、ユーザーの質問に対して的を射た回答か(関連性)を検証し、ハルシネーションをフィルタリングする機能がコンテキストグラウンディングチェックとして設定可能です。

それぞれ0〜0.99の閾値を設定でき、スコアが閾値を下回った応答はブロックされます。閾値を高くするほどハルシネーション混入のリスクは下がりますが、正常な応答もブロックされやすくなります。

今回は以下の設定にしています。関連性だけデフォルト(0.7)から「0.6」に変更しています。

チェック項目 ステータス 閾値 アクション
グラウンディング 有効 0.7(デフォルト) ブロック
関連性 有効 0.6 ブロック

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-11

作成確認

これにてガードレールの全ての設定が終了しました。
諸事情でリソース名等はマスクしていますが、以下のようにガードレールが作成できました。

作成は完了しましたが、アプリケーションから利用する場合は「バージョンを作成」する必要があることに注意が必要です。今回は本番環境にデプロイしないので、「作業中のドラフト」ステータスのまま保持しておきます。

作成後はガードレールがうまく機能するか「テスト」できる画面が右側にありますが、今回は全リソース作成後に改めて動作確認を行います。

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-12

Knowledge Basesの作成

ガードレールの作成が完了したので、次はナレッジベースを構築していきます。

ナレッジベースはS3に格納したドキュメントをベクトル化し、ユーザーの質問に対してRAG(検索拡張生成)で回答する機能です。今回は上記であらかじめ3種類のドキュメントを用意しています。

  • 商品カタログ(products.csv): 架空の家電・日用品15品目の情報
  • FAQ(faq.md): 配送・支払い・キャンセル等に関するよくある質問
  • 返品ポリシー(return_policy.md): 返品・交換の条件や手続き

ベクトルストアにはAmazon OpenSearch Serverlessを使用しています。

構築手順

基本設定

「Amazon Bedrock」>「ナレッジベース」>「作成」>「ベクトルストアを含むナレッジベース」を選択します。
2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-13

以下の設定を行い、「次へ」

  • ナレッジベース名: 適宜
  • 説明: 適宜
  • IAMロール: 新しいサービスロールを作成して使用
  • データソース: S3

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-14

データソース設定

S3を選択したので、データソース名とその他戦略設定を行います。

  • データソース名: 適宜
  • データソースの場所: このAWSアカウント
  • s3URI: <ナレッジドキュメントを保存したS3バケットのURI>
  • 解析戦略: デフォルトパーサー
  • チャンキング戦略: デフォルトチャンキング(約300トークンごとに分割、文の境界を保持)

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-15

解析戦略はドキュメントの読み取り方式を指定する設定です。デフォルトパーサーのほか、Bedrock Data Automationや基盤モデルを使った高度な解析(画像・表・グラフの抽出等)も選択できます。

チャンキング戦略はドキュメントをベクトルストアに格納する際の分割方式です。固定サイズ・階層型・セマンティック(意味単位)などが選択でき、RAGの検索精度に影響します。

いずれもデータソース作成後は変更できないため、本番運用時は要件に応じた選定が必要ですが、今回は検証目的のためデフォルトのまま設定しました。

データストレージと処理を設定

続いて、ベクトルデータベースの指定と埋め込みモデルを選択します。選択したAIモデルにてドキュメントとして保存されたナレッジがベクトル形式に変換され、ベクトルデータの保存先が選択可能です。

  • 埋め込みモデル: Amazon Titan Text Embeddings V2(オンデマンド推論)
  • 埋め込みタイプ: 浮動小数点ベクトル埋め込み(デフォルト)
  • ベクトルの次元: 1024(デフォルト)

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-16

  • ベクトルストア: 「Amazon OpenSearch Serverless」を新規作成

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-17

以下のように設定できたら「次へ」を選択

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-18

作成確認

その他 Lambda関数を通したアクション等も設定可能ですが、一旦デフォルト設定で作成します。

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-19

作成されると「OpenSearch」ダッシュボードも作成されていました。

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-20

データソースの同期

ナレッジベースを作成しただけではS3上のドキュメントはまだベクトル化されていません。データソースの「同期」を実行することで、ドキュメントの解析・チャンキング・ベクトル変換が行われ、OpenSearch Serverlessに格納されます。

データソースを選択し「同期」を実行します。

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-21

同期が完了すると、コンソール上部に通知され「最終同期時刻」に時間が入ります。ドキュメントを追加・更新した場合は再度同期が必要です。

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-22

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-23

これにてナレッジベースの作成 & データソースの同期まで完了しました。テストは最後に一括で行います。

Agent アクション用Lambda関数の作成

Amazon Bedrock Agentでは、お客様からの質問回答に加えて、注文照会やキャンセル等の実際の処理を代行して行ってくれるようにアクショングループを作成できます。そのためのLambda関数を用意しました。

構築手順

Lambda関数の作成

  • 関数名: 適宜
  • ランタイム: python3.14
  • アーキテクチャ: x86_64

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-24

生成AIで以下のコードを作成しました。処理の流れは以下の通りです。

  1. Bedrock Agentから渡されるイベントのapiPathで呼び出すAPIを判別(/get-order or /cancel-order
  2. parametersまたはrequestBodyから注文番号(order_id)を抽出
  3. モック注文データ(3件)に対して照会またはキャンセル処理を実行
  4. Bedrock Agentが解釈できる所定のレスポンス形式で結果を返却

今回は検証目的のため、注文データはLambda内にハードコードしたモックデータを使用しています。

import json
import random
from datetime import datetime, timedelta

# Mock order data
MOCK_ORDERS = {
    "CM-2026-000001": {
        "order_id": "CM-2026-000001",
        "status": "配送中",
        "product": "{架空の企業名} スマートスピーカー Pro",
        "quantity": 1,
        "price": 12800,
        "order_date": "2026-04-05",
        "estimated_delivery": "2026-04-08",
        "tracking_number": "1234-5678-9012",
        "cancellable": False,
    },
    "CM-2026-000002": {
        "order_id": "CM-2026-000002",
        "status": "処理中",
        "product": "{架空の企業名} ワイヤレスイヤホン Z1",
        "quantity": 2,
        "price": 19600,
        "order_date": "2026-04-07",
        "estimated_delivery": "2026-04-10",
        "tracking_number": None,
        "cancellable": True,
    },
    "CM-2026-000003": {
        "order_id": "CM-2026-000003",
        "status": "配達完了",
        "product": "{架空の企業名} 4Kウェブカメラ Ultra",
        "quantity": 1,
        "price": 15800,
        "order_date": "2026-04-01",
        "estimated_delivery": "2026-04-04",
        "tracking_number": "9876-5432-1098",
        "cancellable": False,
    },
}


def get_order(order_id: str) -> dict:
    """注文状況を照会する"""
    order = MOCK_ORDERS.get(order_id)
    if not order:
        return {
            "success": False,
            "message": f"注文番号 {order_id} が見つかりません。正しい注文番号をご確認ください。",
        }
    return {
        "success": True,
        "order": order,
        "message": f"注文番号 {order_id} の状況をお伝えします。",
    }


def cancel_order(order_id: str) -> dict:
    """注文をキャンセルする"""
    order = MOCK_ORDERS.get(order_id)
    if not order:
        return {
            "success": False,
            "message": f"注文番号 {order_id} が見つかりません。",
        }
    if not order["cancellable"]:
        return {
            "success": False,
            "message": f"注文番号 {order_id} はすでに{order['status']}のためキャンセルできません。返品をご希望の場合はお問い合わせください。",
        }
    # Mock cancellation
    MOCK_ORDERS[order_id]["status"] = "キャンセル済み"
    MOCK_ORDERS[order_id]["cancellable"] = False
    return {
        "success": True,
        "order_id": order_id,
        "message": f"注文番号 {order_id} をキャンセルしました。返金は3〜5営業日以内に処理されます。",
    }


def build_response(action_group: str, api_path: str, http_method: str, body: dict) -> dict:
    """Bedrock Agent用のレスポンスを構築する"""
    return {
        "messageVersion": "1.0",
        "response": {
            "actionGroup": action_group,
            "apiPath": api_path,
            "httpMethod": http_method,
            "httpStatusCode": 200,
            "responseBody": {
                "application/json": {
                    "body": json.dumps(body, ensure_ascii=False)
                }
            },
        },
    }


def lambda_handler(event, context):
    action_group = event.get("actionGroup", "")
    api_path = event.get("apiPath", "")
    http_method = event.get("httpMethod", "GET")
    parameters = event.get("parameters", [])
    request_body = event.get("requestBody", {})

    # パラメータをdictに変換
    params = {p["name"]: p["value"] for p in parameters}

    # リクエストボディからパラメータ取得(POSTの場合)
    if request_body:
        content = request_body.get("content", {})
        json_body = content.get("application/json", {})
        properties = json_body.get("properties", [])
        for prop in properties:
            params[prop["name"]] = prop["value"]

    if api_path == "/get-order":
        order_id = params.get("order_id", "")
        result = get_order(order_id)

    elif api_path == "/cancel-order":
        order_id = params.get("order_id", "")
        result = cancel_order(order_id)

    else:
        result = {"success": False, "message": f"不明なAPIパス: {api_path}"}

    return build_response(action_group, api_path, http_method, result)

リソースベースのポリシーステートメントを追加

Bedrock AgentがこのLambda関数を直接invokeするためには、Lambda側でBedrock サービスプリンシパル(bedrock.amazonaws.com)からの呼び出しを許可するリソースベースポリシーを追加する必要があります。

この設定がないと、Agent作成後にAction Groupからの呼び出し時に権限エラーになります。

Lambda関数の「設定」>「アクセス権限」>「リソースベースのポリシーステートメント」から「アクセス権限を追加」を選択し、以下のように設定します。

  • AWSのサービス
  • サービス: Other(Bedrockは候補に出てきませんでした)
  • ステートメントID: 適宜
  • プリンシパル: bedrock.amazonaws.com
  • ソースのURL: <作成予定のBedrock Agent名を含むARN>
  • アクション: lambdaInvokeFunction

このステートメントはAgent作成前に作成していますが、あらかじめAgent名は決めており、ステートメント内で合わせています。

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-25

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-26

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-27

関数の実行確認

最後にあらかじめ、関数単体で正常に動作するか確認しました。

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-28

Bedrock Agent の作成

これまでの作業で、ガードレール、ナレッジベース、アクション用Lambda関数の作成が完了しているのでそれらを組み合わせて実際のECサイトカスタマーサポート用エージェントを作成していきます。

OpenAPIスキーマでAPI定義を記述し、AgentがLambdaを直接invokeする構成です。

構築手順

エージェントの作成

「エージェント」>「エージェントを作成」を選択します。
2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-29

以下のように設定し、一度「作成」を選択し、エージェントビルダーの画面に遷移します。

  • 名前: 適宜
  • 説明: 適宜
  • マルチエージェントコラボレーション: 無効

マルチエージェントコラボレーションは、複数のAgentが連携して1つのタスクを処理する機能です。例えば「注文処理Agent」と「返品処理Agent」を分けて、親Agentがオーケストレーションするといった構成が可能です。今回は単一Agentで完結するため無効にしています。

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-30

エージェントビルダーの画面から続きの設定を行います。

  • エージェントリソースロール: 新しいサービスロールを作成して使用
  • モデル: Claude 3.5 Sonnet v1
  • エージェント向けの指示: Agentがユーザーの問い合わせに応答する際の振る舞いを自然言語で指示するプロンプトです。回答のトーン、対応範囲、制約事項などを記述します。今回は以下のように設定しました。
    • 「お客様の注文確認・キャンセル・商品に関する質問に丁寧に対応してください。注文情報の照会やキャンセルには必ず注文番号を確認してください。回答は日本語で行ってください。」

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-31

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-32

その他の設定は全てデフォルトを指定しています。

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-33

これら設定が終了すると一度「作成」を押してエージェントを作成し、その後追加の設定を行います。

ナレッジベースの追加

まず作成したエージェントにナレッジベースを紐付けます。

エージェントビルダーの画面にて「ナレッジベース」>「Add」を選択します。
2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-34

上記手順で作成したナレッジベースを選択します。特に指示は記載しませんでした。
2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-35

アクショングループの追加

続いてエージェントビルダーの画面に戻り、「アクショングループ」>「追加」を選択します。
2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-36

以下の設定を行って、先ほど作成したLambda関数を紐付けます。

  • アクショングループ名: 適宜
  • 説明: 適宜
  • アクショングループタイプ: APIスキーマで定義
  • Lambda関数の定義方法: 既存のLambda関数を選択
    • 先ほど作成したLambda関数を選択
  • アクショングループスキーマ: インラインスキーマエディタで定義

アクショングループタイプには「APIスキーマで定義」と「関数の詳細で定義」の2つがあります。「APIスキーマで定義」を選択すると、OpenAPI 3.0形式のスキーマでAPIのエンドポイント・パラメータ・レスポンスを記述します。Agentはこのスキーマを読み取り、ユーザーの発言からどのAPIを呼ぶべきか、どのパラメータを抽出すべきかを自動的に判断します。

スキーマはS3にアップロードする方法とインラインエディタで直接記述する方法があります。今回はインラインエディタで以下の内容を設定しました。

今回のスキーマではLambda関数の内容に沿って2つのAPIを定義しています。

API メソッド パラメータ 説明
/get-order GET order_id(query) 注文番号で注文状況を照会
/cancel-order POST order_id(requestBody) 注文をキャンセル

Agentはsummarydescriptionの内容も参照してAPIの用途を理解するため、日本語で具体的に記述しておくことがポイントです。

アクショングループスキーマ
{
  "openapi": "3.0.0",
  "info": {
    "title": "{架空の企業名} Order Management API",
    "description": "API for managing {架空の企業名} customer orders",
    "version": "1.0.0"
  },
  "paths": {
    "/get-order": {
      "get": {
        "summary": "注文状況の照会",
        "description": "注文番号を指定して注文の現在のステータス・配送状況・商品情報を取得する",
        "operationId": "getOrder",
        "parameters": [
          {
            "name": "order_id",
            "in": "query",
            "description": "照会する注文番号(例: CM-2026-000001)",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "注文情報",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": { "type": "boolean" },
                    "message": { "type": "string" },
                    "order": {
                      "type": "object",
                      "properties": {
                        "order_id": { "type": "string" },
                        "status": { "type": "string" },
                        "product": { "type": "string" },
                        "quantity": { "type": "integer" },
                        "price": { "type": "integer" },
                        "order_date": { "type": "string" },
                        "estimated_delivery": { "type": "string" },
                        "tracking_number": { "type": "string" }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/cancel-order": {
      "post": {
        "summary": "注文のキャンセル",
        "description": "注文番号を指定して注文をキャンセルする。配送中・配達完了の注文はキャンセル不可",
        "operationId": "cancelOrder",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": ["order_id"],
                "properties": {
                  "order_id": {
                    "type": "string",
                    "description": "キャンセルする注文番号(例: CM-2026-000002)"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "キャンセル結果",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "success": { "type": "boolean" },
                    "message": { "type": "string" },
                    "order_id": { "type": "string" }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-37

これにてアクショングループの追加完了です。

ガードレールの追加

最後にガードレールを追加します。
エージェントビルダーの画面から「ガードレールの詳細」>「編集」を選択します。

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-38

冒頭で作成したガードレールを選択して「保存」するだけで完了です。
2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-39

作成確認

長かったですが、エージェントの作成と付随する機能の紐付けが以下のように完了しました。

  • アクショングループ
  • ナレッジベース
  • ガードレール

さらに以下のオプションも編集可能です。今回はデフォルトのまま進めています。

  • メモリ: セッションをまたいでユーザーとの会話履歴を保持する機能です。有効にすると過去の会話コンテキストを踏まえた応答が可能になります。
  • オーケストレーション戦略: Agentが思考・計画・実行を行う際の推論方式です。デフォルトは「ReAct」(推論と行動を交互に繰り返す方式)で、カスタムオーケストレーション(Lambda)も選択可能です。

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-40

上記の設定確認ができたら作成して、ステータスが「PREPARED」になったら完了です

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-41

全体動作確認

全てのリソース構築が完了したので、エージェントビルダー右側の「テスト」パネルから動作確認を行います。

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-42

Knowledge Bases(RAG)のテスト

商品に関する質問を投げ、ナレッジベースから正しく情報を引いて回答できるか確認しました。S3にアップロードしたドキュメントの内容に基づいた回答が返ってきており、RAGが正常に機能していました。

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-43

Guardrails(拒否トピック)のテスト

「Amazonと比べてどっちが安い?」と競合比較の質問を投げたところ、Guardrailsが機能し「申し訳ありませんが、モデルはこの質問に回答できません。」とブロックメッセージが返されました。設定した拒否トピック(competitor-comparison)等が正しく検出されています。

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-44

Action Groups(注文キャンセル)のテスト

「注文番号CM-2026-000002をキャンセルしたい」と投げたところ、AgentがLambda関数を呼び出してキャンセル処理を実行し、結果を自然言語で返してくれました。注文のステータスや返金の案内まで含めた回答が確認できます。

2026-04-15-amazon-bedrock-agents-kb-guardrails-ec-ai-assistant-45

最後に

今回は架空のECサイトを題材に、Guardrails・Knowledge Bases・Agents(Action Groups)の3機能を組み合わせたBedrock Agentをコンソールから構築し、ドキュメント検索・注文処理・入出力フィルタリングが一つのAgentで動作することを確認しました。

コードを書いたのはLambda関数とOpenAPIスキーマのみで、オーケストレーション部分はBedrock側が担ってくれるため、想像以上に少ない実装量で統合的なAgentを構築できた印象です。一方で、GuardrailsのTierによる言語サポートの違いなど、事前に把握しておくべきポイントもいくつかありました。

各機能の細かな設定や挙動は実際に触ってみないと掴みにくい部分も多いので、Bedrockで生成AIアプリケーションを検討されている方のイメージとして参考になれば幸いです。今回は以上です。

この記事をシェアする

関連記事