from __future__ import print_function import sys import os import random import uuid import time import resource import datetime orig_stdout = sys.stdout orig_stderr = sys.stderr def eprint(*args, **kwargs): print(*args, file=orig_stderr, **kwargs) def _random_account_id(): return random.randint(100000000000, 999999999999) def _random_invoke_id(): return str(uuid.uuid4()) def _arn(region, account_id, fct_name): return 'arn:aws:lambda:%s:%s:function:%s' % (region, account_id, fct_name) _GLOBAL_HANDLER = sys.argv[1] if len(sys.argv) > 1 else os.environ.get('AWS_LAMBDA_FUNCTION_HANDLER', os.environ.get('_HANDLER', 'lambda_function.lambda_handler')) _GLOBAL_EVENT_BODY = sys.argv[2] if len(sys.argv) > 2 else os.environ.get('AWS_LAMBDA_EVENT_BODY', (sys.stdin.read() if os.environ.get('DOCKER_LAMBDA_USE_STDIN', False) else '{}')) _GLOBAL_FCT_NAME = os.environ.get('AWS_LAMBDA_FUNCTION_NAME', 'test') _GLOBAL_VERSION = os.environ.get('AWS_LAMBDA_FUNCTION_VERSION', '$LATEST') _GLOBAL_MEM_SIZE = os.environ.get('AWS_LAMBDA_FUNCTION_MEMORY_SIZE', '1536') _GLOBAL_TIMEOUT = int(os.environ.get('AWS_LAMBDA_FUNCTION_TIMEOUT', '300')) _GLOBAL_REGION = os.environ.get('AWS_REGION', os.environ.get('AWS_DEFAULT_REGION', 'us-east-1')) _GLOBAL_ACCOUNT_ID = os.environ.get('AWS_ACCOUNT_ID', _random_account_id()) _GLOBAL_ACCESS_KEY_ID = os.environ.get('AWS_ACCESS_KEY_ID', 'SOME_ACCESS_KEY_ID') _GLOBAL_SECRET_ACCESS_KEY = os.environ.get('AWS_SECRET_ACCESS_KEY', 'SOME_SECRET_ACCESS_KEY') _GLOBAL_SESSION_TOKEN = os.environ.get('AWS_SESSION_TOKEN', None) _GLOBAL_INVOKEID = _random_invoke_id() _GLOBAL_MODE = 'event' # Either 'http' or 'event' _GLOBAL_SUPRESS_INIT = True # Forces calling _get_handlers_delayed() _GLOBAL_DATA_SOCK = -1 _GLOBAL_CONTEXT_OBJS = { 'clientcontext': None, 'cognitoidentityid': None, 'cognitopoolid': None, } _GLOBAL_CREDENTIALS = { 'key': _GLOBAL_ACCESS_KEY_ID, 'secret': _GLOBAL_SECRET_ACCESS_KEY, 'session': _GLOBAL_SESSION_TOKEN } _GLOBAL_INVOKED_FUNCTION_ARN = os.environ.get('AWS_LAMBDA_FUNCTION_INVOKED_ARN', _arn(_GLOBAL_REGION, _GLOBAL_ACCOUNT_ID, _GLOBAL_FCT_NAME)) _GLOBAL_XRAY_TRACE_ID = os.environ.get('_X_AMZN_TRACE_ID', None) _GLOBAL_XRAY_PARENT_ID = None _GLOBAL_XRAY_SAMPLED = None _GLOBAL_X_AMZN_TRACE_ID = None _GLOBAL_INVOKED = False _GLOBAL_ERRORED = False _GLOBAL_START_TIME = None _GLOBAL_TODAY = datetime.date.today() # export needed stuff os.environ['AWS_LAMBDA_LOG_GROUP_NAME'] = '/aws/lambda/%s' % _GLOBAL_FCT_NAME os.environ['AWS_LAMBDA_LOG_STREAM_NAME'] = "%s/%s/%s/[%s]%s" % ( _GLOBAL_TODAY.year, _GLOBAL_TODAY.month, _GLOBAL_TODAY.day, _GLOBAL_VERSION, '%016x' % random.randrange(16**16) ) os.environ["AWS_LAMBDA_FUNCTION_NAME"] = _GLOBAL_FCT_NAME os.environ['AWS_LAMBDA_FUNCTION_MEMORY_SIZE'] = _GLOBAL_MEM_SIZE os.environ['AWS_LAMBDA_FUNCTION_VERSION'] = _GLOBAL_VERSION os.environ['AWS_REGION'] = _GLOBAL_REGION os.environ['AWS_DEFAULT_REGION'] = _GLOBAL_REGION os.environ['_HANDLER'] = _GLOBAL_HANDLER def report_user_init_start(): return def report_user_init_end(): return def report_user_invoke_start(): return def report_user_invoke_end(): return def receive_start(): sys.stdout = orig_stderr sys.stderr = orig_stderr return ( _GLOBAL_INVOKEID, _GLOBAL_MODE, _GLOBAL_HANDLER, _GLOBAL_SUPRESS_INIT, _GLOBAL_CREDENTIALS ) def report_running(invokeid): return def receive_invoke(): global _GLOBAL_INVOKED global _GLOBAL_START_TIME if not _GLOBAL_INVOKED: eprint( "START RequestId: %s Version: %s" % (_GLOBAL_INVOKEID, _GLOBAL_VERSION) ) _GLOBAL_INVOKED = True _GLOBAL_START_TIME = time.time() return ( _GLOBAL_INVOKEID, _GLOBAL_DATA_SOCK, _GLOBAL_CREDENTIALS, _GLOBAL_EVENT_BODY, _GLOBAL_CONTEXT_OBJS, _GLOBAL_INVOKED_FUNCTION_ARN, _GLOBAL_XRAY_TRACE_ID, ) def report_fault(invokeid, msg, except_value, trace): global _GLOBAL_ERRORED _GLOBAL_ERRORED = True if msg and except_value: eprint('%s: %s' % (msg, except_value)) if trace: eprint('%s' % trace) return def report_done(invokeid, errortype, result, is_fatal): global _GLOBAL_INVOKED global _GLOBAL_ERRORED if _GLOBAL_INVOKED: eprint("END RequestId: %s" % invokeid) duration = int((time.time() - _GLOBAL_START_TIME) * 1000) billed_duration = min(100 * int((duration / 100) + 1), _GLOBAL_TIMEOUT * 1000) max_mem = int(resource.getrusage(resource.RUSAGE_SELF).ru_maxrss / 1024) eprint( "REPORT RequestId: %s Duration: %s ms Billed Duration: %s ms Memory Size: %s MB Max Memory Used: %s MB" % ( invokeid, duration, billed_duration, _GLOBAL_MEM_SIZE, max_mem ) ) if result: print('\n' + result, file=orig_stdout) sys.exit(1 if _GLOBAL_ERRORED else 0) else: return def report_xray_exception(xray_json): return def log_bytes(msg, fileno): eprint(msg) return def log_sb(msg): return def get_remaining_time(): return ((_GLOBAL_TIMEOUT * 1000) - int((time.time() - _GLOBAL_START_TIME) * 1000)) def send_console_message(msg, byte_length): eprint(msg) return