我们有一个AWS Lambda函数,它会调用OpenAI API来根据transcript
生成page_content
,用于Page
。一旦收到响应,DynamoDB表中相应的Page
元素就会被更新。
import boto3import jsonimport openai def lambda_handler(event, context): dynamodb = boto3.client('dynamodb') openai.api_key = "XXXXX" d = json.loads(event['body']) pageId = d['page_id'] transcript = d['transcript'] conversation = [ {"role": "system", "content": "Assistant"}, {"role": "user", "content": transcript}, {"role": "system", "content":"Provide a blog post for the content above."} ] response = openai.ChatCompletion.create( model="gpt-3.5-turbo", messages=conversation, temperature=1, max_tokens=2000, top_p=1, frequency_penalty=0, presence_penalty=0 ) page_content = response['choices'][0]['message']['content'] state = "COMPLETE" response = dynamodb.update_item( TableName='Pagedb-XXXXXX-dev', Key={'id': {'S': pageId}}, UpdateExpression='SET content = :val1, contentState = :val2', ExpressionAttributeValues={ ':val1': {'S': page_content}, ':val2': {'S': state} }, ) return { 'statusCode': 200, 'headers': { 'Content-Type': 'application/json', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Headers': 'Content-Type', 'Access-Control-Allow-Origin': '*', 'Access-Control-Allow-Methods': 'OPTIONS,POST,GET' } }
这个Lambda函数通过API Gateway从React应用程序中被调用。
const response = await axios.post( 'https://XXXX.execute-api.us-east-2.amazonaws.com/default/generate-content', {page_id: page.id, transcript: page.transcript}, );
问题:我们的大多数调用超过了API Gateway的30秒最大超时时间,尽管Lambda函数成功完成,但仍会导致错误。为了解决这个问题,我们通过禁用“使用Lambda代理集成”并添加HTTP头X-Amz-Invocation-Type
映射自'Event'
,使调用变为异步。这允许我们的Lambda函数运行超过30秒,但是我们无法再通过处理函数的'event'
传递详细信息,因为Lambda代理允许这样做。
问题:如果禁用了Lambda代理集成,我们如何通过API Gateway从React应用程序向Lambda函数传递详细信息?
更新 – 已实施的修复根据Mark的反馈,我为API Gateway方法的集成请求设置了映射模板,做了以下操作:
- 集成请求 -> 映射模板 -> 将“请求体直通”设置为“当没有定义模板时”
- “添加映射模板” -> 输入“application/json”
- 生成模板:方法请求直通
- 修改为以下内容:
#set($allParams = $input.params()){ "method" : "$context.httpMethod", ## API方法 "authcontext" : "$context.authorizer.stringkey", ## 可选的Lambda授权者输出 ## 直通体 "body" : $input.json('$'), ## 直通头部、查询字符串和路径参数 "params" : { #foreach($type in $allParams.keySet()) #set($params = $allParams.get($type)) "$type" : { #foreach($paramName in $params.keySet()) "$paramName" : "$util.escapeJavaScript($params.get($paramName))" #if($foreach.hasNext),#end #end } #if($foreach.hasNext),#end #end }}
- 更新我的Lambda函数以设置变量如下
pageId = event['body']['page_id'] transcript = event['body']['transcript']
回答:
当你禁用代理集成时,你也禁用了默认的代理请求映射。你需要启用集成直通请求映射,以便请求数据再次显示在Lambda函数的event
参数中。