lambda/lambda_handler.py
import importlib
import sys
import logging
from utils import utils
# Central handler for all Lambda events.
def handler(event, context):
start_time = utils.local_now()
domain = event.get('domain')
options = event.get('options')
name = event.get('scanner')
environment = event.get('environment')
# Log all sent events, for the record.
utils.configure_logging(options)
logging.info(event)
# Might be acceptable to let this crash the module, in Lambda.
try:
scanner = importlib.import_module("scanners.%s" % name)
except ImportError:
exc_type, exc_value, exc_traceback = sys.exc_info()
logging.error("[%s] Scanner not found, or had an error during loading.\n\tERROR: %s\n\t%s" % (name, exc_type, exc_value))
exit(1) # ?
# Same method call as when run locally.
data = scanner.scan(domain, environment, options)
# We capture start and end times locally as well, but it's
# useful to know the start/end from Lambda's vantage point.
end_time = utils.local_now()
duration = end_time - start_time
response = {
'lambda': {
'log_group_name': context.log_group_name,
'log_stream_name': context.log_stream_name,
'request_id': context.aws_request_id,
'memory_limit': context.memory_limit_in_mb,
'start_time': start_time,
'end_time': end_time,
'measured_duration': duration
},
'data': data
}
# Serialize and re-parse the JSON, so that we run our own
# date transform functions in one place, before Amazon's built-in
# JSON serialization prepares the data for transport.
return utils.from_json(utils.json_for(response))