如何从API网关触发的Lambda函数中调用LexV2?
在API网关触发的Lambda中调用LexV2实现自定义平台集成
核心流程
API网关接收自定义平台的用户消息 → 触发Lambda函数 → Lambda调用LexV2 API处理对话 → 将Lex的响应返回给自定义平台。
1. 配置Lambda的IAM权限
给Lambda添加LexV2调用权限,示例IAM策略如下(替换占位符为你的实际资源信息):
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "lex:RecognizeText", "lex:StartConversation" ], "Resource": "arn:aws:lex:<你的AWS区域>:<AWS账号ID>:bot/<BotID>/bot-alias/<BotAliasID>" } ] }
2. Lambda函数代码实现(Python示例)
以下代码处理API网关的JSON请求,调用LexV2并返回响应:
import boto3 import json # 初始化LexV2运行时客户端 lex_client = boto3.client('lexv2-runtime') def lambda_handler(event, context): # 解析API网关传入的用户请求 request_body = json.loads(event['body']) user_id = request_body['user_id'] # 用用户唯一ID维持会话上下文 user_message = request_body['message'] try: # 调用LexV2的文本识别API lex_response = lex_client.recognize_text( botId='<你的Bot ID>', botAliasId='<你的Bot Alias ID>', localeId='<区域ID,如zh_CN>', sessionId=user_id, text=user_message ) # 提取Lex返回的第一条回复消息 reply_content = lex_response['messages'][0]['content'] # 返回格式化响应给API网关 return { 'statusCode': 200, 'headers': {'Content-Type': 'application/json'}, 'body': json.dumps({'reply': reply_content}) } except Exception as e: return { 'statusCode': 500, 'body': json.dumps({'error': str(e)}) }
3. API网关配置要点
- 创建POST方法,集成目标选择你的Lambda函数。
- 配置请求映射模板(如需),确保JSON请求能正确传递到Lambda。
- 若自定义平台是前端应用,开启CORS支持。
4. 自定义平台对接示例
自定义平台只需向API网关端点发送POST请求,示例curl命令:
curl -X POST https://<你的API网关ID>.execute-api.<AWS区域>.amazonaws.com/prod/lex-proxy \ -H "Content-Type: application/json" \ -d '{"user_id": "user_001", "message": "我想查询我的订单"}'
关键注意事项
- 会话维持:用用户唯一ID作为
sessionId,Lex会自动保留多轮对话的上下文状态。 - 错误处理:捕获Lex调用异常(如Bot不存在、会话超时),返回友好提示给自定义平台。
- 语音支持:若需处理语音消息,改用
recognize_utteranceAPI,传递音频二进制数据。
内容的提问来源于stack exchange,提问作者Karim Fayed
相关产品推荐
相关产品推荐

