"""Lambda retry-sfn-execution.""" from lambdacommon.common_config import logger import config class RetryException(Exception): """RetryException class.""" pass def get_backoff_time(interval_secs, backoff_rate, retry_num): """Calculate exponential backoff time.""" return interval_secs * sum(backoff_rate ** i for i in range(retry_num)) def handler(event, context): """Lambda entry point.""" try: retries = int(event.get('retries', 0)) + 1 backoff_s = get_backoff_time(config.BACKOFF_INTERVAL_S, config.BACKOFF_RATE, retries) if retries > config.MAX_RETRIES: raise RetryException( f'Exceeded max retries: {config.MAX_RETRIES} with {backoff_s}s backoff' ) logger.info(f'Setting retry to {retries} with {backoff_s}s backoff') return { 'status': 'OK', 'retries': retries, 'backoff_time_s': backoff_s } except Exception as e: logger.exception(str(e)) raise e