AWS API Gateway仅将第一个变量传递给函数,但lambda测试通过所有

时间:2018-06-24 03:44:12

标签: amazon-web-services aws-lambda aws-api-gateway

我发现了一个奇怪的问题,其中AWS正确地将URL字符串参数传递给Lambda函数,但是仅当Lambda运行调用

的Python处理函数时,API网关才出现故障
KeywordSearch(keyword,page,RPP)

,它将3个变量传递给keywordSearch。在lambda IDE测试中,它可以正常工作,并打印出所有3个变量,如日志中所示

InsideKeywordSearch, Vars=: 
keyword: 
bombing
 page: 
1
 RPP: 
10

但是,当我运行API网关测试时,日志显示变量未传递到函数中,如日志中所示,RPP或Page没有变量。

仅传递关键字。我没有正确定义功能吗?它可以在Lambda中工作,如果是这样,为什么不使用API​​网关? 这是代码片段。

函数调用

def handler(event, context):
print('Inside Handler Funciton')
keyword = event.get('search_keyword', None)
id = event.get('id', None)
RPP = event.get('RPP', 10)
page = event.get('page', 1)
#get event variables, if passed and filter bad input
print("keyword")
print(keyword)
print("id")
print(id)
print('RPP')
print(RPP)
print('page')
print(page)
if keyword is not None:
    return keywordSearch(keyword,page,RPP)
elif id is not None:
    return idSearch(id)
else:
    return ""

功能

def keywordSearch (keyword, page, RPP):
    print('InsideKeywordSearch, Vars=: ')
    print("keyword: ")
    print(keyword)
    print(" page: ")
    print(page)
    print(" RPP: ")
    print(RPP)

Lambda日志显示

功能日志:

6d Version: $LATEST
Inside Handler Funciton
keyword
bombing
id
None
RPP
10
page
1
InsideKeywordSearch, Vars=: 
keyword: 
bombing
 page: 
1
 RPP: 
10
[INFO]  2018-06-30T03:04:56.240Z    5dc7a2cc-7c12-11e8-8f39-f5112d2e976d    SUCCESS: Connection to RDS mysql instance succeeded

API网关调用显示

{
  "errorMessage": "unsupported operand type(s) for -: 'str' and 'int'",
  "errorType": "TypeError",
  "stackTrace": [
    [
      "/var/task/app.py",
      144,
      "handler",
      "return keywordSearch(keyword,page,RPP)"
    ],
    [
      "/var/task/app.py",
      93,
      "keywordSearch",
      "sql = f\"SELECT attackid, SUM(MATCH(attack_fulltext) AGAINST('%{keyword}%' IN BOOLEAN MODE)) as score FROM search_index WHERE MATCH(attack_fulltext) AGAINST('%{keyword}%' IN BOOLEAN MODE) GROUP BY attackid ORDER BY score DESC Limit { ((page-1)*RPP) },{(RPP)};\""
    ]
  ]
}

这告诉我它没有传递变量,因为SQL字符串变得无效。

1 个答案:

答案 0 :(得分:0)

问题在于API网关正在将数字作为字符串传递。我必须按以下步骤在集成请求中修复get方法映射模板

为了将变量作为整数从API网关传递到后端,需要删除变量值周围的引号。请确保从客户端以整数形式传递值,否则您将得到与初始通信中提到的错误相同的错误。在这种情况下,我从以下位置更新了人体贴图模板:

{
    "search_keyword" : "$input.params('search_keyword')",
    "page": "$input.params('page')",
    "RPP": "$input.params('RPP')"
}

收件人:

{
    "search_keyword" : "$input.params('search_keyword')",
    "page": $input.params('page'),
    "RPP": $input.params('RPP')
}