如何通过API Gateway向异步Lambda函数传递参数?

我们有一个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方法的集成请求设置了映射模板,做了以下操作:

  1. 集成请求 -> 映射模板 -> 将“请求体直通”设置为“当没有定义模板时”
  2. “添加映射模板” -> 输入“application/json”
  3. 生成模板:方法请求直通
  4. 修改为以下内容:
#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   }}
  1. 更新我的Lambda函数以设置变量如下
    pageId = event['body']['page_id']    transcript = event['body']['transcript']

回答:

当你禁用代理集成时,你也禁用了默认的代理请求映射。你需要启用集成直通请求映射,以便请求数据再次显示在Lambda函数的event参数中。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注