• A short DSL de nition expands into hundreds of lines of work ow JSON with state checks, retries, and execution tracking. { "ResultPath": "$.prepared", "Type": "Pass" }, { }, "SetRunningState": { "Catch": [ { "ErrorEquals": [ "States.ALL" ], "Next": "EnsureDatadogContext", "ResultPath": "$.error" } ], "Next": "EnsureDatadogContext", "Parameters": { "Item": { "executionArn.$": "$$.Execution.Id", "jobName": { "S.$": "$$.StateMachine.Name" }, "lastUpdated.$": "$$.State.EnteredTime", "startTime.$": "$$.Execution.StartTime", "status": { "S": "RUNNING" }, "stopTime": { "S": "" } }, "TableName": "job-scheduler-state" }, "Resource": "arn:aws:states:::dynamodb:putItem", "ResultPath": "$.putResult", "Retry": [ { "BackoffRate": 2, "ErrorEquals": [ "DynamoDB.SdkClientException", "DynamoDB.AmazonServiceException", "DynamoDB.InternalServerError", "DynamoDB.ServiceUnavailable", "IsPresent": true, "Variable": "$.dbResult.Item.status.S" }, { "Or": [ { "StringEquals": "FAILED", "Variable": "$.dbResult.Item.status.S" }, { "StringEquals": "TIMED_OUT", "Variable": "$.dbResult.Item.status.S" }, { "StringEquals": "ABORTED", "Variable": "$.dbResult.Item.status.S" } ] } ], "Next": "SkipExecution" } ], "Default": "SetRunningState", "Type": "Choice" }, "EnsureDatadogContext": { "Next": "PrepareTraceContext", "OutputPath": "$.result", "Parameters": { "result.$": "States.JsonMerge(States.StringToJson('{\"_datadog\":{}}'), $, false)" }, "Type": "Pass" }, "GetJobState": { "Catch": [ { "ErrorEquals": [ "States.ALL" ], "Next": "SetRunningState", "ResultPath": "$.error" } ], "Next": "CheckExecutionPolicy", "Parameters": { "Key": { "jobName": { "S.$": "$$.StateMachine.Name" } }, "TableName": "job-scheduler-state" }, "Resource": "arn:aws:states:::dynamodb:getItem", "ResultPath": "$.dbResult", "Type": "Task" }, "PrepareTraceContext": { "Next": "SidekiqTask-Contracts::DailyReportJob", "Parameters": { "ddTraceContext.$": "States.JsonToString($ ['_datadog'])" }, "DynamoDB.ProvisionedThroughputExceededException", "DynamoDB.RequestLimitExceeded", "DynamoDB.ThrottlingException" ], "IntervalSeconds": 1, "JitterStrategy": "FULL", "MaxAttempts": 3 } ], "Type": "Task" }, "SidekiqTask-Contracts::DailyReportJob": { "End": true, "Parameters": { "Cluster": "arn:aws:ecs:apnortheast-1:146154011163:cluster/job-scheduler", "LaunchType": "FARGATE", "NetworkConfiguration": { "AwsvpcConfiguration": { "AssignPublicIp": "ENABLED", "SecurityGroups": [ "sg-00ddd5fe5b773d7a4" ], "Subnets": [ "subnet-064f8c06baca91b95", "subnet-02544c3bc2d96f992", fl fi fl function(dsl, jobId) dsl.Job(jobId, { steps: [ dsl.SidekiqTask('DailyReportJob'), ], schedules: [ { expression: 'cron(0 9 * * ? *)' }, ], execution_policy: 'SKIP_IF_RUNNING', }) "Variable": "$.executionPolicy" "Comment": "Daily Report Job execution workflow", "StartAt": "GetJobState", "States": { "CheckExecutionPolicy": { "Choices": [ { "Next": "SetRunningState", "StringEquals": "ALWAYS_RUN", "Variable": "$.executionPolicy" }, { "Next": "SetRunningState", "Not": { "IsPresent": true, "Variable": "$.dbResult.Item.status" } }, { "And": [ { "StringEquals": "SKIP_IF_RUNNING_OR_FAILED", "Variable": "$.executionPolicy" }, { "IsPresent": true, "Variable": "$.dbResult.Item.status.S" }, { "Or": [ { "StringEquals": "RUNNING", "Variable": "$.dbResult.Item.status.S" }, { "StringEquals": "FAILED", "Variable": "$.dbResult.Item.status.S" }, { "StringEquals": "TIMED_OUT", "Variable": "$.dbResult.Item.status.S" }, { "StringEquals": "ABORTED", "Variable": "$.dbResult.Item.status.S" } ] } ], "Next": "SkipExecution" }, { "And": [ { "StringEquals": "SKIP_IF_RUNNING", "Variable": "$.executionPolicy" }, { "StringEquals": "RUNNING", "Variable": "$.dbResult.Item.status.S" } ], "Next": "SkipExecution" }, { "And": [ { "StringEquals": "SKIP_IF_FAILED", "subnet-09bc46d9ba952162f" ] } }, "Overrides": { "ContainerOverrides": [ { "Command": [ "./scripts/sidekiq-runner", "Contracts::DailyReportJob" ], "Environment": [ { "Name": "JOB_EXECUTION_ARN", "Value.$": "$$.Execution.Id" }, { "Name": "JOB_START_TIME", "Value.$": "$$.Execution.StartTime" }, { "Name": "DD_TRACE_CONTEXT", "Value.$": "$.prepared.ddTraceContext" } ], "Name": "first" } ] }, "TaskDefinition": "arn:aws:ecs:apnortheast-1:146154011163:task-definition/pro-ivry-job-runneroneshot" }, "Resource": "arn:aws:states:::ecs:runTask.sync", "ResultPath": "$.ecsResult", "Retry": [ { "BackoffRate": 2, "ErrorEquals": [ "ECS.ServerException", "ECS.SdkClientException" ], "IntervalSeconds": 10, "JitterStrategy": "FULL", "MaxAttempts": 3 } ], "Type": "Task" }, "SkipExecution": { "End": true, "Parameters": { "executionPolicy.$": "$.executionPolicy", "jobName.$": "$.jobName", "skipResult": { "prevStatus.$": "$.dbResult.Item.status.S", "reason.$": "States.Format('Skipped due to previous status: {}', $.dbResult.Item.status.S)", "skipped": true }, "triggerType.$": "$.triggerType", "triggeredBy.$": "$.triggeredBy" }, "Type": "Pass" } } }