18F/domain-scan

View on GitHub
lambda/lambda_handler.py

Summary

Maintainability
A
0 mins
Test Coverage
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))