{
  "Comment": "A description of my state machine",
  "StartAt": "Archive raw and datalake files",
  "States": {
    "Archive raw and datalake files": {
      "Type": "Parallel",
      "Next": "ddb to raw",
      "Branches": [
        {
          "StartAt": "Archive raw files",
          "States": {
            "Archive raw files": {
              "Type": "Task",
              "Resource": "arn:aws:states:::glue:startJobRun.sync",
              "Parameters": {
                "JobName": "[ARCHIVE_JOB]",
                "Arguments": {
                  "--SOURCE_BUCKET": "[S3-RAW-BUCKET]",
                  "--TARGET_BUCKET": "[S3-RAW-ARCHIVE-BUCKET]"
                }
              },
              "End": true
            }
          }
        },
        {
          "StartAt": "Archive data lake files",
          "States": {
            "Archive data lake files": {
              "Type": "Task",
              "Resource": "arn:aws:states:::glue:startJobRun.sync",
              "Parameters": {
                "JobName": "[ARCHIVE_JOB]",
                "Arguments": {
                  "--SOURCE_BUCKET": "[S3-DATALAKE-BUCKET]",
                  "--TARGET_BUCKET": "[S3-DATALAKE-ARCHIVE-BUCKET]"
                }
              },
              "End": true
            }
          }
        }
      ]
    },
    "ddb to raw": {
      "Type": "Task",
      "Resource": "arn:aws:states:::glue:startJobRun.sync",
      "Parameters": {
        "JobName": "[DDB_EXPORT_RAW_JOB]"
      },
      "Next": "raw to datalake"
    },
    "raw to datalake": {
      "Type": "Task",
      "Resource": "arn:aws:states:::glue:startJobRun",
      "Parameters": {
        "JobName": "[RAW_TO_DATALAKE_JOB]"
      },
      "Next": "Truncate landing tables"
    },
     "Truncate landing tables": {
      "Type": "Task",
      "Parameters": {
        "ClusterIdentifier": "[REDSHIFT-CLUSTER-IDENTIFIER]",
        "Database": "[REDSHIFT-DATABASE]",
        "DbUser": "awsuser",
        "Sql": "call staging.truncate_landing_tables()"
      },
      "Resource": "arn:aws:states:::aws-sdk:redshiftdata:executeStatement",
      "Next": "Wait truncate table"
    },
     "Wait truncate table": {
      "Type": "Wait",
      "Seconds": 5,
      "Next": "Land Data Lake partitions in Redshift"
    },
    "Land Data Lake partitions in Redshift": {
      "Type": "Parallel",
      "Next": "Staging Dimensions",
      "Branches": [
        {
          "StartAt": "landing schema - load product",
          "States": {
            "landing schema - load product": {
              "Type": "Task",
              "Resource": "arn:aws:states:::glue:startJobRun.sync",
              "Parameters": {
                "JobName": "[LAND_PRODUCT_JOB]"
              },
              "End": true
            }
          }
        },
        {
          "StartAt": "landing schema - load customer",
          "States": {
            "landing schema - load customer": {
              "Type": "Task",
              "Resource": "arn:aws:states:::glue:startJobRun.sync",
              "Parameters": {
                "JobName": "[LAND_CUSTOMER_JOB]"
              },
              "End": true
            }
          }
        },
        {
          "StartAt": "landing schema - load address",
          "States": {
            "landing schema - load address": {
              "Type": "Task",
              "Resource": "arn:aws:states:::glue:startJobRun.sync",
              "Parameters": {
                "JobName": "[LAND_ADDRESS_JOB]"
              },
              "End": true
            }
          }
        },
        {
          "StartAt": "landing schema - load order",
          "States": {
            "landing schema - load order": {
              "Type": "Task",
              "Resource": "arn:aws:states:::glue:startJobRun.sync",
              "Parameters": {
                "JobName": "[LAND_ORDER_JOB]"
              },
              "End": true
            }
          }
        }
      ]
    },
    "Staging Dimensions": {
      "Type": "Parallel",
      "Branches": [
        {
          "StartAt": "stage customer",
          "States": {
            "stage customer": {
              "Type": "Task",
              "Parameters": {
                "ClusterIdentifier": "[REDSHIFT-CLUSTER-IDENTIFIER]",
                "Database": "[REDSHIFT-DATABASE]",
                "DbUser": "awsuser",
                "Sql": "call staging.load_customer()"
              },
              "Resource": "arn:aws:states:::aws-sdk:redshiftdata:executeStatement",
              "Next": "check stage customer status"
            },
            "check stage customer status": {
              "Type": "Task",
              "Next": "stage customer Choice",
              "Parameters": {
                "Id.$": "$.Id"
              },
              "Resource": "arn:aws:states:::aws-sdk:redshiftdata:describeStatement"
            },
            "stage customer Choice": {
              "Type": "Choice",
              "Choices": [
                {
                  "Variable": "$.Status",
                  "StringEquals": "FINISHED",
                  "Next": "Success stage customer"
                },
                {
                  "Variable": "$.Status",
                  "StringEquals": "FAILED",
                  "Next": "Fail stage customer"
                }
              ],
              "Default": "Wait stage customer"
            },
            "Wait stage customer": {
              "Type": "Wait",
              "Seconds": 30,
              "Next": "check stage customer status"
            },
            "Success stage customer": {
              "Type": "Succeed"
            },
            "Fail stage customer": {
              "Type": "Fail"
            }
          }
        },
        {
          "StartAt": "stage address",
          "States": {
            "stage address": {
              "Type": "Task",
              "Parameters": {
                "ClusterIdentifier": "[REDSHIFT-CLUSTER-IDENTIFIER]",
                "Database": "[REDSHIFT-DATABASE]",
                "DbUser": "awsuser",
                "Sql": "call staging.load_address()"
              },
              "Resource": "arn:aws:states:::aws-sdk:redshiftdata:executeStatement",
              "Next": "check stage address status"
            },
            "check stage address status": {
              "Type": "Task",
              "Parameters": {
                "Id.$": "$.Id"
              },
              "Resource": "arn:aws:states:::aws-sdk:redshiftdata:describeStatement",
              "Next": "stage address choice"
            },
            "stage address choice": {
              "Type": "Choice",
              "Choices": [
                {
                  "Variable": "$.Status",
                  "StringEquals": "FINISHED",
                  "Next": "Success stage address"
                },
                {
                  "Variable": "$.Status",
                  "StringEquals": "FAILED",
                  "Next": "Fail stage address"
                }
              ],
              "Default": "Wait stage address"
            },
            "Success stage address": {
              "Type": "Succeed"
            },
            "Wait stage address": {
              "Type": "Wait",
              "Seconds": 30,
              "Next": "check stage address status"
            },
            "Fail stage address": {
              "Type": "Fail"
            }
          }
        },
        {
          "StartAt": "Stage Product",
          "States": {
            "Stage Product": {
              "Type": "Task",
              "Parameters": {
                "ClusterIdentifier": "[REDSHIFT-CLUSTER-IDENTIFIER]",
                "Database": "[REDSHIFT-DATABASE]",
                "DbUser": "awsuser",
                "Sql": "call staging.load_product()"
              },
              "Resource": "arn:aws:states:::aws-sdk:redshiftdata:executeStatement",
              "Next": "check stage product status"
            },
            "check stage product status": {
              "Type": "Task",
              "Parameters": {
                "Id.$": "$.Id"
              },
              "Resource": "arn:aws:states:::aws-sdk:redshiftdata:describeStatement",
              "Next": "stage product choice"
            },
            "stage product choice": {
              "Type": "Choice",
              "Choices": [
                {
                  "Variable": "$.Status",
                  "StringEquals": "FINISHED",
                  "Next": "Success stage product"
                },
                {
                  "Variable": "$.Status",
                  "StringEquals": "FAILED",
                  "Next": "Fail stage product"
                }
              ],
              "Default": "Wait stage product"
            },
            "Success stage product": {
              "Type": "Succeed"
            },
            "Wait stage product": {
              "Type": "Wait",
              "Seconds": 30,
              "Next": "check stage product status"
            },
            "Fail stage product": {
              "Type": "Fail"
            }
          }
        },
        {
          "StartAt": "stage date",
          "States": {
            "stage date": {
              "Type": "Task",
              "Parameters": {
                "ClusterIdentifier": "[REDSHIFT-CLUSTER-IDENTIFIER]",
                "Database": "[REDSHIFT-DATABASE]",
                "DbUser": "awsuser",
                "Sql": "call staging.load_date()"
              },
              "Resource": "arn:aws:states:::aws-sdk:redshiftdata:executeStatement",
              "Next": "check stage date status"
            },
            "check stage date status": {
              "Type": "Task",
              "Parameters": {
                "Id.$": "$.Id"
              },
              "Resource": "arn:aws:states:::aws-sdk:redshiftdata:describeStatement",
              "Next": "stage date choice"
            },
            "stage date choice": {
              "Type": "Choice",
              "Choices": [
                {
                  "Variable": "$.Status",
                  "StringEquals": "FINISHED",
                  "Next": "Success stage date"
                },
                {
                  "Variable": "$.Status",
                  "StringEquals": "FAILED",
                  "Next": "Fail stage date"
                }
              ],
              "Default": "Wait stage date"
            },
            "Success stage date": {
              "Type": "Succeed"
            },
            "Wait stage date": {
              "Type": "Wait",
              "Seconds": 30,
              "Next": "check stage date status"
            },
            "Fail stage date": {
              "Type": "Fail"
            }
          }
        }
      ],
      "Next": "Stage Order Dimension"
    },
    "Stage Order Dimension": {
      "Type": "Parallel",
      "Next": "DWH Dimensions",
      "Branches": [
        {
          "StartAt": "stage order",
          "States": {
            "stage order": {
              "Type": "Task",
              "Parameters": {
                "ClusterIdentifier": "[REDSHIFT-CLUSTER-IDENTIFIER]",
                "Database": "[REDSHIFT-DATABASE]",
                "DbUser": "awsuser",
                "Sql": "call staging.load_order()"
              },
              "Resource": "arn:aws:states:::aws-sdk:redshiftdata:executeStatement",
              "Next": "check stage order status"
            },
            "check stage order status": {
              "Type": "Task",
              "Parameters": {
                "Id.$": "$.Id"
              },
              "Resource": "arn:aws:states:::aws-sdk:redshiftdata:describeStatement",
              "Next": "stage order choice"
            },
            "stage order choice": {
              "Type": "Choice",
              "Choices": [
                {
                  "Variable": "$.Status",
                  "StringEquals": "FINISHED",
                  "Next": "Success"
                },
                {
                  "Variable": "$.Status",
                  "StringEquals": "FAILED",
                  "Next": "Fail"
                }
              ],
              "Default": "Wait stage order"
            },
            "Success": {
              "Type": "Succeed"
            },
            "Wait stage order": {
              "Type": "Wait",
              "Seconds": 30,
              "Next": "check stage order status"
            },
            "Fail": {
              "Type": "Fail"
            }
          }
        }
      ]
    },
    "DWH Dimensions": {
      "Type": "Parallel",
      "Next": "DWH Order",
      "Branches": [
        {
          "StartAt": "DWH Customer",
          "States": {
            "DWH Customer": {
              "Type": "Task",
              "Parameters": {
                "ClusterIdentifier": "[REDSHIFT-CLUSTER-IDENTIFIER]",
                "Database": "[REDSHIFT-DATABASE]",
                "DbUser": "awsuser",
                "Sql": "call dwh.load_customer()"
              },
              "Resource": "arn:aws:states:::aws-sdk:redshiftdata:executeStatement",
              "Next": "check DWH customer status"
            },
            "check DWH customer status": {
              "Type": "Task",
              "Parameters": {
                "Id.$": "$.Id"
              },
              "Resource": "arn:aws:states:::aws-sdk:redshiftdata:describeStatement",
              "Next": "DWH customer Choice"
            },
            "DWH customer Choice": {
              "Type": "Choice",
              "Choices": [
                {
                  "Variable": "$.Status",
                  "StringEquals": "FINISHED",
                  "Next": "Success DWH customer"
                },
                {
                  "Variable": "$.Status",
                  "StringEquals": "FAILED",
                  "Next": "Fail DWH customer"
                }
              ],
              "Default": "Wait DWH customer"
            },
            "Success DWH customer": {
              "Type": "Succeed"
            },
            "Wait DWH customer": {
              "Type": "Wait",
              "Seconds": 30,
              "Next": "check DWH customer status"
            },
            "Fail DWH customer": {
              "Type": "Fail"
            }
          }
        },
        {
          "StartAt": "DWH Address",
          "States": {
            "DWH Address": {
              "Type": "Task",
              "Parameters": {
                "ClusterIdentifier": "[REDSHIFT-CLUSTER-IDENTIFIER]",
                "Database": "[REDSHIFT-DATABASE]",
                "DbUser": "awsuser",
                "Sql": "call dwh.load_address()"
              },
              "Resource": "arn:aws:states:::aws-sdk:redshiftdata:executeStatement",
              "Next": "check DWH address status"
            },
            "check DWH address status": {
              "Type": "Task",
              "Parameters": {
                "Id.$": "$.Id"
              },
              "Resource": "arn:aws:states:::aws-sdk:redshiftdata:describeStatement",
              "Next": "DWH address Choice"
            },
            "DWH address Choice": {
              "Type": "Choice",
              "Choices": [
                {
                  "Variable": "$.Status",
                  "StringEquals": "FINISHED",
                  "Next": "Success DWH address"
                },
                {
                  "Variable": "$.Status",
                  "StringEquals": "FAILED",
                  "Next": "Fail DWH address"
                }
              ],
              "Default": "Wait DWH address"
            },
            "Success DWH address": {
              "Type": "Succeed"
            },
            "Wait DWH address": {
              "Type": "Wait",
              "Seconds": 30,
              "Next": "check DWH address status"
            },
            "Fail DWH address": {
              "Type": "Fail"
            }
          }
        },
        {
          "StartAt": "DWH Product",
          "States": {
            "DWH Product": {
              "Type": "Task",
              "Parameters": {
                "ClusterIdentifier": "[REDSHIFT-CLUSTER-IDENTIFIER]",
                "Database": "[REDSHIFT-DATABASE]",
                "DbUser": "awsuser",
                "Sql": "call dwh.load_product()"
              },
              "Resource": "arn:aws:states:::aws-sdk:redshiftdata:executeStatement",
              "Next": "check DWH product status"
            },
            "check DWH product status": {
              "Type": "Task",
              "Parameters": {
                "Id.$": "$.Id"
              },
              "Resource": "arn:aws:states:::aws-sdk:redshiftdata:describeStatement",
              "Next": "DWH product Choice"
            },
            "DWH product Choice": {
              "Type": "Choice",
              "Choices": [
                {
                  "Variable": "$.Status",
                  "StringEquals": "FINISHED",
                  "Next": "Success DWH product"
                },
                {
                  "Variable": "$.Status",
                  "StringEquals": "FAILED",
                  "Next": "Fail DWH product"
                }
              ],
              "Default": "Wait DWH product"
            },
            "Success DWH product": {
              "Type": "Succeed"
            },
            "Wait DWH product": {
              "Type": "Wait",
              "Seconds": 30,
              "Next": "check DWH product status"
            },
            "Fail DWH product": {
              "Type": "Fail"
            }
          }
        },
        {
          "StartAt": "DWH Date",
          "States": {
            "DWH Date": {
              "Type": "Task",
              "Parameters": {
                "ClusterIdentifier": "[REDSHIFT-CLUSTER-IDENTIFIER]",
                "Database": "[REDSHIFT-DATABASE]",
                "DbUser": "awsuser",
                "Sql": "call dwh.load_date()"
              },
              "Resource": "arn:aws:states:::aws-sdk:redshiftdata:executeStatement",
              "Next": "check DWH date status"
            },
            "check DWH date status": {
              "Type": "Task",
              "Parameters": {
                "Id.$": "$.Id"
              },
              "Resource": "arn:aws:states:::aws-sdk:redshiftdata:describeStatement",
              "Next": "DWH date Choice"
            },
            "DWH date Choice": {
              "Type": "Choice",
              "Choices": [
                {
                  "Variable": "$.Status",
                  "StringEquals": "FINISHED",
                  "Next": "Success DWH date"
                },
                {
                  "Variable": "$.Status",
                  "StringEquals": "FAILED",
                  "Next": "Fail DWH date"
                }
              ],
              "Default": "Wait DWH date"
            },
            "Wait DWH date": {
              "Type": "Wait",
              "Seconds": 30,
              "Next": "check DWH date status"
            },
            "Success DWH date": {
              "Type": "Succeed"
            },
            "Fail DWH date": {
              "Type": "Fail"
            }
          }
        }
      ]
    },
    "DWH Order": {
      "Type": "Task",
      "Parameters": {
        "ClusterIdentifier": "[REDSHIFT-CLUSTER-IDENTIFIER]",
        "Database": "[REDSHIFT-DATABASE]",
        "DbUser": "awsuser",
        "Sql": "call dwh.load_order()"
      },
      "Resource": "arn:aws:states:::aws-sdk:redshiftdata:executeStatement",
      "Next": "check DWH order status"
    },
    "check DWH order status": {
      "Type": "Task",
      "Next": "Choice DWH order",
      "Parameters": {
        "Id.$": "$.Id"
      },
      "Resource": "arn:aws:states:::aws-sdk:redshiftdata:describeStatement"
    },
    "Choice DWH order": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.Status",
          "StringEquals": "FINISHED",
          "Next": "Success DWH order"
        },
        {
          "Variable": "$.Status",
          "StringEquals": "FAILED",
          "Next": "Fail DWH order"
        }
      ],
      "Default": "Wait DWH order"
    },
    "Success DWH order": {
      "Type": "Succeed"
    },
    "Wait DWH order": {
      "Type": "Wait",
      "Seconds": 30,
      "Next": "check DWH order status"
    },
    "Fail DWH order": {
      "Type": "Fail"
    }
  }
}