def cfn_handler()

in aws_emr_blog_v3/code/launch-cluster/crhelper.py [0:0]


def cfn_handler(event, context, create, update, delete, logger, init_failed):

    logger.info("Lambda RequestId: %s CloudFormation RequestId: %s" %
                (context.aws_request_id, event["RequestId"]))

    # Define an object to place any response information you would like to send
    # back to CloudFormation (these keys can then be used by Fn::GetAttr)
    responseData = {}

    # Define a physicalId for the resource, if the event is an update and the
    # returned phyiscalid changes, cloudformation will then issue a delete
    # against the old id
    physicalResourceId = None

    logger.debug("EVENT: " + str(event))
    # handle init failures
    if init_failed:
        send(event, context, "FAILED", responseData, physicalResourceId,
             reason=init_failed, logger=logger)
        #raise

    try:
        # Execute custom resource handlers
        logger.info("Received a %s Request" % event["RequestType"])
        if event["RequestType"] == "Create":
            physicalResourceId, responseData = create(event, context)
            logger.info("Completed successfully, sending response to cfn")
            send(event, context, "SUCCESS", responseData, physicalResourceId,
                 logger=logger)
        elif event["RequestType"] == "Update":
            physicalResourceId, responseData = update(event, context)
            logger.info("Completed successfully, sending response to cfn")
            send(event, context, "SUCCESS", responseData, physicalResourceId,
                 logger=logger)
        elif event["RequestType"] == "Delete":
            while context.get_remaining_time_in_millis() > TIMEOUT_REMAINING:
                responseData = delete(event, context)
                cluster_status = responseData["ClusterStatus"]
                if cluster_status == "TERMINATED" or cluster_status == "TERMINATED_WITH_ERRORS":
                    logger.info("Cluster is now terminated, sending response to cfn")
                    send(event, context, "SUCCESS", responseData, physicalResourceId,
                         logger=logger)
                    break
                logger.info("Cluster is being terminated")
                time.sleep(10)
                continue
            else:
                retries_left = update_num_retries(event, logger=logger)
                if retries_left > 0:
                    relaunch_lambda(event, context)
                else:
                    timeout(event, context, logger)

    # Catch any exceptions, log the stacktrace, send a failure back to
    # CloudFormation and then raise an exception
    except Exception as e:
        logger.error(e, exc_info=True)
        send(event, context, "FAILED", responseData, physicalResourceId,
             reason=e, logger=logger)
        raise