Search code examples
javaamazon-web-servicesamazon-cloudwatchjob-schedulingaws-java-sdk

Issues with AWS CloudWatchEvents PutRuleRequest


I am in the process of writing a simple program where I want to execute a job only 1 time. I looked at Amazon's Cloudwatch events and, couples with AWS Lambda, this fits nicely with my requirement.

Im using the Java AWS SDK (version 1.11.711) to create rules dynamically from the code.

Here is my pseudo code to generate a PutResultRequest :

        final PutRuleRequest putRuleRequest = new PutRuleRequest().withName("new_rule_name").withDescription("my first rule")
                                                                  .withScheduleExpression("0 11 24 * ? 2020").withState(RuleState.ENABLED);

This cron expression is shown as Invalid on cronmaker but shows me next execution date when I put this in cloudwatch schedule on the UI.

Cronmaker : enter image description here

Cloudwatch : enter image description here

The SDK gives me an error for even this expression 0 17 24 * ? 2020

Stack trace of the errors is as follows -

Exception in thread "main" com.amazonaws.services.cloudwatchevents.model.AmazonCloudWatchEventsException: Parameter ScheduleExpression is not valid. (Service: AmazonCloudWatchEvents; Status Code: 400; Error Code: ValidationException; Request ID: dd5dc5fb-a209-4ddb-ad58-4e468843149d)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleErrorResponse(AmazonHttpClient.java:1742)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleServiceErrorResponse(AmazonHttpClient.java:1371)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1347)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1127)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:784)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:752)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:726)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:686)
    at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:668)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:532)
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:512)
    at com.amazonaws.services.cloudwatchevents.AmazonCloudWatchEventsClient.doInvoke(AmazonCloudWatchEventsClient.java:2685)
    at com.amazonaws.services.cloudwatchevents.AmazonCloudWatchEventsClient.invoke(AmazonCloudWatchEventsClient.java:2652)
    at com.amazonaws.services.cloudwatchevents.AmazonCloudWatchEventsClient.invoke(AmazonCloudWatchEventsClient.java:2641)
    at com.amazonaws.services.cloudwatchevents.AmazonCloudWatchEventsClient.executePutRule(AmazonCloudWatchEventsClient.java:2031)
    at com.amazonaws.services.cloudwatchevents.AmazonCloudWatchEventsClient.putRule(AmazonCloudWatchEventsClient.java:2002)
Disconnected from the target VM, address: '127.0.0.1:63315', transport: 'socket'

Process finished with exit code 1

What am i doing wrong ?


Solution

  • Can you please try -

    .withScheduleExpression("cron(0 11 24 * ? 2020)")

    https://docs.aws.amazon.com/cli/latest/reference/events/put-rule.html

    https://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/cloudwatchevents/model/PutRuleRequest.html