我有一个 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))"]]}
Run Code Online (Sandbox Code Playgroud)
尽管存在未处理的函数错误,但直接 Lambda 调用的响应的状态代码是否预计为 200?我想在我的包装类中实现正确的错误响应检测,并且在 JSON 响应的顶层搜索键“errorType”似乎并不那么可靠。
解决方案——太明显了,但不足以分散对“200”的注意力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\'))\n=> #<struct Aws::Lambda::Types::InvocationResponse\n status_code=200,\n function_error=nil,\n log_result=nil,\n payload=#<StringIO:0x007f91c2a2eeb8>,\n executed_version="$LATEST">\n
Run Code Online (Sandbox Code Playgroud)\n\n否则它的值为\'Unhandled\'
或\'Handled\'
:
\n\n\n\nfunction_error \xe2\x87\x92 字符串
\n\n指示执行 Lambda 函数时是否发生错误。如果发生错误,该字段将具有两个值之一;已处理或未处理。已处理的错误是由函数报告的错误,而未处理的错误是由 AWS Lambda 检测和报告的错误。未处理的错误包括内存不足错误和函数超时。有关如何报告已处理错误的信息,请参阅编程模型。
\n
归档时间: |
|
查看次数: |
9845 次 |
最近记录: |