{
"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
}
}
}JSONExpand
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.