diff --git a/moto/awslambda/models.py b/moto/awslambda/models.py index 589a790ae..28cbe61af 100644 --- a/moto/awslambda/models.py +++ b/moto/awslambda/models.py @@ -379,6 +379,7 @@ class LambdaFunction(BaseModel): event = dict() if context is None: context = {} + output = None try: # TODO: I believe we can keep the container running and feed events as needed @@ -394,7 +395,7 @@ class LambdaFunction(BaseModel): env_vars.update(self.environment_vars) - container = output = exit_code = None + container = exit_code = None log_config = docker.types.LogConfig(type=docker.types.LogConfig.types.JSON) with _DockerDataVolumeContext(self) as data_vol: try: @@ -455,24 +456,28 @@ class LambdaFunction(BaseModel): # 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 - output = output.splitlines()[-1] - return output, False + resp = output.splitlines()[-1] + logs = os.linesep.join( + [line for line in self.convert(output).splitlines()[:-1]] + ) + return resp, False, logs except BaseException as e: traceback.print_exc() - return "error running lambda: {}".format(e), True + 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): - payload = dict() if body: body = json.loads(body) # Get the invocation type: - res, errored = self._invoke_lambda(code=self.code, event=body) + res, errored, logs = self._invoke_lambda(code=self.code, event=body) if request_headers.get("x-amz-invocation-type") == "RequestResponse": - encoded = base64.b64encode(res.encode("utf-8")) + encoded = base64.b64encode(logs.encode("utf-8")) response_headers["x-amz-log-result"] = encoded.decode("utf-8") - payload["result"] = response_headers["x-amz-log-result"] result = res.encode("utf-8") else: result = res diff --git a/tests/test_awslambda/test_lambda.py b/tests/test_awslambda/test_lambda.py index e67576518..62e2bcef6 100644 --- a/tests/test_awslambda/test_lambda.py +++ b/tests/test_awslambda/test_lambda.py @@ -43,6 +43,7 @@ def _process_lambda(func_str): def get_test_zip_file1(): pfunc = """ def lambda_handler(event, context): + print("custom log event") return event """ return _process_lambda(pfunc) @@ -115,11 +116,11 @@ def test_invoke_requestresponse_function(): ) success_result["StatusCode"].should.equal(200) - result_obj = json.loads( - base64.b64decode(success_result["LogResult"]).decode("utf-8") - ) + logs = base64.b64decode(success_result["LogResult"]).decode("utf-8") - result_obj.should.equal(in_data) + logs.should.contain("START RequestId:") + logs.should.contain("custom log event") + logs.should.contain("END RequestId:") payload = success_result["Payload"].read().decode("utf-8") json.loads(payload).should.equal(in_data) @@ -152,11 +153,6 @@ def test_invoke_requestresponse_function_with_arn(): ) success_result["StatusCode"].should.equal(200) - result_obj = json.loads( - base64.b64decode(success_result["LogResult"]).decode("utf-8") - ) - - result_obj.should.equal(in_data) payload = success_result["Payload"].read().decode("utf-8") json.loads(payload).should.equal(in_data)