Amazon Connect Customer AIエージェントの手動検索からフローモジュールを呼び出し、Lambda で予約情報を検索してみた
はじめに
Amazon Connect Customer AIエージェントでは、オペレーターがエージェントワークスペースから自然言語で問い合わせ、顧客対応に必要な情報を確認できます。
今回は、オペレーターが顧客から聞き取った名前と電話番号を入力し、予約情報を確認する構成を試しました。
予約情報は、AI エージェントのフローモジュールツールから Lambda 関数を呼び出して取得します。Lambda 関数が返した予約日、予約時刻、人数などを、AI エージェントからオペレーターへ回答させます。
今回確認した内容は以下です。
- オペレーターがエージェントワークスペースから手動で予約確認を依頼する
- AI エージェントが名前と電話番号をオペレーターに確認する
- フローモジュールツールから Lambda 関数を呼び出す
- Lambda 関数の戻り値をフローモジュールの出力として返す
- ツールの指示テキストと応答例を設定し、予約内容を回答に含める
- AI エージェントとログインユーザーの双方に、フローモジュールへのアクセスを設定する
本記事でいう手動検索は、オペレーターがエージェントワークスペースの Connect アシスタントから AI エージェントへ直接問い合わせる操作を指します。
AI エージェントタイプには、フローモジュールツールを利用できる ORCHESTRATION を指定しています。ORCHESTRATION タイプは、複数ターンのやり取りと、事前に設定したツールの呼び出しに対応しています。
前提
今回は以下を前提とします。
- Amazon Connect Customer インスタンスを作成済み
- Amazon Connect Customer AIエージェントを利用可能
- 検証リージョンは
ap-northeast-1 - Lambda 関数を Amazon Connect Customer インスタンスに追加済み
- AI エージェント、フローモジュール、セキュリティプロファイルの基本的な作成手順は理解している
記事中のリソース名や予約情報は検証用の値です。実際に利用する場合は、自身の環境に合わせて置き換えてください。
構成と処理の流れ
今回の処理の流れは以下です。
顧客から予約確認の依頼を受ける
↓
オペレーターが Connect アシスタントに予約確認を依頼する
↓
AI エージェントが名前と電話番号を確認する
↓
Reservation_Confirmation ツールを呼び出す
↓
AgentAssistanceOrchestrator_ConfirmReservation-module を実行する
↓
Lambda 関数で名前と電話番号に一致する予約情報を検索する
↓
検索結果を json_result として返す
↓
AI エージェントが予約情報をオペレーターに回答する
AI エージェントと直接やり取りするのは顧客ではなく、エージェントワークスペースにログインしているオペレーターです。
オペレーターは顧客との通話で名前と電話番号を聞き取り、その情報を Connect アシスタントに入力します。
問い合わせフロー
今回使用した問い合わせフローです。

