Skip to content

Instantly share code, notes, and snippets.

@micksatana
Created June 24, 2022 18:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save micksatana/36b60ab4be6945e171eda45d8f75bed6 to your computer and use it in GitHub Desktop.
Save micksatana/36b60ab4be6945e171eda45d8f75bed6 to your computer and use it in GitHub Desktop.
Step Functions - State Machine JSON Definition to Start/Stop/Hibernate EC2 Instances
{
"Comment": "Hibernation Workflow",
"StartAt": "SwitchAction",
"States": {
"SwitchAction": {
"Type": "Choice",
"Choices": [
{
"Variable": "$$.Execution.Input.action",
"StringEquals": "hibernate",
"Next": "HibernateInstances"
},
{
"Variable": "$$.Execution.Input.action",
"StringEquals": "start",
"Next": "StartInstances"
},
{
"Variable": "$$.Execution.Input.action",
"StringEquals": "stop",
"Next": "StopInstances"
}
],
"Default": "FailedUnknownActionError"
},
"StopInstances": {
"Type": "Task",
"Next": "WaitStopping",
"Parameters": {
"InstanceIds.$": "$$.Execution.Input.instanceIds"
},
"Resource": "arn:aws:states:::aws-sdk:ec2:stopInstances",
"Retry": [
{
"ErrorEquals": [
"States.ALL"
],
"BackoffRate": 1,
"IntervalSeconds": 5,
"MaxAttempts": 2
}
]
},
"FailedUnknownActionError": {
"Type": "Fail",
"Error": "UnknownActionError",
"Cause": "Unimplemented action in the execution input"
},
"HibernateInstances": {
"Type": "Task",
"Parameters": {
"InstanceIds.$": "$$.Execution.Input.instanceIds",
"Hibernate": true
},
"Resource": "arn:aws:states:::aws-sdk:ec2:stopInstances",
"Next": "WaitStopping",
"Retry": [
{
"ErrorEquals": [
"States.ALL"
],
"BackoffRate": 1,
"IntervalSeconds": 5,
"MaxAttempts": 2
}
]
},
"WaitStopping": {
"Type": "Wait",
"Seconds": 5,
"Next": "HibernatingErrorHandler"
},
"HibernatingErrorHandler": {
"Type": "Parallel",
"Branches": [
{
"StartAt": "HibernatingDescribeInstanceStatus",
"States": {
"HibernatingDescribeInstanceStatus": {
"Type": "Task",
"Parameters": {
"InstanceIds.$": "$$.Execution.Input.instanceIds"
},
"Resource": "arn:aws:states:::aws-sdk:ec2:describeInstanceStatus",
"Next": "IsAtLeastOneInstancePresent"
},
"IsAtLeastOneInstancePresent": {
"Type": "Choice",
"Choices": [
{
"Not": {
"Variable": "$.InstanceStatuses[0]",
"IsPresent": true
},
"Next": "NoInstancePresentSuccess"
}
],
"Default": "InstanceNotStoppedError"
},
"NoInstancePresentSuccess": {
"Type": "Succeed"
},
"InstanceNotStoppedError": {
"Type": "Fail"
}
}
}
],
"Retry": [
{
"ErrorEquals": [
"States.ALL"
],
"BackoffRate": 1,
"IntervalSeconds": 20,
"MaxAttempts": 3
}
],
"Next": "AllHibernatedSuccess"
},
"AllHibernatedSuccess": {
"Type": "Succeed"
},
"StartInstances": {
"Type": "Task",
"Parameters": {
"InstanceIds.$": "$$.Execution.Input.instanceIds"
},
"Resource": "arn:aws:states:::aws-sdk:ec2:startInstances",
"Next": "WaitPending",
"Retry": [
{
"ErrorEquals": [
"States.ALL"
],
"BackoffRate": 1,
"IntervalSeconds": 5,
"MaxAttempts": 2
}
]
},
"WaitPending": {
"Type": "Wait",
"Seconds": 60,
"Next": "StartingErrorHandler"
},
"StartingErrorHandler": {
"Type": "Parallel",
"Next": "AllRunningSuccess",
"Branches": [
{
"StartAt": "StartingDescribeInstanceStatus",
"States": {
"StartingDescribeInstanceStatus": {
"Type": "Task",
"Parameters": {
"InstanceIds.$": "$$.Execution.Input.instanceIds"
},
"Resource": "arn:aws:states:::aws-sdk:ec2:describeInstanceStatus",
"Next": "AtLeastOneInstancePresent"
},
"AtLeastOneInstancePresent": {
"Type": "Choice",
"Choices": [
{
"Variable": "$.InstanceStatuses[0]",
"IsPresent": true,
"Next": "MapCheckRunningState"
}
],
"Default": "NotRunningError"
},
"MapCheckRunningState": {
"Type": "Map",
"Iterator": {
"StartAt": "TransformRunningState",
"States": {
"TransformRunningState": {
"Type": "Pass",
"Parameters": {
"instanceStatus.$": "$.InstanceStatus.Status",
"systemStatus.$": "$.SystemStatus.Status"
},
"Next": "IsNotRunning"
},
"IsNotRunning": {
"Type": "Choice",
"Choices": [
{
"And": [
{
"Variable": "$.instanceStatus",
"StringEquals": "ok"
},
{
"Variable": "$.systemStatus",
"StringEquals": "ok"
}
],
"Next": "InstanceRunningSuccess"
}
],
"Default": "StatusNotOkError"
},
"InstanceRunningSuccess": {
"Type": "Succeed"
},
"StatusNotOkError": {
"Type": "Fail"
}
}
},
"ItemsPath": "$.InstanceStatuses",
"End": true
},
"NotRunningError": {
"Type": "Fail"
}
}
}
],
"Retry": [
{
"ErrorEquals": [
"States.ALL"
],
"BackoffRate": 1,
"IntervalSeconds": 60,
"MaxAttempts": 5
}
]
},
"AllRunningSuccess": {
"Type": "Succeed"
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment