Bulk Content Ingest

Processes a batch of content items concurrently using a Map state (up to 5 at a time). Each item is independently validated, moderation-screened, and license-checked in parallel branches before being queued for transcoding or rejected.
{
  "Comment": "Bulk content ingest: processes an array of content items concurrently (Map, max 5), with moderation and license checks in parallel (Parallel) per item before queuing for transcode or rejecting.",
  "StartAt": "ProcessContentBatch",
  "States": {
    "ProcessContentBatch": {
      "Type": "Map",
      "Comment": "Process each content item in the batch, up to 5 at a time.",
      "ItemsPath": "$.items",
      "MaxConcurrency": 5,
      "ItemProcessor": {
        "ProcessorConfig": {
          "Mode": "INLINE"
        },
        "StartAt": "ValidateItem",
        "States": {
          "ValidateItem": {
            "Type": "Task",
            "Resource": "arn:aws:states:::lambda:invoke",
            "Parameters": {
              "FunctionName": "${ValidateContentFunctionArn}",
              "Payload.$": "$"
            },
            "ResultPath": "$.validation",
            "Retry": [
              {
                "ErrorEquals": [
                  "Lambda.ServiceException",
                  "Lambda.AWSLambdaException",
                  "Lambda.SdkClientException"
                ],
                "IntervalSeconds": 2,
                "MaxAttempts": 2,
                "BackoffRate": 2
              }
            ],
            "Catch": [
              {
                "ErrorEquals": [
                  "States.ALL"
                ],
                "ResultPath": "$.error",
                "Next": "ItemValidationError"
              }
            ],
            "Next": "IsItemValid"
          },
          "IsItemValid": {
            "Type": "Choice",
            "Choices": [
              {
                "Variable": "$.validation.Payload.isValid",
                "BooleanEquals": true,
                "Next": "EnrichItem"
              }
            ],
            "Default": "RejectInvalidItem"
          },
          "RejectInvalidItem": {
            "Type": "Task",
            "Resource": "arn:aws:states:::lambda:invoke",
            "Parameters": {
              "FunctionName": "${RejectContentFunctionArn}",
              "Payload": {
                "reason": "INVALID_METADATA",
                "content.$": "$"
              }
            },
            "ResultPath": "$.rejection",
            "End": true
          },
          "ItemValidationError": {
            "Type": "Fail",
            "Error": "ValidationError",
            "Cause": "Content validation lambda failed unexpectedly"
          },
          "EnrichItem": {
            "Type": "Task",
            "Resource": "arn:aws:states:::lambda:invoke",
            "Parameters": {
              "FunctionName": "${EnrichMetadataFunctionArn}",
              "Payload.$": "$"
            },
            "ResultPath": "$.enriched",
            "Retry": [
              {
                "ErrorEquals": [
                  "States.ALL"
                ],
                "IntervalSeconds": 2,
                "MaxAttempts": 2,
                "BackoffRate": 2
              }
            ],
            "Catch": [
              {
                "ErrorEquals": [
                  "States.ALL"
                ],
                "ResultPath": "$.error",
                "Next": "ItemEnrichmentError"
              }
            ],
            "Next": "ParallelComplianceScreening"
          },
          "ItemEnrichmentError": {
            "Type": "Fail",
            "Error": "EnrichmentError",
            "Cause": "Metadata enrichment lambda failed"
          },
          "ParallelComplianceScreening": {
            "Type": "Parallel",
            "Comment": "Run moderation and license checks concurrently for this item.",
            "Branches": [
              {
                "StartAt": "ItemModerationCheck",
                "States": {
                  "ItemModerationCheck": {
                    "Type": "Task",
                    "Resource": "arn:aws:states:::lambda:invoke",
                    "Parameters": {
                      "FunctionName": "${ContentModerationFunctionArn}",
                      "Payload.$": "$.enriched.Payload"
                    },
                    "End": true
                  }
                }
              },
              {
                "StartAt": "ItemLicenseCheck",
                "States": {
                  "ItemLicenseCheck": {
                    "Type": "Task",
                    "Resource": "arn:aws:states:::lambda:invoke",
                    "Parameters": {
                      "FunctionName": "${LicenseCheckFunctionArn}",
                      "Payload.$": "$.enriched.Payload"
                    },
                    "End": true
                  }
                }
              }
            ],
            "ResultPath": "$.compliance",
            "Catch": [
              {
                "ErrorEquals": [
                  "States.ALL"
                ],
                "ResultPath": "$.error",
                "Next": "ItemComplianceError"
              }
            ],
            "Next": "IsItemCompliant"
          },
          "ItemComplianceError": {
            "Type": "Fail",
            "Error": "ComplianceError",
            "Cause": "Compliance screening lambda failed"
          },
          "IsItemCompliant": {
            "Type": "Choice",
            "Choices": [
              {
                "And": [
                  {
                    "Variable": "$.compliance[0].Payload.isViolation",
                    "BooleanEquals": false
                  },
                  {
                    "Variable": "$.compliance[1].Payload.isCleared",
                    "BooleanEquals": true
                  }
                ],
                "Next": "QueueForTranscode"
              }
            ],
            "Default": "RejectNonCompliantItem"
          },
          "RejectNonCompliantItem": {
            "Type": "Task",
            "Resource": "arn:aws:states:::lambda:invoke",
            "Parameters": {
              "FunctionName": "${RejectContentFunctionArn}",
              "Payload": {
                "reason": "COMPLIANCE_FAILURE",
                "content.$": "$"
              }
            },
            "ResultPath": "$.rejection",
            "End": true
          },
          "QueueForTranscode": {
            "Type": "Task",
            "Resource": "arn:aws:states:::lambda:invoke",
            "Parameters": {
              "FunctionName": "${TranscodeMediaFunctionArn}",
              "Payload.$": "$.enriched.Payload"
            },
            "ResultPath": "$.transcode",
            "TimeoutSeconds": 60,
            "End": true
          }
        }
      },
      "End": true
    }
  }
}
JSON
Expand
100%

Entertainment teams can use patterns like this to build reliable, compliant, and scalable automation for payment systems and can test and refine these flows locally with Thrubit to reduce cloud cost and speed up iteration.

Free Trial