Streamline success/failure response from AWSLambda (#4000)
This commit is contained in:
parent
4653c34fd5
commit
0e302a97cb
@ -626,24 +626,17 @@ class LambdaFunction(CloudFormationModel, DockerModel):
|
|||||||
self.logs_group_name, log_stream_name, log_events, None
|
self.logs_group_name, log_stream_name, log_events, None
|
||||||
)
|
)
|
||||||
|
|
||||||
if exit_code != 0:
|
|
||||||
raise Exception("lambda invoke failed output: {}".format(output))
|
|
||||||
|
|
||||||
# We only care about the response from the lambda
|
# We only care about the response from the lambda
|
||||||
# Which is the last line of the output, according to https://github.com/lambci/docker-lambda/issues/25
|
# Which is the last line of the output, according to https://github.com/lambci/docker-lambda/issues/25
|
||||||
resp = output.splitlines()[-1]
|
resp = output.splitlines()[-1]
|
||||||
logs = os.linesep.join(
|
logs = os.linesep.join(
|
||||||
[line for line in self.convert(output).splitlines()[:-1]]
|
[line for line in self.convert(output).splitlines()[:-1]]
|
||||||
)
|
)
|
||||||
return resp, False, logs
|
invocation_error = exit_code != 0
|
||||||
|
return resp, invocation_error, logs
|
||||||
except docker.errors.DockerException as e:
|
except docker.errors.DockerException as e:
|
||||||
# Docker itself is probably not running - there will be no Lambda-logs to handle
|
# Docker itself is probably not running - there will be no Lambda-logs to handle
|
||||||
return "error running docker: {}".format(e), True, ""
|
return "error running docker: {}".format(e), True, ""
|
||||||
except BaseException as e:
|
|
||||||
logs = os.linesep.join(
|
|
||||||
[line for line in self.convert(output).splitlines()[:-1]]
|
|
||||||
)
|
|
||||||
return "error running lambda: {}".format(e), True, logs
|
|
||||||
|
|
||||||
def invoke(self, body, request_headers, response_headers):
|
def invoke(self, body, request_headers, response_headers):
|
||||||
|
|
||||||
|
@ -79,7 +79,7 @@ def lambda_handler(event, context):
|
|||||||
return _process_lambda(pfunc)
|
return _process_lambda(pfunc)
|
||||||
|
|
||||||
|
|
||||||
def get_test_zip_file4():
|
def get_test_zip_file_error():
|
||||||
pfunc = """
|
pfunc = """
|
||||||
def lambda_handler(event, context):
|
def lambda_handler(event, context):
|
||||||
raise Exception('I failed!')
|
raise Exception('I failed!')
|
||||||
@ -125,6 +125,37 @@ def test_list_functions():
|
|||||||
result["Functions"].should.have.length_of(0)
|
result["Functions"].should.have.length_of(0)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.network
|
||||||
|
@mock_lambda
|
||||||
|
def test_invoke_function_that_throws_error():
|
||||||
|
conn = boto3.client("lambda", _lambda_region)
|
||||||
|
conn.create_function(
|
||||||
|
FunctionName="testFunction",
|
||||||
|
Runtime="python2.7",
|
||||||
|
Role=get_role_name(),
|
||||||
|
Handler="lambda_function.lambda_handler",
|
||||||
|
Code={"ZipFile": get_test_zip_file_error()},
|
||||||
|
)
|
||||||
|
|
||||||
|
failure_response = conn.invoke(
|
||||||
|
FunctionName="testFunction", Payload=json.dumps({}), LogType="Tail"
|
||||||
|
)
|
||||||
|
|
||||||
|
failure_response.should.have.key("FunctionError").being.equal("Handled")
|
||||||
|
|
||||||
|
payload = failure_response["Payload"].read().decode("utf-8")
|
||||||
|
payload = json.loads(payload)
|
||||||
|
payload["errorType"].should.equal("Exception")
|
||||||
|
payload["errorMessage"].should.equal("I failed!")
|
||||||
|
payload.should.have.key("stackTrace")
|
||||||
|
|
||||||
|
logs = base64.b64decode(failure_response["LogResult"]).decode("utf-8")
|
||||||
|
logs.should.contain("START RequestId:")
|
||||||
|
logs.should.contain("I failed!: Exception")
|
||||||
|
logs.should.contain("Traceback (most recent call last):")
|
||||||
|
logs.should.contain("END RequestId:")
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.network
|
@pytest.mark.network
|
||||||
@pytest.mark.parametrize("invocation_type", [None, "RequestResponse"])
|
@pytest.mark.parametrize("invocation_type", [None, "RequestResponse"])
|
||||||
@pytest.mark.parametrize("key", ["FunctionName", "FunctionArn"])
|
@pytest.mark.parametrize("key", ["FunctionName", "FunctionArn"])
|
||||||
@ -1426,7 +1457,7 @@ def test_invoke_function_from_sqs_exception():
|
|||||||
Runtime="python2.7",
|
Runtime="python2.7",
|
||||||
Role=get_role_name(),
|
Role=get_role_name(),
|
||||||
Handler="lambda_function.lambda_handler",
|
Handler="lambda_function.lambda_handler",
|
||||||
Code={"ZipFile": get_test_zip_file4()},
|
Code={"ZipFile": get_test_zip_file_error()},
|
||||||
Description="test lambda function",
|
Description="test lambda function",
|
||||||
Timeout=3,
|
Timeout=3,
|
||||||
MemorySize=128,
|
MemorySize=128,
|
||||||
|
Loading…
Reference in New Issue
Block a user