音声とチャットで記録と分析を設定し、Connect アシスタントを有効にしてキューへ転送する問い合わせフロー
問い合わせフローでは、主に以下を行っています。
- フローログを有効にする
- テキスト読み上げに使用する音声を設定する
CHATとVOICEで分岐する- チャネルに応じて記録と分析の動作を設定する
- Connect アシスタントブロックを設定する
- キューを設定して転送する
Connect アシスタントブロックには、AI エージェントとの関連付けを管理するアシスタントを指定しています。
この記事では問い合わせフロー全体ではなく、予約確認用の Lambda 関数、フローモジュール、AI エージェントの設定に絞って説明します。
Lambda 関数を作成する
最初に、予約情報を検索する Lambda 関数を作成します。
今回は、Lambda 関数内に疑似的な予約データを保持し、名前と電話番号の両方が一致するレコードを返すモック関数にしました。
import json
import logging
logger = logging.getLogger()
logger.setLevel(logging.INFO)
MOCK_DATABASE = [
{
"phone_number": "09012345678",
"customer_name": "山田太郎",
"reservation_id": "RES-1001",
"date": "2026-03-15",
"time": "14:00",
"number_of_people": 4,
"status": "Confirmed"
},
{
"phone_number": "08098765432",
"customer_name": "鈴木花子",
"reservation_id": "RES-1002",
"date": "2026-03-16",
"time": "10:30",
"number_of_people": 2,
"status": "Pending"
}
]
def normalize(text):
if not text:
return ""
return (
str(text)
.replace(" ", "")
.replace(" ", "")
.replace("-", "")
)
def lambda_handler(event, context):
logger.info(
"Received event: %s",
json.dumps(event, ensure_ascii=False)
)
params = event.get("Details", {}).get("Parameters", {})
input_phone = (
params.get("phone_number")
or event.get("phone_number")
)
input_name = (
params.get("customer_name")
or event.get("customer_name")
)
logger.info(
"Input(Raw): Name=%s, Phone=%s",
input_name,
input_phone
)
found_reservation = None
if input_phone and input_name:
target_phone = normalize(input_phone)
target_name = normalize(input_name)
logger.info(
"Input(Normalized): Name=%s, Phone=%s",
target_name,
target_phone
)
for record in MOCK_DATABASE:
if (
record["phone_number"] == target_phone
and record["customer_name"] == target_name
):
found_reservation = record
break
if found_reservation:
logger.info(
"Reservation found: %s",
found_reservation["reservation_id"]
)
return {
"json_result": json.dumps(
found_reservation,
ensure_ascii=False
)
}
logger.info("Reservation not found.")
not_found_data = {
"status": "NotFound",
"message": "予約が見つかりませんでした。"
}
return {
"json_result": json.dumps(
not_found_data,
ensure_ascii=False
)
}
主な処理は以下です。
event.Details.Parametersからphone_numberとcustomer_nameを取得する- 半角スペース、全角スペース、ハイフンを除去して入力値を正規化する
- 名前と電話番号の両方が一致する予約を検索する
- 検索結果を JSON 文字列へ変換し、
json_resultに格納して返す - 予約が見つからなかった場合は、
NotFoundを示す JSON 文字列を返す
Amazon Connect Customer の AWS Lambda 関数ブロックから追加した入力パラメータは、Lambda 関数の event.Details.Parameters から取得できます。
入力値を正規化する
電話番号は、以下のように入力される可能性があります。
09012345678
090-1234-5678
090 1234 5678
また、名前にも半角スペースや全角スペースが含まれる可能性があります。
そのため、normalize では以下を除去してから比較しています。
- 半角スペース
- 全角スペース
- ハイフン
今回確認した Lambda 関数のログでは、フローモジュールから渡された名前が正しい日本語で記録されていました。
Input(Raw): Name=山田太郎, Phone=09012345678
Input(Normalized): Name=山田太郎, Phone=09012345678
Reservation found: RES-1001
Lambda 関数が受け取った時点で文字化けしておらず、疑似データ内の 山田太郎 と一致しています。そのため、文字コードを変換する処理は追加していません。
予約が見つかった場合の json_result
山田太郎さんの予約が見つかった場合、Lambda 関数は以下のような値を返します。
{
"json_result": "{\"phone_number\": \"09012345678\", \"customer_name\": \"山田太郎\", \"reservation_id\": \"RES-1001\", \"date\": \"2026-03-15\", \"time\": \"14:00\", \"number_of_people\": 4, \"status\": \"Confirmed\"}"
}
外側のオブジェクトにある json_result の型は文字列です。
json_result に格納されている文字列を JSON として整形すると、以下の内容になります。
{
"phone_number": "09012345678",
"customer_name": "山田太郎",
"reservation_id": "RES-1001",
"date": "2026-03-15",
"time": "14:00",
"number_of_people": 4,
"status": "Confirmed"
}
外側の JSON では、json_result の値に含まれるダブルクォートが \" と表示されます。
予約が見つからなかった場合の json_result
予約が見つからなかった場合は、以下の値を返します。
{
"json_result": "{\"status\": \"NotFound\", \"message\": \"予約が見つかりませんでした。\"}"
}
json_result に格納されている内容は以下です。
{
"status": "NotFound",
"message": "予約が見つかりませんでした。"
}
予約が見つからなかったこと自体は、Lambda 関数の実行エラーにはしていません。
正常なレスポンスとして NotFound を返すことで、AI エージェントがツールの実行結果を確認し、予約が見つからなかった旨をオペレーターへ回答できます。
JSON 文字列で返す理由
今回、フローモジュールの AWS Lambda 関数ブロックでは、レスポンスの検証に STRING_MAP を指定しています。
STRING_MAP を指定した場合、Lambda 関数のレスポンスは、文字列型のキーバリューペアで構成されたフラットなオブジェクトにする必要があります。JSON を指定した場合は、入れ子を含む有効な JSON を返せます。
今回は予約情報を1つの文字列値として扱うため、予約情報全体を json.dumps で JSON 文字列へ変換し、json_result に格納しました。
今回の検証では、この形式で返した予約情報をフローモジュールの出力として扱い、AI エージェントから回答できました。
フローモジュールを作成する
次に、AI エージェントから呼び出すフローモジュールを作成します。
今回作成したフローモジュールは以下です。
AgentAssistanceOrchestrator_ConfirmReservation-module
フローモジュールは、フロー外から独立して呼び出せるツールとして作成できます。また、ツール用のフローモジュールでは AWS Lambda 関数ブロックを利用できます。
入出力スキーマ
今回の入力スキーマと出力スキーマは以下です。
{
"input": {
"schema": {
"type": "object",
"properties": {
"phone_number": {
"type": "string"
},
"customer_name": {
"type": "string"
}
},
"required": [
"phone_number",
"customer_name"
]
}
},
"resultData": {
"schema": {
"type": "object",
"properties": {
"json_result": {
"type": "string"
}
},
"required": [
"json_result"
]
}
}
}
入力と出力の用途は以下です。
| 種類 | プロパティ | 用途 |
|---|---|---|
| 入力 | phone_number |
顧客から聞き取った電話番号 |
| 入力 | customer_name |
顧客から聞き取った名前 |
| 出力 | json_result |
Lambda 関数が返した予約情報の JSON 文字列 |
これらの入力スキーマと出力スキーマは、後述する AI エージェントのツールでも引数と出力として表示されます。
Lambda 関数にモジュール入力を渡す
AWS Lambda 関数ブロックでは、フローモジュールの入力を Lambda 関数へ渡します。
設定内容は以下です。
| 宛先キー | 名前空間 | キー | パラメータ |
|---|---|---|---|
phone_number |
モジュール | 入力 | phone_number |
customer_name |
モジュール | 入力 | customer_name |

