{
  "StartAt": "AvScan",
  "States": {
    "AvScan": {
      "Type": "Task",
      "Resource": "${av_scan_lambda_arn}",
      "Retry": [
        {
          "ErrorEquals": [
            "States.Timeout"
          ],
          "IntervalSeconds": 60,
          "MaxAttempts": 3,
          "BackoffRate": 2
        }
      ],
      "Next": "AvScanCheck",
      "ResultPath": "$.avscan"
    },
    "AvScanCheck": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.avscan.has_virus",
          "BooleanEquals": false,
          "Next": "Validation"
        },
        {
          "Variable": "$.avscan.has_virus",
          "BooleanEquals": true,
          "Next": "FailStateFinal"
        }
      ]
    },
    "Validation": {
      "Parameters": {
        "bucket.$": "$.detail.requestParameters.bucketName",
        "key.$": "$.detail.requestParameters.key"
      },
      "Type": "Task",
      "Resource": "${validation_lambda_arn}",
      "Retry": [
        {
          "ErrorEquals": [
            "States.Timeout"
          ],
          "IntervalSeconds": 60,
          "MaxAttempts": 3,
          "BackoffRate": 2
        }
      ],
      "Next": "ProcessCsv"
    },
    "ProcessCsv": {
      "Type": "Map",
      "InputPath": "$",
      "ItemsPath": "$",
      "MaxConcurrency": 200,
      "Iterator": {
        "StartAt": "Submission",
        "States": {
          "Submission": {
            "Type": "Task",
            "Resource": "${submission_lambda_arn}",
            "HeartbeatSeconds": 60,
            "TimeoutSeconds": 3600,
            "Retry": [
              {
                "ErrorEquals": [
                  "States.Timeout",
                  "Lambda.ServiceException",
                  "Lambda.AWSLambdaException",
                  "Lambda.SdkClientException",
                  "Lambda.TooManyRequestsException"
                ],
                "IntervalSeconds": 5,
                "MaxAttempts": 5,
                "BackoffRate": 3
              }
            ],
            "Catch": [
              {
                "ErrorEquals": [
                  "States.ALL"
                ],
                "Next": "FailState",
                "ResultPath": "$.errors"
              }
            ],
            "End": true
          },
          "FailState": {
            "Type": "Fail"
          }
        }
      },
      "End": true
    },
    "FailStateFinal": {
      "Type": "Fail"
    }
  }
}