Skip to content

Commit

Permalink
Add Lambda header for invoking error. Closes #770.
Browse files Browse the repository at this point in the history
  • Loading branch information
spulec committed Mar 17, 2017
1 parent e3bff8b commit e7a3f34
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 4 deletions.
12 changes: 8 additions & 4 deletions moto/awslambda/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ def _invoke_lambda(self, code, event={}, context={}):
except Exception as ex:
print("Exception %s", ex)

errored = False
try:
original_stdout = sys.stdout
original_stderr = sys.stderr
Expand All @@ -152,26 +153,29 @@ def _invoke_lambda(self, code, event={}, context={}):
if exec_err:
result = "\n".join([exec_out.strip(), self.convert(exec_err)])
except Exception as ex:
errored = True
result = '%s\n\n\nException %s' % (mycode, ex)
finally:
codeErr.close()
codeOut.close()
sys.stdout = original_stdout
sys.stderr = original_stderr
return self.convert(result)
return self.convert(result), errored

def invoke(self, body, request_headers, response_headers):
payload = dict()

# Get the invocation type:
r = self._invoke_lambda(code=self.code, event=body)
res, errored = self._invoke_lambda(code=self.code, event=body)
if request_headers.get("x-amz-invocation-type") == "RequestResponse":
encoded = base64.b64encode(r.encode('utf-8'))
encoded = base64.b64encode(res.encode('utf-8'))
response_headers["x-amz-log-result"] = encoded.decode('utf-8')
payload['result'] = response_headers["x-amz-log-result"]
result = r.encode('utf-8')
result = res.encode('utf-8')
else:
result = json.dumps(payload)
if errored:
response_headers['x-amz-function-error'] = "Handled"

return result

Expand Down
37 changes: 37 additions & 0 deletions tests/test_awslambda/test_lambda.py
Original file line number Diff line number Diff line change
Expand Up @@ -432,3 +432,40 @@ def test_list_create_list_get_delete_list():
conn.delete_function(FunctionName='testFunction')

conn.list_functions()['Functions'].should.have.length_of(0)


@mock_lambda
def test_invoke_lambda_error():
lambda_fx = """
def lambda_handler(event, context):
raise Exception('failsauce')
"""
zip_output = io.BytesIO()
zip_file = zipfile.ZipFile(zip_output, 'w', zipfile.ZIP_DEFLATED)
zip_file.writestr('lambda_function.zip', lambda_fx)
zip_file.close()
zip_output.seek(0)

client = boto3.client('lambda', region_name='us-east-1')
client.create_function(
FunctionName='test-lambda-fx',
Runtime='python2.7',
Role='test-iam-role',
Handler='lambda_function.lambda_handler',
Description='test lambda function',
Timeout=3,
MemorySize=128,
Publish=True,
Code={
'ZipFile': zip_output.read()
},
)

result = client.invoke(
FunctionName='test-lambda-fx',
InvocationType='RequestResponse',
LogType='Tail'
)

assert 'FunctionError' in result
assert result['FunctionError'] == 'Handled'

0 comments on commit e7a3f34

Please sign in to comment.