State Machine AWS

chmux
9 avril 2021

Pour créer une State Machine, se rendre dans « Step Functions » et cliquer sur « Create State Machine ».

Nous allons voir ici un exemple avec une State Machine qui réalise un stop/start d’une EC2.

Dans « Definition », copier le code suivant :

{  
  "Comment": "On Off EC2 step function",
  "StartAt": "Check EC2 Status",
  "States": {
    "Check EC2 Status": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:eu-west-3:xxxxxxxxxxxx:function:get_status",
      "ResultPath": "$.ec2_status",
      "Next": "Status choices"
    },
    "Status choices": {
      "Comment": "If status is 'running' so stop instance, if is 'stopped' so start instance, else if is 'pending|shutting-down|stopping' so recheck,",
      "Type": "Choice",
      "Choices": [
        {
          "Variable": "$.ec2_status",
          "StringEquals": "running",
          "Next": "Stop EC2"
        },
        {
          "Variable": "$.ec2_status",
          "StringEquals": "stopped",
          "Next": "Start EC2"
        }
      ],
      "Default": "Wait 3s"
    },
    "Stop EC2": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:eu-west-3:xxxxxxxxxxxx:function:stop_ec2",
      "ResultPath": "$.return_stop",
      "Next": "Wait 3s"
    },
    "Wait 3s": {
      "Type": "Wait",
      "Seconds": 3,
      "Next": "Check EC2 Status"
    },
    "Start EC2": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:eu-west-3:xxxxxxxxxxxx:function:start_ec2",
      "ResultPath": "$.return_start",
      "End": true
    }
  }
}

Cette State Machine fait appel à 3 lambda :

  • get_status
import boto3

def lambda_handler(event, context):
    region = event['region']
    ec2_id = event['ec2_id']
    session = boto3.Session(region_name=region)
    client = session.client('ec2')

    response = client.describe_instance_status(
        InstanceIds=[ec2_id],
        IncludeAllInstances=True
    )
    return response['InstanceStatuses'][0]['InstanceState']['Name']

  • start_ec2
import boto3

def lambda_handler(event, context):
    region = event['region']
    ec2_id = event['ec2_id']
    session = boto3.Session(region_name=region)
    client = session.client('ec2')

    response = client.start_instances(
        InstanceIds=[ec2_id]
    )

    return f"Start EC2 {ec2_id} OK"
  • stop_ec2
import boto3

def lambda_handler(event, context):
    region = event['region']
    ec2_id = event['ec2_id']
    session = boto3.Session(region_name=region)
    client = session.client('ec2')

    response = client.stop_instances(
        InstanceIds=[ec2_id]
    )

    return f"Stop EC2 {ec2_id} OK"

Pour la lancer, il faut cliquer sur « Start execution »  et renseigner en input l’id de l’EC2 et la region et cliquer sur « Start execution » :

{  
  "ec2_id": "i-073ce8befe5d94dbc",
  "region": "eu-west-3"
}

Il est possible de voir la sortie dans l’onglet « Execution Output » :

Pour plus de détail, il est possible de cliquer sur les différents steps du « Graph inspector » ou regarder directement dans le « Execution event history » :