Slide 40
Slide 40 text
A Few Lines of Intent Become a Full Work ow
• 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"
}
}
}