(直接)尽管存在未处理的函数错误,AWS Lambda 调用响应状态代码仍为 200

Dan*_* B. 9 ruby aws-lambda

我有一个 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”似乎并不那么可靠。

Dan*_* B. 6

解决方案——太明显了,但不足以分散对“200”的注意力status_code——是检查是否function_errornil

\n\n

该值是nil调用成功时的值:

\n\n\n\n
[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

function_error \xe2\x87\x92 字符串

\n\n

指示执行 Lambda 函数时是否发生错误。如果发生错误,该字段将具有两个值之一;已处理或未处理。已处理的错误是由函数报告的错误,而未处理的错误是由 AWS Lambda 检测和报告的错误。未处理的错误包括内存不足错误和函数超时。有关如何报告已处理错误的信息,请参阅编程模型。

\n
\n\n

https://docs.aws.amazon.com/sdkforruby/api/Aws/Lambda/Types/InitationResponse.html#function_error-instance_method

\n