State Machine AWS
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 » :
