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 » :
