Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to make a AWS step function wait a configurable amount of time?

This is a snippet of the CloudFormation for my state machine that is supposed to wait a configurable amount of time before invoking a lambda function.

  StepFunctionsStateMachine:
    Type: AWS::StepFunctions::StateMachine
    Properties:
      StateMachineName: userNotificationPipeline
      DefinitionString: !Sub |
        {
          "Comment": "A description of my state machine",
          "StartAt": "Wait",
          "States": {
            "Wait": {
              "Type": "Wait",
              "Seconds": $.Input.Timer,
              "Next": "Lambda Invoke"
            },
            "Lambda Invoke": {
              "Type": "Task",
              "Resource": "arn:aws:states:::lambda:invoke",
              "OutputPath": "$.Payload",
              "Parameters": {
                "FunctionName": "endUserNotificationReminder",
                "Payload.$": "$"
              },
              "End": true
            }
          }
        }

When building, I run into this error. It looks like it doesn’t like the $.Input.Timer because $ is not a JSON token:

1 validation error detected: Value 'Invalid State Machine Definition: 'INVALID_JSON_DESCRIPTION: Unrecognized token '$': was expecting (JSON String, Number, Array, Object or token 'null', 'true' or 'false') at [Source: (String)"{ "Comment": "A description of my state machine", "StartAt": "Wait", "States": { "Wait": { "Type": "Wait", "Seconds": $.Input.Timer, "Next": "Lambda Invoke" }, "Lambda Invoke": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "FunctionName": "endUserNotificationReminder", "Payload.$": "$" }, "End": true } } } "; line: 7, column: 19] at [Source: (String)"{ "Comment": "A description of my state machine", "StartAt": "Wait", "States": { "Wait": { "Type": "Wait", "Seconds": $.Input.Timer, "Next": "Lambda Invoke" }, "Lambda Invoke": { "Type": "Task", "Resource": "arn:aws:states:::lambda:invoke", "OutputPath": "$.Payload", "Parameters": { "FunctionName": "endUserNotificationReminder", "Payload.$": "$" }, "End": true } } } "; line: 7, column: 19]' (Service: AWSStepFunctions; Status Code: 400; Error Code: InvalidDefinition; Request ID: c561eced-0644-462a-a88a-0457b82ec23b; Proxy: null)' at 'statusMessage' failed to satisfy constraint: Member must have length less than or equal to 1024

I came across this question which had a similar problem, and the solution was to put quotes around the $.Input.Timer, but that didn’t work for me because the Wait state expects the value of "Seconds" to be an integer, not a string:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

Resource handler returned message: "Invalid State Machine Definition: 'SCHEMA_VALIDATION_FAILED: Expected value of type Integer at /States/Wait/Seconds' (Service: AWSStepFunctions; Status Code: 400; Error Code: InvalidDefinition; Request ID: fe1a8fb2-dcc1-4a35-ab66-441753e001c1; Proxy: null)" (RequestToken: a380c94f-153c-09ba-9bbb-583a83bf2019, HandlerErrorCode: InvalidRequest)

What do I need to do to make $.Input.Timer get past the JSON parser and be treated as an integer?

>Solution :

The value of Seconds must be a positive integer. To specify a value from the state input with JSONPath, use SecondsPath instead.

"Wait": {
  "Type": "Wait",
  "SecondsPath": "$.Input.Timer",
  "Next": "Lambda Invoke"
}

https://docs.aws.amazon.com/step-functions/latest/dg/amazon-states-language-wait-state.html

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading