Ein ähnliches Beispiel sind die Autoscaling Groups (AG), die dafür sorgen, dass bestimmte EC2-Instanzen laufen. Häufig werden nämlich EC2-Instanzen nicht von Hand gestartet, sondern es gibt Autoscaling Groups, über die Anwender deklarativ bestimmen, dass bestimmte Ressourcen vorhanden sein müssen, während die Umsetzung dann automatisch geschieht.
Dies hat zur Folge, dass es sinnlos ist, solcherart gestartete Instanzen manuell zu löschen, denn Sie werden von AWS immer wieder neu gestartet, um die Anforderungen der AG zu erfüllen. In diesem Fall sind zum Beenden einer Instanz die entsprechenden Autoscaling Groups zu aktualisieren. Die entsprechende Methode "detach_instances" zum Herauslösen einer Instanz aus der AG besitzt einen weiteren Parameter namens "ShouldDecrementDesiredCapacity", der dafür sorgt, dass anstelle der Instanz nicht eine neue gestartet wird. Darüber hinaus ist es, je nach Konfiguration, noch nötig, die "MinSize" der Autoscaling Group entsprechend anzupassen. Ein entsprechendes Skript ist in Listing 2 zu sehen.
Listing 2: Instanzen und Autoscaling Groups
from __future__ import print_function import boto3 asclient = boto3.client('autoscaling', region_name='us-east-1') ec2client = boto3.client('ec2', region_name='us-east-1')
for i in asclient.describe_auto_scaling_instances()['AutoScalingInstances']: print(i['InstanceId'], i['AutoScalingGroupName']) instanceid = i['InstanceId'] asgroupname = i['AutoScalingGroupName'] response = asclient.update_auto_scaling_group(AutoScalingGroupName=asgroupname, MinSize=0) if response is not None: print(response) response = asclient.detach_instances(InstanceIds=[instanceid], AutoScalingGroupName=asgroupname, ShouldDecrementDesiredCapacity=True) if response is not None: print(response) ec2client.terminate_instances(InstanceIds=[instanceid]) for g in asclient.describe_auto_scaling_groups()['AutoScalingGroups']: asgroupname = g['AutoScalingGroupName'] asclient.delete_auto_scaling_group(AutoScalingGroupName=asgroupname) print(g['AutoScalingGroupName'])
Da viele Ressourcentypen in Amazon nicht unmittelbar nach dem Erzeugen bereitstehen, beispielsweise Instanzen, bietet Boto3 noch einen Mechanismus, um auf diesen Zeitpunkt zu warten, die sogenannten Waiter. Wenn Sie beispielsweise eine EC2-Instanz starten, können Sie einen Waiter verwenden, der den Ablauf stoppt, bis die Instanz den Zustand "running" erreicht hat:
instance.wait_until_running()
Ein weiteres Beispiel ist der LoadBalancer-Service, dessen verfügbare Waiter Sie mit dem Attribut "waiter_names" in Erfahrung bringen:
elbclient = boto3.client('elbv2', region_name='us-east-1') print elbclient.waiter_names ['load_balancer_available', 'load_balancer_exists', 'load_balancers_deleted', 'target_deregistered', 'target_in_service']
Damit können Sie im eigenen Code warten, bis der "loadbalancer_available" ist.