"""Lambda to begin step machine execution upon S3 trigger.""" import json import os from common.helpers.bulk_asset import load_bulk_asset_json import config from constants.artwork import NEW_ROOT_SUBFOLDER from util.s3_image import get_image_from_s3 from util.s3_image import repair_image from util.s3_image import save_image_to_s3 def handler(event, context): """Lambda handler entry point.""" correlation_id = event.get('correlation_id') logger = config.get_current_logger(correlation_id) # Show event content logger.info(f'pre_process_art received: {event}') # DDEX_INGESTER_INTEGRATION: Skip ddex-ingester context JSON, load basic # JSON elements asset = load_bulk_asset_json(event) product = asset.product bucket = product.artwork.bucket key = product.artwork.key file_name = os.path.split(key)[1] logger.info('Processing image file: {}'.format(bucket + '/' + key)) try: # Get image img = get_image_from_s3(bucket, key, correlation_id) logger.info('Transform and Save image: {}'.format(key)) except Exception as e: error_str = f'Pre-process artwork asset error: ' \ f'Could not find {file_name} on S3' msg = f'{error_str}: {str(e)}' logger.error(msg) raise e try: # Transform image img = repair_image(file_name, img, correlation_id) logger.info('Transforming {}'.format(file_name)) except Exception as e: error_str = f'Pre-process artwork asset error: ' \ f'Could not transform {file_name}' msg = f'{error_str}: {str(e)}' logger.error(msg) raise e # New key contains source bucket and new root. new_target_key = os.path.join(NEW_ROOT_SUBFOLDER, bucket, key) try: new_target_key = save_image_to_s3( img=img, bucket=config.STAGING_S3_BUCKET, key=new_target_key, dpi=(300, 300), correlation_id=correlation_id) # Change key to reflect .jpg extension file_name = os.path.split(new_target_key)[1] logger.info(f'Saving {file_name}') except Exception as e: error_str = f'Pre-process artwork asset error: ' \ f'Could not save {file_name}' msg = f'{error_str}: {str(e)}' logger.error(msg) raise e asset.product.artwork.bucket = config.STAGING_S3_BUCKET # Ensure the correct file/key names are passed to the next lambda. asset.product.artwork.filename = file_name asset.product.artwork.key = new_target_key return json.loads(json.dumps(asset, default=lambda s: vars(s)))