Amazon Cloud mit Boto fernsteuern

Marcin Balcerzak, 123RF

Freischwimmer

Das Boto-Modul hilft dabei, Ressourcen in der Amazon Cloud zu managen. Dieser Artikel gibt eine Einführung in die Programmierung mit der Python-Bibliothek.
ADMIN 11/13 stellt die besten Lösungen vor und klärt, ob Browser-Plugins, Anonymisierer sowie Verschlüsselung wirklich helfen. Weitere Themen: Small ... (mehr)

Die Amazon Cloud bietet eine ganze Reihe von Diensten, um eigene Serverdienste dynamisch zu skalieren, angefangen bei der Elastic Compute Cloud (EC2), dem Basisdienst, über diverse Storage-Angebote (S3, Elastic Block Store) bis hin zu Loadbalancern und DNS. Sie über das Web-Frontend zu steuern, ist nur dann sinnvoll, wenn man wenige Dienste verwaltet und sich die Konfiguration nur selten ändert.

Bei komplexeren Setups eignen sich dafür besser die Command Line Tools, die Amazon kostenlos zur Verfügung stellt [1]. Wer selbst Skripte schreiben möchte, die die eigene Cloud-Infrastruktur steuern, findet eine Alternative dazu in »Boto« , einem umfangreichen Python-Modul, das die Amazon-API weitgehend abdeckt.

Python-Modul

Geschrieben wurde Boto von Mitchell "Mitch" Garnett, der in seinem Blog [2] eine ganze Reihe von Anwendungsbeispielen gibt. Boto steht unter einer nicht näher bezeichneten freien Lizenz und ist auf Github [3] zu finden. Installieren lässt sich die Software mit dem Python-Paketmanager »Pip« durch »pip install boto« . Um die Bibliothek zu verwenden, ist es als Erstes nötig, ein Connection-Objekt zu erzeugen, das die Verbindung zum jeweiligen Amazon-Dienst repräsentiert:

from boto.ec2 import EC2Connection
conn = EC2Connection(access_key, secret_key)

Wie man sieht, erwartet die Funktion »EC2Connection« zwei Schlüssel, die sich über das »Amazon Identity and Access Management« (IAM) verwalten lassen. In der IAM-Console findet sich unter »Users« und »User Actions« der Eintrag »Manage Access Keys« , mit dem sich einer neuer Zugangsschlüssel erzeugen lässt (Abbildung 1). Direkt danach steht er auch zum Download bereit, später aus Sicherheitsgründen nicht mehr. Man sollte sich also die CSV-Datei herunterladen und an einem sicheren Ort verwahren, wo man sie auch noch ein halbes Jahr später wiederfindet.

Abbildung 1: Mit dem Amazon Identity and Access Management (IAM) lassen sich die Zugangsdaten erzeugen, die man braucht, um den Webservice zu nutzen.

Mit dem obigen Aufruf wird eine Verbindung zu der Default-Region des Amazon Web Service hergestellt, die sich in den USA befindet. Um stattdessen eine andere Region auszuwählen, bietet Boto den Aufruf »connect_to_region()« an. Die folgende Zeile baut eine Verbindung zum Amazon-Datencenter in Irland auf:

conn = boto.ec2.connect_to_region("eu-west-1")

Über das Connection-Objekt kann der Anwender typischerweise alle Funktionen nutzen, die ein Dienst bietet. Im Fall des EC2 kann er also etwa eine Instanz starten, was in etwa einer virtuellen Maschine entspricht. Dazu braucht er ein sogenanntes Image (AMI), das die Daten für das Betriebssystem enthält. Eine Reihe von Images bietet Amazon selbst an, darunter nicht nur kostenlose, sondern auch kommerzielle Systeme wie Windows Server oder Red Hat Enterprise Linux. Je nach Lizenz wird die Nutzung über einen entsprechend höheren Stundensatz abgegolten. Viele Images, die zum Beispiel für Webserver-Dienste und alle denkbaren Anwendungen vorkonfiguriert sind, wurden von anderen AWS-Nutzern erstellt. Fürs Erste lässt sich der Identifier, den man für das Starten einer Image-Instanz braucht, über die Webkonsole herausfinden, die auch eine Suchfunktion enthält.

Die folgende Funktion startet dann die kleinste von Amazon angebotene Instanz mit dem Image »ami-df9b8bab« :

conn.run_instances('ami-df9b8bab', instance_type='m1.small')

Wer jetzt einen Blick in das EC2-Web-Frontend wirft, kann sehen, dass die Instanz startet (Abbildung 2). Im Prinzip war es das schon, und der neu erzeugte virtuelle Server lässt sich nutzen. Amazon weist darauf hin, dass der Anwender selbst dafür verantwortlich ist, dass der ausgewählte Instanz-Typ und das AMI zusammenpassen. Der Cloud-Anbieter überprüft das nicht.