フローモジュールの phone_number と customer_name を Lambda 関数の入力パラメータに設定する画面
JSONPath では、以下の値に対応します。
$.Modules.Input.phone_number
$.Modules.Input.customer_name
AWS Lambda 関数ブロックは同期実行とし、レスポンスの検証には STRING_MAP を指定しました。
この設定により、Lambda 関数のイベントには以下のような入力が含まれます。
{
"Details": {
"Parameters": {
"phone_number": "09012345678",
"customer_name": "山田太郎"
}
}
}
Lambda 関数の戻り値をモジュール出力に設定する
Lambda 関数の戻り値は、AWS Lambda 関数ブロックより後のブロックから $.External 名前空間で参照できます。
戻るブロックでは、Lambda 関数が返した json_result を、フローモジュールの出力に設定しました。
モジュール出力:json_result
設定値:$.External.json_result

Lambda 関数が返した json_result をフローモジュールの出力に設定する画面
たとえば、Lambda 関数が以下の値を返したとします。
{
"json_result": "{\"customer_name\":\"山田太郎\",\"date\":\"2026-03-15\",\"time\":\"14:00\",\"number_of_people\":4}"
}
この場合、$.External.json_result から参照できる文字列は以下です。
{"customer_name":"山田太郎","date":"2026-03-15","time":"14:00","number_of_people":4}
戻るブロックでは、この文字列をフローモジュールの json_result として返します。
予約が見つからなかった場合も Lambda 関数は正常終了するため、NotFound を含む json_result が同じ経路で返されます。
Lambda 関数の呼び出し失敗やタイムアウトは、予約が見つからない場合とは異なり、AWS Lambda 関数ブロックのエラーとして扱われます。
フローモジュールのバージョンを作成する
フローモジュールの設定後、AI エージェントのツールから指定するバージョンを作成します。
今回の検証では、以下のバージョンを使用しました。
Version 3
フローモジュールを更新した場合は、ツールが参照しているバージョンも確認してください。
AI エージェントを設定する
今回作成した AI エージェントは以下です。
AgentAssistanceOrchestrator_ConfirmReservation
AI エージェントタイプには ORCHESTRATION を指定しました。
オペレーターは Connect アシスタントから手動で予約確認を依頼します。AI エージェントは必要な名前と電話番号をオペレーターに確認した後、フローモジュールツールを呼び出します。

