{
  "StartAt": "Generate Manifest File",
  "States": {
    "Generate Manifest File": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke.waitForTaskToken",
      "Parameters": {
        "FunctionName": "${GenerateManifestFileFunctionName}:$LATEST",
        "Payload": {
          "TaskToken.$": "$$.Task.Token"
        }
      },
      "Retry": [
        {
          "ErrorEquals": [
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException"
          ],
          "IntervalSeconds": 2,
          "MaxAttempts": 6,
          "BackoffRate": 2
        }
      ],
      "Next": "Verify Results"
    },
    "Verify Results": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.manifestfilepath",
          "StringEquals": "none",
          "Next": "No data to load"
        }
      ],
      "Default": "Execute ELT process"
    },
    "No data to load": {
      "Type": "Succeed"
    },
    "Execute ELT process": {
      "Type": "Task",
      "Parameters": {
        "ClusterIdentifier": "${RedshiftClusterIdentifier}",
        "Database": "dev",
        "DbUser": "${MasterUserName}",
        "Parameters": [
          {
            "Name": "filename",
            "Value.$": "$.manifestfilepath"
          },
          {
            "Name": "bucketname",
            "Value.$": "$.bucketname"
          }
        ],
        "Sql": "call blogdemo_proc.elt_rideshare(:bucketname,:filename)"
      },
      "Resource": "arn:aws:states:::aws-sdk:redshiftdata:executeStatement",
      "Next": "Verify ELT status"
    },
    "Verify ELT status": {
      "Type": "Task",
      "Parameters": {
        "Id.$": "$.Id"
      },
      "Resource": "arn:aws:states:::aws-sdk:redshiftdata:describeStatement",
      "Next": "Get ELT Status"
    },
    "Get ELT Status": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.Status",
          "StringMatches": "FINISHED",
          "Next": "Success"
        },
        {
          "Variable": "$.Status",
          "StringMatches": "FAILED",
          "Next": "Fail"
        }
      ],
      "Default": "Wait"
    },
    "Success": {
      "Type": "Succeed"
    },
    "Wait": {
      "Type": "Wait",
      "Seconds": 5,
      "Next": "Verify ELT status"
    },
    "Fail": {
      "Type": "Fail"
    }
  }
}