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