Was liegt näher, als immer wiederkehrende Aufgaben mit Skripten zu automatisieren. Das reduziert den Arbeitsaufwand wie auch die Fehleranfälligkeit. In der ... (mehr)

Autoscaling Groups

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'])

Besser warten

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.

comments powered by Disqus
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Konfigurationsmanagement

Ich konfiguriere meine Server

  • von Hand
  • mit eigenen Skripts
  • mit Puppet
  • mit Ansible
  • mit Saltstack
  • mit Chef
  • mit CFengine
  • mit dem Nix-System
  • mit Containern
  • mit anderer Konfigurationsmanagement-Software

Ausgabe /2023