"""Lambda shared module.""" import json import uuid import botocore from marshmallow import ValidationError from .constants import errors from .lambda_exceptions import CloudwatchEventError from .lambda_exceptions import LambdaEventError from .lambda_exceptions import S3Error from .validators import validate_encoding_route_lambda_event from .validators import validate_lambda_event def generate_unique_filename(): """Generate unique str sequence from uuid. Returns: str: Unique sequence. """ return str(uuid.uuid4()).replace('-', '_') def extract_triggered_key(cloudwatch_event): """Get S3 bucket and key from CloudWatch event. Args: cloudwatch_event (dict): AWS CloudWatch event data object. Returns: (str, str): Tuple of bucket and key names. """ request_params = cloudwatch_event['detail']['requestParameters'] bucket_name = request_params.get('bucketName') key = request_params.get('key') if not (bucket_name and key): raise CloudwatchEventError(json.dumps(cloudwatch_event)) return bucket_name, key def extract_event(event): """Get bucket, key and asset config from lambda event. Args: event (dict): AWS Lambda Event event data object. Returns: (str, str): Tuple of bucket and key names. """ try: lambda_event = validate_lambda_event(event) return ( lambda_event.get('bucket'), lambda_event.get('key'), lambda_event.get('config'), lambda_event.get('file_type') ) except ValidationError as e: raise LambdaEventError(json.dumps(e.messages)) def extract_encoding_route_event(event): """Get bucket, key and asset config from lambda event. Args: event (dict): AWS Lambda Event event data object. Returns: (str, str): Tuple of bucket and key names. """ try: lambda_event = validate_encoding_route_lambda_event(event) return lambda_event.get('bucket'), lambda_event.get('key'), lambda_event.get('config') except ValidationError as e: raise LambdaEventError(json.dumps(e.messages)) def boto3_error_handling(func): """Decorate all boto3 methods for exception handling. Used in s3, sns and elastic_transcoder modules.""" def func_wrapper(*args, **kwargs): try: return func(*args, **kwargs) except botocore.exceptions.ClientError as e: error_code = errors.S3_ERROR_CODE error_params = { 'code': e.response['ResponseMetadata']['HTTPStatusCode'], 'message': str(e) } if e.response['Error']['Code'] == '404': error_code = errors.S3_FILE_NOT_FOUND_CODE error_params = {'key': kwargs.get('key') or args[1], 'bucket': kwargs.get('bucket') or args[0]} raise S3Error( error_code=error_code, error_params=error_params ) return func_wrapper