List of usage examples for com.amazonaws.services.cloudwatchevents.model DeleteRuleRequest DeleteRuleRequest
DeleteRuleRequest
From source file:squash.deployment.lambdas.ScheduledCloudwatchEventCustomResourceLambda.java
License:Apache License
/** * Implementation for the AWS Lambda function backing the CloudwatchEvents resource. * /*from w ww . ja v a 2 s . c o m*/ * <p>This lambda requires the following environment variables: * <ul> * <li>ApiGatewayBaseUrl - base Url of the ApiGateway Api.</li> * <li>ApplyBookingRulesLambdaArn - arn of the lambda function to apply the booking rules.</li> * <li>DatabaseBackupLambdaArn - arn of the lambda function to backup all bookings.</li> * <li>CreateOrDeleteBookingsLambdaArn - arn of the lambda function to keep warm.</li> * <li>UpdateBookingsLambdaArn - arn of the lambda function to move the site forward by a day.</li> * <li>Region - the AWS region in which the Cloudformation stack is created.</li> * <li>Revision - integer incremented to force stack updates to update this resource.</li> * </ul> * * <p>On success, it returns the following outputs to Cloudformation: * <ul> * <li>UpdateBookingsServiceEventRuleArn - arn of the pre-midnight rule to update the bookings service.</li> * <li>UpdateFrontendServiceEventRuleArn - arn of the post-midnight rule to update the website.</li> * <li>PrewarmerEventRuleArn - arn of the lambda prewarmer rule.</li> * </ul> * * @param request request parameters as provided by the CloudFormation service * @param context context as provided by the CloudFormation service */ @Override public Object handleRequest(Map<String, Object> request, Context context) { LambdaLogger logger = context.getLogger(); logger.log("Starting ScheduledCloudwatchEvent custom resource handleRequest"); // Handle standard request parameters Map<String, String> standardRequestParameters = LambdaInputLogger.logStandardRequestParameters(request, logger); String requestType = standardRequestParameters.get("RequestType"); // Handle required environment variables logger.log("Logging required environment variables for custom resource request"); String apiGatewayBaseUrl = System.getenv("ApiGatewayBaseUrl"); String applyBookingRulesLambdaArn = System.getenv("ApplyBookingRulesLambdaArn"); String databaseBackupLambdaArn = System.getenv("DatabaseBackupLambdaArn"); String createOrDeleteBookingsLambdaArn = System.getenv("CreateOrDeleteBookingsLambdaArn"); String updateBookingsLambdaArn = System.getenv("UpdateBookingsLambdaArn"); String region = System.getenv("AWS_REGION"); String revision = System.getenv("Revision"); // Log out our required environment variables logger.log("ApiGatewayBaseUrl: " + apiGatewayBaseUrl); logger.log("ApplyBookingRulesLambdaArn: " + applyBookingRulesLambdaArn); logger.log("DatabaseBackupLambdaArn: " + databaseBackupLambdaArn); logger.log("CreateOrDeleteBookingsLambdaArn: " + createOrDeleteBookingsLambdaArn); logger.log("UpdateBookingsLambdaArn: " + updateBookingsLambdaArn); logger.log("Region: " + region); logger.log("Revision: " + revision); // API calls below can sometimes give access denied errors during stack // creation which I think is bc required new roles have not yet propagated // across AWS. We sleep here to allow time for this propagation. try { Thread.sleep(10000); } catch (InterruptedException e) { logger.log("Sleep to allow new roles to propagate has been interrupted."); } // Prepare our response to be sent in the finally block CloudFormationResponder cloudFormationResponder = new CloudFormationResponder(standardRequestParameters, "DummyPhysicalResourceId"); // Initialise failure response, which will be changed on success String responseStatus = "FAILED"; // Ensure unique names, so multiple stacks do not clash // Stack id is like: // "arn:aws:cloudformation:us-west-2:EXAMPLE/stack-name/guid". We // want the last guid section. String stackId = standardRequestParameters.get("StackId"); String guid = stackId.substring(stackId.lastIndexOf('/') + 1); String preMidnightRuleName = "PreMidnightRunner_" + guid; String preMidnightapplyBookingRulesTargetId = "ApplyRulesTarget_" + guid; String preMidnightDatabaseBackupTargetId = "BackupTarget_" + guid; String postMidnightRuleName = "PostMidnightRunner_" + guid; String postMidnightWebsiteRefreshTargetId = "WebsiteRefreshTarget_" + guid; String prewarmerRuleName = "Prewarmer_" + guid; String prewarmerTargetId = "PrewarmerTarget_" + guid; Map<String, String> ruleArns = null; try { cloudFormationResponder.initialise(); AmazonCloudWatchEvents amazonCloudWatchEventsClient = AmazonCloudWatchEventsClientBuilder.standard() .withRegion(region).build(); if (requestType.equals("Create")) { ruleArns = new HashMap<>(); ImmutablePair<String, String> ruleArn = setUpPreMidnightRuleAndTargets(preMidnightRuleName, preMidnightapplyBookingRulesTargetId, applyBookingRulesLambdaArn, apiGatewayBaseUrl, preMidnightDatabaseBackupTargetId, databaseBackupLambdaArn, amazonCloudWatchEventsClient, logger); ruleArns.put(ruleArn.left, ruleArn.right); ruleArn = setUpPostMidnightRuleAndTargets(postMidnightRuleName, postMidnightWebsiteRefreshTargetId, updateBookingsLambdaArn, apiGatewayBaseUrl, amazonCloudWatchEventsClient, logger); ruleArns.put(ruleArn.left, ruleArn.right); ruleArn = setUpPrewarmerRuleAndTargets(prewarmerRuleName, prewarmerTargetId, createOrDeleteBookingsLambdaArn, amazonCloudWatchEventsClient, logger); ruleArns.put(ruleArn.left, ruleArn.right); } else if (requestType.equals("Update")) { // First remove any existing targets from the rules logger.log("Removing existing targets from rules"); ListTargetsByRuleRequest listTargetsByRuleRequest = new ListTargetsByRuleRequest(); listTargetsByRuleRequest.setRule(preMidnightRuleName); ListTargetsByRuleResult listTargetsByRuleResult = amazonCloudWatchEventsClient .listTargetsByRule(listTargetsByRuleRequest); List<String> targets = listTargetsByRuleResult.getTargets().stream().map(Target::getId) .collect(Collectors.toList()); RemoveTargetsRequest removeTargetsRequest = new RemoveTargetsRequest(); removeTargetsRequest.setRule(preMidnightRuleName); removeTargetsRequest.setIds(targets); amazonCloudWatchEventsClient.removeTargets(removeTargetsRequest); logger.log("Successfully removed targets from pre-midnight rule"); listTargetsByRuleRequest.setRule(postMidnightRuleName); listTargetsByRuleResult = amazonCloudWatchEventsClient.listTargetsByRule(listTargetsByRuleRequest); targets = listTargetsByRuleResult.getTargets().stream().map(Target::getId) .collect(Collectors.toList()); removeTargetsRequest = new RemoveTargetsRequest(); removeTargetsRequest.setRule(postMidnightRuleName); removeTargetsRequest.setIds(targets); amazonCloudWatchEventsClient.removeTargets(removeTargetsRequest); logger.log("Successfully removed targets from post-midnight rule"); listTargetsByRuleRequest.setRule(prewarmerRuleName); listTargetsByRuleResult = amazonCloudWatchEventsClient.listTargetsByRule(listTargetsByRuleRequest); targets = listTargetsByRuleResult.getTargets().stream().map(Target::getId) .collect(Collectors.toList()); removeTargetsRequest = new RemoveTargetsRequest(); removeTargetsRequest.setRule(prewarmerRuleName); removeTargetsRequest.setIds(targets); amazonCloudWatchEventsClient.removeTargets(removeTargetsRequest); logger.log("Successfully removed targets from prewarmer rule"); // Re-put the rules and then add back updated targets to them logger.log("Adding back updated rules and their targets"); ruleArns = new HashMap<>(); ImmutablePair<String, String> ruleArn = setUpPreMidnightRuleAndTargets(preMidnightRuleName, preMidnightapplyBookingRulesTargetId, applyBookingRulesLambdaArn, apiGatewayBaseUrl, preMidnightDatabaseBackupTargetId, databaseBackupLambdaArn, amazonCloudWatchEventsClient, logger); ruleArns.put(ruleArn.left, ruleArn.right); ruleArn = setUpPostMidnightRuleAndTargets(postMidnightRuleName, postMidnightWebsiteRefreshTargetId, updateBookingsLambdaArn, apiGatewayBaseUrl, amazonCloudWatchEventsClient, logger); ruleArns.put(ruleArn.left, ruleArn.right); ruleArn = setUpPrewarmerRuleAndTargets(prewarmerRuleName, prewarmerTargetId, createOrDeleteBookingsLambdaArn, amazonCloudWatchEventsClient, logger); ruleArns.put(ruleArn.left, ruleArn.right); } else if (requestType.equals("Delete")) { logger.log("Delete request - so deleting the scheduled cloudwatch rules"); // Delete target from pre-midnight rule logger.log("Removing lambda targets from pre-midnight rule"); RemoveTargetsRequest removePreMidnightTargetsRequest = new RemoveTargetsRequest(); removePreMidnightTargetsRequest.setRule(preMidnightRuleName); Collection<String> preMidnightTargetIds = new ArrayList<>(); preMidnightTargetIds.add(preMidnightapplyBookingRulesTargetId); preMidnightTargetIds.add(preMidnightDatabaseBackupTargetId); removePreMidnightTargetsRequest.setIds(preMidnightTargetIds); amazonCloudWatchEventsClient.removeTargets(removePreMidnightTargetsRequest); logger.log("Removed lambda target from pre-midnight rule"); // Delete pre-midnight scheduled rule logger.log("Deleting pre-midnight rule"); DeleteRuleRequest deletePreMidnightRuleRequest = new DeleteRuleRequest(); deletePreMidnightRuleRequest.setName(preMidnightRuleName); amazonCloudWatchEventsClient.deleteRule(deletePreMidnightRuleRequest); logger.log("Deleted pre-midnight rule"); // Delete target from post-midnight rule logger.log("Removing lambda targets from post-midnight rule"); RemoveTargetsRequest removePostMidnightTargetsRequest = new RemoveTargetsRequest(); removePostMidnightTargetsRequest.setRule(postMidnightRuleName); Collection<String> postMidnightTargetIds = new ArrayList<>(); postMidnightTargetIds.add(postMidnightWebsiteRefreshTargetId); removePostMidnightTargetsRequest.setIds(postMidnightTargetIds); amazonCloudWatchEventsClient.removeTargets(removePostMidnightTargetsRequest); logger.log("Removed lambda target from post-midnight rule"); // Delete post-midnight scheduled rule logger.log("Deleting post-midnight rule"); DeleteRuleRequest deletePostMidnightRuleRequest = new DeleteRuleRequest(); deletePostMidnightRuleRequest.setName(postMidnightRuleName); amazonCloudWatchEventsClient.deleteRule(deletePostMidnightRuleRequest); logger.log("Deleted post-midnight rule"); // Delete target from prewarmer rule logger.log("Removing lambda target from Prewarmer rule"); RemoveTargetsRequest removePrewarmerTargetsRequest = new RemoveTargetsRequest(); removePrewarmerTargetsRequest.setRule(prewarmerRuleName); Collection<String> prewarmerTargetIds = new ArrayList<>(); prewarmerTargetIds.add(prewarmerTargetId); removePrewarmerTargetsRequest.setIds(prewarmerTargetIds); amazonCloudWatchEventsClient.removeTargets(removePrewarmerTargetsRequest); logger.log("Removed lambda target from Prewarmer rule"); // Delete prewarmer scheduled rule logger.log("Deleting Prewarmer rule"); DeleteRuleRequest deletePrewarmerRuleRequest = new DeleteRuleRequest(); deletePrewarmerRuleRequest.setName(prewarmerRuleName); amazonCloudWatchEventsClient.deleteRule(deletePrewarmerRuleRequest); logger.log("Deleted Prewarmer rule"); logger.log("Finished removing the scheduled cloudwatch rules"); } responseStatus = "SUCCESS"; return null; } catch (AmazonServiceException ase) { ExceptionUtils.logAmazonServiceException(ase, logger); return null; } catch (AmazonClientException ace) { ExceptionUtils.logAmazonClientException(ace, logger); return null; } catch (Exception e) { logger.log("Exception caught in the scheduled cloudwatch event Lambda: " + e.getMessage()); return null; } finally { // Send response to CloudFormation cloudFormationResponder.addKeyValueOutputsPair("UpdateBookingsServiceEventRuleArn", (requestType.equals("Delete") || (ruleArns == null)) ? "Not available" : ruleArns.get("UpdateBookingsServiceEventRuleArn")); cloudFormationResponder.addKeyValueOutputsPair("UpdateFrontendServiceEventRuleArn", (requestType.equals("Delete") || (ruleArns == null)) ? "Not available" : ruleArns.get("UpdateFrontendServiceEventRuleArn")); cloudFormationResponder.addKeyValueOutputsPair("PrewarmerEventRuleArn", (requestType.equals("Delete") || (ruleArns == null)) ? "Not available" : ruleArns.get("PrewarmerEventRuleArn")); cloudFormationResponder.sendResponse(responseStatus, logger); } }