我有一个AWS Lambda,用于在我的团队服务环境中直接从多个应用程序调用。我正在编写一个包装类,它将执行此调用,并在Lambda的响应中进行相关的验证和错误检测/处理。
按照设计,如果调用参数的运行时验证失败,则Lambda将以未处理的异常终止。但我没想到会发现尽管有一个未处理的函数错误,但调用响应的status_code
为200:
[1] pry(main)> lambda_client = Aws::Lambda::Client.new(region: 'us-east-1')
=> #<Aws::Lambda::Client>
[2] pry(main)> invocation_response = lambda_client.invoke(function_name: 'jwt-tokens-dev-AccessTokenCreator')
=> #<struct Aws::Lambda::Types::InvocationResponse
status_code=200,
function_error="Unhandled",
log_result=nil,
payload=#<StringIO:0x007f91c1749028>,
executed_version="$LATEST">
[3] pry(main)> invocation_response.payload.string
=> "{\"errorMessage\": \"Required parameters are missing: role, sub, sub_type\", \"errorType\": \"ParamMissingError\", \"stackTrace\": [[\"/var/task/handler.py\", 15, \"access_token_creator\", \"return access_token_creator_handler(event, context)\"], [\"/var/task/access_token_creator.py\", 32, \"handler\", \"params = _validate_event_params(event)\"], [\"/var/task/access_token_creator.py\", 97, \"_validate_event_params\", \"raise ParamMissingError('Required parameters are missing: %s' % ', '.join(missing_params))\"]]}"
[4] pry(main)> ActiveSupport::JSON.decode(invocation_response.payload.string)
=> {"errorMessage"=>"Required parameters are missing: role, sub, sub_type",
"errorType"=>"ParamMissingError",
"stackTrace"=>
[["/var/task/handler.py", 15, "access_token_creator", "return access_token_creator_handler(event, context)"],
["/var/task/access_token_creator.py", 32, "handler", "params = _validate_event_params(event)"],
["/var/task/access_token_creator.py",
97,
"_validate_event_params",
"raise ParamMissingError('Required parameters are missing: %s' % ', '.join(missing_params))"]]}
直接Lambda调用的响应的状态代码是否应该是200,尽管未处理的函数错误?我想在我的包装器类中实现正确的错误响应检测,在JSON响应的顶层搜索关键字“errorType”看起来并不那么健壮。
答案 0 :(得分:0)
解决方案 - 太明显了,但不足以分散&#34; 200&#34; status_code
- 检查function_error
是否为nil
。
如果成功调用,则值为nil
:
[8] pry(main)> invocation_response = lambda_client.invoke(function_name: 'jwt-tokens-dev-AccessTokenCreator', payload: ActiveSupport::JSON::encode(sub:3285397, sub_type:'user', role:'admin'))
=> #<struct Aws::Lambda::Types::InvocationResponse
status_code=200,
function_error=nil,
log_result=nil,
payload=#<StringIO:0x007f91c2a2eeb8>,
executed_version="$LATEST">
否则它的值为'Unhandled'
或'Handled'
:
function_error⇒字符串
指示执行Lambda函数时是否发生错误。如果发生错误,此字段将出现 有两个值之一;处理或未处理。处理错误是 未处理错误时函数报告的错误 是AWS Lambda检测和报告的那些。未处理的错误 包括内存不足错误和功能超时。有关信息 关于如何报告Handled错误,请参阅编程模型。