我发现了一个奇怪的问题,其中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字符串变得无效。
答案 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')
}