Example usage for com.amazonaws.services.cloudwatchevents.model ListTargetsByRuleRequest ListTargetsByRuleRequest

List of usage examples for com.amazonaws.services.cloudwatchevents.model ListTargetsByRuleRequest ListTargetsByRuleRequest

Introduction

In this page you can find the example usage for com.amazonaws.services.cloudwatchevents.model ListTargetsByRuleRequest ListTargetsByRuleRequest.

Prototype

ListTargetsByRuleRequest

Source Link

Usage

From source file:squash.deployment.lambdas.ScheduledCloudwatchEventCustomResourceLambda.java

License:Apache License

/**
 * Implementation for the AWS Lambda function backing the CloudwatchEvents resource.
 * //from  ww  w .ja  va 2s.  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);
    }
}