ORCHESTRATION タイプの AI エージェントに Reservation_Confirmation ツールを追加した画面
今回の主な設定は以下です。
| 項目 | 設定値 |
|---|---|
| 名前 | AgentAssistanceOrchestrator_ConfirmReservation |
| エージェントタイプ | ORCHESTRATION |
| ロケール | Japanese |
| セキュリティプロファイル | AI Agent |
| ツール | Reservation_Confirmation |
| プロンプト | AgentAssistanceOrchestration |
今回は、デフォルトの AgentAssistanceOrchestration プロンプトをそのまま利用し、独自の AI プロンプトは作成していません。
フローモジュールツールを追加する
AI エージェントに、以下のツールを追加しました。
Reservation_Confirmation
ツールでは、先ほど作成したフローモジュールとバージョンを指定します。
名前空間:
Flow Modules
AI ツール:
AgentAssistanceOrchestrator_ConfirmReservation-module
バージョン:
Version 3

フローモジュールとバージョンを指定した Reservation_Confirmation ツールの編集画面
画面上では、フローモジュールで定義した入力スキーマと出力スキーマを確認できます。
フローモジュールとツールの対応関係は以下です。
| フローモジュール | AI エージェントのツール |
|---|---|
入力スキーマの phone_number |
ツール引数の phone_number |
入力スキーマの customer_name |
ツール引数の customer_name |
出力スキーマの json_result |
ツール出力の json_result |
指示テキスト
ツールの指示テキストは以下にしました。
顧客の名前と電話番号から予約情報を検索します。
実行結果として返される「日付(date)」「時間(time)」「人数(number_of_people)」を必ず伝えてください。
ツールの用途に加えて、実行結果から回答に含める項目を指定しています。
応答例
ツールには、予約が見つかった場合と見つからなかった場合の応答例を設定しました。
予約が見つかった場合の良い例は以下です。
<message>
山田太郎様ですね、確認いたしました。
2026年3月15日の14時から、4名様でご予約を承っております。
</message>
予約が見つからなかった場合の良い例は以下です。
<message>
申し訳ございません。いただいたお名前とお電話番号では、ご予約情報が見つかりませんでした。
恐れ入りますが、情報にお間違いがないかもう一度ご確認いただけますでしょうか?
</message>
検索結果の具体的な内容を含めない応答は、悪い例として設定しました。
<message>
ご予約を確認いたしました。完了しました。他にお手伝いできることはありますか?
</message>
今回の検証では、指示テキストで日付、時間、人数を回答に含めるよう指定し、応答例で期待する回答形式を示しました。
設定後の応答では、指定した項目が予約確認結果に含まれることを確認できました。
セキュリティプロファイルを設定する
フローモジュールツールを利用するには、AI エージェントに割り当てるセキュリティプロファイルで、対象のフローモジュールへのアクセスを設定します。
今回の検証では、AI エージェント用のセキュリティプロファイルで、以下のフローモジュールを選択しました。
AgentAssistanceOrchestrator_ConfirmReservation-module

AI エージェント用のセキュリティプロファイルで予約確認用フローモジュールへのアクセスを選択した画面
エージェント支援でツールを利用する場合、ログインユーザーのセキュリティプロファイルにも、AI エージェントが利用するツールと同じ権限が必要です。
ツールの呼び出しは、AI エージェントとログインユーザーの権限を組み合わせて認可されます。ログインユーザー側の権限が不足している場合、AI エージェントに権限があってもツールの呼び出しは失敗します。
そのため、ログインユーザーに割り当てているセキュリティプロファイルでも、同じフローモジュールへのアクセスを設定しました。

