{
  "Comment": "Manage Snapshot Lifecycle for an RDS Database",
  "StartAt": "CheckIfDelayTimeSet",
  "States": {
    "CheckIfDelayTimeSet": {
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.delay.seconds",
          "IsPresent": true,
          "Next": "Wait"
        }
      ],
      "Default": "SetRandomDelayTime"
    },
    "SetRandomDelayTime": {
      "Type": "Pass",
      "Next": "Wait",
      "Parameters": {
        "seconds.$": "States.MathRandom(0,3600)"
      },
      "ResultPath": "$.delay"
    },
    "Wait": {
      "Type": "Wait",
      "SecondsPath": "$.delay.seconds",
      "Next": "ExtractNativeConfiguration"
    },
    "ExtractNativeConfiguration": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "${lambda_extract_native_configuration_arn}",
        "Payload": {
          "db_name.$": "$.db_name",
          "db_type.$": "$.db_type",
          "source_account_id.$": "$.source_account_id"
        }
      },
      "TimeoutSeconds": 900,
      "Retry": [
        {
          "ErrorEquals": [
            "States.Timeout",
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException",
            "Lambda.TooManyRequestsException"
          ],
          "IntervalSeconds": 60,
          "MaxAttempts": 3,
          "BackoffRate": 2
        }
      ],
      "Credentials": {
        "RoleArn": "${lambda_invoke_role_arn}"
      },
      "ResultPath": "$.native_configuration_result",
      "Next": "CreateShareableSnapshot"
    },
    "CreateShareableSnapshot": {
      "Type": "Task",
      "Resource": "arn:aws:states:::ecs:runTask.waitForTaskToken",
      "TimeoutSeconds": 7200,
      "Parameters": {
        "LaunchType":"FARGATE",
        "Cluster":"${create_shareable_snapshot_fargate_cluster_arn}",
        "TaskDefinition":"${create_shareable_snapshot_fargate_task_definition_arn}",
        "NetworkConfiguration": {
          "AwsvpcConfiguration": {
            "Subnets": ${fargate_task_subnets},
            "AssignPublicIp": "DISABLED",
            "SecurityGroups": ["${create_shareable_snapshot_fargate_task_security_group}"]
          }
        },
        "Overrides":{
            "ContainerOverrides": [
              {
                  "Name": "rds-backup-create-shareable-snapshot",
                  "Environment":[
                    {
                      "Name":"DB_NAME",
                      "Value.$":"$.db_name"
                    },
                    {
                      "Name":"DB_TYPE",
                      "Value.$":"$.db_type"
                    },
                    {
                      "Name":"EXECUTION_ID",
                      "Value.$":"$$.Execution.Id"
                    },
                    {
                      "Name":"SOURCE_ACCOUNT_ID",
                      "Value.$":"$.source_account_id"
                    },
                    {
                      "Name":"TASK_TOKEN",
                      "Value.$":"$$.Task.Token"
                    }
                  ]
              }
            ]
        }
      },
      "Retry": [
        {
          "ErrorEquals": [
            "States.Timeout",
            "ECS.AmazonECSException"
          ],
          "IntervalSeconds": 60,
          "MaxAttempts": 3,
          "BackoffRate": 3
        }
      ],
      "ResultPath": "$.source_snapshot_name",
      "Next": "ManageBackupSnapshots"
    },
    "ManageBackupSnapshots": {
      "Type": "Task",
      "Resource": "arn:aws:states:::ecs:runTask.waitForTaskToken",
      "TimeoutSeconds": 7200,
      "Parameters":{
        "LaunchType":"FARGATE",
        "Cluster":"${manage_backup_snapshots_fargate_cluster_arn}",
        "TaskDefinition":"${manage_backup_snapshots_fargate_task_definition_arn}",
        "NetworkConfiguration": {
          "AwsvpcConfiguration": {
            "Subnets": ${fargate_task_subnets},
            "AssignPublicIp": "DISABLED",
            "SecurityGroups": ["${manage_backup_snapshots_fargate_task_security_group}"]
          }
        },
        "Overrides":{
            "ContainerOverrides": [
              {
                  "Name": "rds-backup-manage-backup-snapshots",
                  "Environment":[
                    {
                      "Name":"DB_NAME",
                      "Value.$":"$.db_name"
                    },
                    {
                      "Name":"DB_TYPE",
                      "Value.$":"$.db_type"
                    },
                    {
                      "Name":"SOURCE_ACCOUNT_ID",
                      "Value.$":"$.source_account_id"
                    },
                    {
                      "Name":"SOURCE_SNAPSHOT_NAME",
                      "Value.$":"$.source_snapshot_name"
                    },
                    {
                      "Name":"TASK_TOKEN",
                      "Value.$":"$$.Task.Token"
                    }
                  ]
              }
            ]
        }
      },
      "Retry": [
        {
          "ErrorEquals": [
            "States.Timeout",
            "ECS.AmazonECSException"
          ],
          "IntervalSeconds": 60,
          "MaxAttempts": 3,
          "BackoffRate": 3
        }
      ],
      "ResultPath": null,
      "Next": "DeleteIntermediateSnapshots"
    },
    "DeleteIntermediateSnapshots": {
      "Type": "Task",
      "Resource": "arn:aws:states:::lambda:invoke",
      "Parameters": {
        "FunctionName": "${lambda_delete_intermediate_snapshots_name}",
        "Payload": {
          "db_name.$": "$.db_name",
          "db_type.$": "$.db_type",
          "execution_id.$": "$$.Execution.Id",
          "source_account_id.$": "$.source_account_id"
        }
      },
      "TimeoutSeconds": 900,
      "Retry": [
        {
          "ErrorEquals": [
            "States.Timeout",
            "Lambda.ServiceException",
            "Lambda.AWSLambdaException",
            "Lambda.SdkClientException",
            "Lambda.TooManyRequestsException"
          ],
          "IntervalSeconds": 60,
          "MaxAttempts": 5,
          "BackoffRate": 3
        }
      ],
      "End": true
    }
  }
}