Abbildung 2: Die Webkonsole zeigt: Das Boto-Skript startet neue Instanzen eines Image.

Reservierung

Um eine gestartete Instanz auch wieder beenden zu können, wäre es praktisch, in Boto direkten Zugriff darauf zu haben. Dies lässt sich dadurch erreichen, dass man den Rückgabewert des obigen Aufrufs in einer Variablen speichert: »run_instances()« gibt eine sogenannte Reservation zurück. Sie enthält ein Array namens »instances« , in dem alle gleichzeitig gestarteten Instanzen gespeichert sind. Listing 1 zeigt das vollständige Skript zum Starten und Stoppen einer Instanz.

Listing 1

launch.py

 

Um sich bei einer Vielzahl von Instanzen besser zu orientieren, bietet die Amazon Cloud die Möglichkeit, sogenannte Tags zu vergeben. Damit kann man zum Beispiel ein Name-Tag einführen, das man beim Erzeugen sinnvoll vergibt:

instance.add_tag("Name", "Mailserver")

Im Attribut »tags« des Instanz-Objekts sind die Tags dann als Dictionary gespeichert.

Um mehrere Instanzen zu beenden, enthält das EC2-Modul die Methode »terminate_instances()« , die als Parameter eine Liste von Instanzen-IDs erwartet. Wer sich die »Reservations« nicht beim Start speichert, kann sie mit dem etwas irreführend benannten »get_all_instances()« abrufen. Wiederum enthält jede Reservation eine Liste mit Instanzen – auch denen, die schon wieder beendet wurden:

>>> reservations = conn.get_all_instances()
>>> reservations[0].instances[0].id
u'i-1df79851'
>>> reservations[0].instances[0].state
u'terminated'

Schreibt man ein paar solcher Zeilen wie in Listing 2 in ein Skript, kann man es mit »python -i« aufrufen und landet danach in einer interaktiven Python-Sitzung, in der man die EC2-Funktionen weiter erforschen kann, etwa mit Hilfe des Befehls »dir(Objekt)« :

Listing 2

interact.py

 

$ python -i interact.py
r-72ffb53e i-1df79851 terminated
r-9b6b61d4 i-3021247f terminated
>>>

Um sich das wiederholte Eintippen der Region und der Authentifizierungsinformationen zu sparen, bietet Boto die Möglichkeit, solche Variablen in einer Konfigurationsdatei zu speichern, entweder per User als »~/.boto« oder systemweit als »/etc/boto.cfg« .

Die Konfigurationsdatei ist in Abschnitte aufgeteilt, die meistens einem bestimmten Amazon-Dienst entsprechen. Die Zugangsdaten haben ihren Ort im Abschnitt »Credentials« . Übermäßig komfortabel ist das erst einmal nicht, denn neben der Region muss der Anwender auch den entsprechenden Endpoint eingeben.

Wenigstens fällt diese Arbeit nur beim ersten Mal an. Herausfinden lassen sich die erforderlichen Daten zum Beispiel wie in Listing 3. Eine vollständige Konfigurationsdatei mit Region, Endpoint und den Zugangsdaten ist in Listing 4 zu sehen.

Listing 4

~/.boto

 

Listing 3

Regions

 

Die Regions-Daten sind – wie erwähnt – dienstspezifisch, weil man unter Umständen die Dienste ja in unterschiedlichen Regionen laufen lassen will. Die Region für den Compute-Dienst EC2 heißt also wie im obigen Beispiel »ec2_region_name« , für den Speicherdienst S3 »s3_region_name« , für den Loadbalancer »elb_region_name« und so weiter.

Etwas verwirrend ist die API, da einige Funktionen den einzelnen Diensten zugeordnet sind und in den entsprechenden Python-Modulen zu finden sind, während andere mit teilweise gleichen Aufgaben als statische Funktionen im »boto« -Modul angesiedelt sind. So gibt es zum Aufbau einer Verbindung die schon erwähnten »boto.ec2.connect_to_region()« und »boto.connect_ec2()« . Analog ist es mit »boto.connect_s3« , während der entsprechende Aufruf im S3-Modul aber »S3Connection« heißt. Die API-Dokumentation unter [4] gibt Auskunft über alle Details.

comments powered by Disqus

Artikel der Woche

Registry für Docker-Images

Wer selber Docker-Images herstellt, braucht auch eine eigene Registry. Diese gibt es ebenfalls als Docker-Image, aber nur mit eingeschränkter Funktionalität. Mit einem Auth-Server wird daraus ein brauchbares Repository für Images. (mehr)
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

Google+

Ausgabe /2018