ログインユーザーのセキュリティプロファイルで予約確認用フローモジュールへのアクセスを設定した画面
今回の検証では、AI エージェント側だけにフローモジュールへのアクセスを設定した状態では、ツールを正常に実行できませんでした。
ログインユーザー側にも同じフローモジュールへのアクセスを設定した後、ツールの実行に成功しました。
動作確認
設定後、音声問い合わせを受けているオペレーターが、エージェントワークスペースの Connect アシスタントから予約確認を行いました。
オペレーターが顧客との会話で聞き取った情報を、Connect アシスタントへ入力します。
やり取りは以下のとおりです。
[オペレーター]
予約の確認をしたい
[AI エージェント]
承知いたしました。ご予約の確認をさせていただきます。
お客様のお名前とお電話番号をお伺いできますでしょうか。
[オペレーター]
山田太郎です。09012345678です。
[AI エージェント]
山田太郎様、お電話番号09012345678でご予約を確認いたします。
少々お待ちください。
オペレーターが最初から名前と電話番号をすべて入力するのではなく、AI エージェントが予約確認に必要な項目を追加で確認しています。
ツールの呼び出し内容
AI エージェントのトレースでは、Reservation_Confirmation ツールが以下の引数で呼び出されていました。
{
"type": "tool_use",
"name": "Reservation_Confirmation",
"arguments": {
"customer_name": "山田太郎",
"phone_number": "09012345678"
}
}
customer_name と phone_number は、フローモジュールの入力スキーマで定義したプロパティ名と一致しています。
Lambda 関数のログ
Lambda 関数のログでは、以下の内容を確認できました。
Received event:
"Parameters": {
"phone_number": "09012345678",
"customer_name": "山田太郎"
}
Input(Raw): Name=山田太郎, Phone=09012345678
Input(Normalized): Name=山田太郎, Phone=09012345678
Reservation found: RES-1001
フローモジュールから渡された名前と電話番号を Lambda 関数が取得し、疑似データ内の予約と照合できています。
ツールの戻り値
ツールの戻り値は以下です。読みやすいように整形しています。
{
"json_result": "{\"phone_number\": \"09012345678\", \"customer_name\": \"山田太郎\", \"reservation_id\": \"RES-1001\", \"date\": \"2026-03-15\", \"time\": \"14:00\", \"number_of_people\": 4, \"status\": \"Confirmed\"}"
}
Lambda 関数で JSON 文字列へ変換した予約情報が、フローモジュールの json_result を経由して AI エージェントへ返されています。
AI エージェントの回答
AI エージェントの最終的な回答は以下でした。
[AI エージェント]
山田太郎様、ご予約を確認いたしました。
2026年3月15日の14時から4名様でご予約を承っております。
ご予約番号はRES-1001でございます。
他にご不明な点はございますでしょうか。

ログインユーザーの権限とフローモジュールの設定を修正した後、ツールの実行に成功した画面
ツールの指示テキストで指定した以下の項目が、AI エージェントの回答に含まれています。
- 日付:2026年3月15日
- 時間:14時
- 人数:4名
また、必須項目として指定していなかった予約番号も、json_result に含まれる値をもとに回答へ追加されました。
今回の検証では、オペレーターが Connect アシスタントから予約確認を依頼し、AI エージェントが必要な名前と電話番号を確認した後、フローモジュールツールを呼び出して予約情報を回答できました。
まとめ
Amazon Connect Customer AIエージェントのエージェント支援で、オペレーターが手動検索し、フローモジュール経由で Lambda 関数の予約情報を取得する構成を試しました。
今回のポイントは以下です。
- フローモジュールの入出力スキーマが、AI エージェントツールの引数と出力として扱われた
- Lambda 関数から予約情報を JSON 文字列に変換し、
json_resultとして返すことで AI エージェントから回答できた - エージェント支援でツールを実行するには、AI エージェントとログインユーザーの双方にフローモジュールへのアクセスが必要だった
フローモジュールツールを利用する場合は、Lambda 関数やフローモジュールの設定だけでなく、ツールの指示テキスト、応答例、双方のセキュリティプロファイルもあわせて確認するのがよさそうです。







