def finished_data_api_request_record_handler()

in lambda/python/rs_integration_function/index.py [0:0]


def finished_data_api_request_record_handler(record: dict):
    """
    This will be called for each finished invocation.
    It should raise an exception if the message was not processed successfully so we don't catch any exceptions
    and if we would we should be able to handle it or re-raise.

    Args:
        record: Has 'body' as json string of event documented in section ata-api-monitoring-events-finished on
                https://docs.aws.amazon.com/redshift/latest/mgmt/data-api-monitoring-events.html

    Returns:
        None:
    """
    try:
        logger.debug(record)
        finished_event = FinishedEvent.from_record(record)
        statement_name = StatementName.from_str(finished_event.get_statement_name())
        callback_source = ddb_sfn_state_table.get_callback_source_for_statement_name(statement_name)
        if finished_event.has_failed():
            # noinspection PyBroadException
            try:
                statement_description = describe_statement(finished_event.get_statement_id())
                error = statement_description["Error"]
                finished_event['detail']['error'] = error
            except Exception as ex:
                logger.warn(f"Could not get error for {finished_event} due to {ex}")
            callback_source.send_failure(statement_name, finished_event)
        elif finished_event.has_succeeded():
            callback_source.send_success(statement_name, finished_event)
        else:
            raise NotImplementedError(f"Unsupported Data API finished event state {finished_event.get_state()}")

        ddb_sfn_state_table.mark_statement_name_as_handled(statement_name, finished_event)
    except Exception as e:
        logger.fatal({
            l_record: record,
            l_exception: e,
            l_traceback: traceback.format_exc()
        })
        raise e