Python-Modul Boto3 für die Amazon-Cloud

Wär' doch gelacht

Das Boto-Modul hilft dabei, Ressourcen in der Amazon-Cloud mit Python zu managen. Dieser Artikel gibt eine Einführung in die Programmierung mit dem offiziell von Amazon unterstützten Modul.
Was liegt näher, als immer wiederkehrende Aufgaben mit Skripten zu automatisieren. Das reduziert den Arbeitsaufwand wie auch die Fehleranfälligkeit. In der ... (mehr)

Um in der Amazon-Cloud mal eben eine VM zu starten, genügt die webbasierte AWS Console. Wer aber seine Clouddienste automatisieren möchte, kommt kaum an einem etwas ausgefeilteren Tool oder einer skriptgesteuerten Lösung vorbei. Um Letzteres soll es in diesem Artikel gehen. Das Tool respektive Framework der Wahl ist Boto [1] (benannt nach dem Amazonas-Flussdelfin), eine Sammlung von Python-Modulen, die ursprünglich von Mitchell Garnett geschrieben wurde, der später bei Amazon angestellt war.

In der Zwischenzeit wurde Boto einmal gründlich von Grund auf umgeschrieben und wird nun als Boto3 auch von Amazon unterstützt und gepflegt. Das bringt den Vorteil, dass Amazon sich darum kümmert, dass alle der nicht gerade wenigen angebotenen AWS-Dienste von dem Framework unterstützt werden. Derzeit sind dies weit mehr als 100 Services, wie die ausführliche Dokumentation unter [2] belegt.

Installiert ist das Framework mit den üblichen Python-Paketmechanismen schnell. Es genügt ein Aufruf des Paketmanagers "pip", eventuell zur Vergabe der passenden Rechte noch mit "sudo" gekoppelt:

$ sudo -H pip install boto3

Wer auf seinem System neben Python 2 auch Version 3 betreibt, kann den entsprechenden Paketmanager mit »pip3 ...« aufrufen. Am allerbesten ist es natürlich, für sein Projekt mit "virtualenv" ein eigenes Verzeichnis anzulegen, in das die benötigten Module lokal installiert werden.

Nach der Installation von Boto3 steht der komplette Funktionsumfang in eigenen Python-Skripten zur Verfügung. Ein einfacher Test lässt sich beispielsweise mit dem S3-Storage-Dienst anstellen, der nur über einen globalen Namespace verfügt, weshalb man sich nicht um Regionen und Availability Zones kümmern muss:

import boto3
s3res = boto3.resource('s3')
for bucket in s3res.buckets.all():
       print(bucket.name)

Dieses Beispiel geht von Python 3 und der darin enthaltenen Print-Funktion aus. Wer Python 2 einsetzt, kann die Print-Funktion über die Anweisung "from __future__ import print_function" als erste Zeile des Skripts importieren, dann funktioniert es mit beiden Python-Versionen.

Während der Namespace von S3 global ist, sind einzelne Buckets dennoch in bestimmten Regionen angesiedelt – irgendwo müssen die Daten ja schließlich liegen. Wo das ist, finden Sie mit dem folgenden Aufruf heraus:

location = boto3.client('s3').get_bucket_location(Bucket=bucket.name)['LocationConstraint']

Dateien laden Sie mit dem folgenden Code in S3 hoch. Der "key" entspricht dabei praktisch dem Dateinamen des Objekts im Bucket.

bucket_name = "my-aws-bucket"
key = "upload-file"
s3res = boto3.resource('s3')
bucket = s3res.Bucket(bucket_name)
bucket.upload_file("upload.txt", key)

Eine praktische Ergänzung zu Boto beim Umgang mit S3 ist das "smart_open"-Modul [3], mit dem sich S3-URLs (wie auch HDFS) transparent öffnen und wie lokale Files verwenden lassen.

Zusätzlich ist zu beachten, dass die Liste von Objekten bei Boto und S3 auf 1000 begrenzt ist. Benötigen Sie mehr, müssen Sie sogenannte Paginators verwenden, die es erlauben, mit weiteren Requests die verbleibenden Objekte zu laden.

Authentifizierung

Um sich gegenüber AWS als berechtigter User auszuweisen, verwendet Boto3 dieselben Credentials wie die AWS-Commandline-Tools. Haben Sie also mit »aws configure« den Access Key und den Secret Key eingetragen, können Sie Boto einfach verwenden – vorausgesetzt der entsprechende User besitzt die nötigen IAM-Rollen für das, was sie machen wollen. Alternativ können Sie die beiden Keys auch in ihren Skripts als Parameter eintragen:

session = boto3.Session(
       aws_access_key_id=ACCESS_KEY,
       aws_secret_access_key=SECRET_KEY
)

Davon wird aber im Allgemeinen abgeraten, da auf solchem Weg die Schlüssel zu leicht den Weg an die Öffentlichkeit finden, etwa wenn Skripts bei Github hochgeladen werden. Weitere Möglichkeiten zur Authentifizierung, über die die Boto-Dokumentation informiert, sind Umgebungsvariablen oder ein Shared-Credentials-File.

Logging und Debugging

Um zu sehen, was Boto macht, können Sie das eingebaute Logging-Modul verwenden, das je nach Logging-Level (etwa INFO, TRACE oder DEBUG) unterschiedlich viele Informationen ausgibt.

import logging
boto3.set_stream_logger('', logging.DEBUG)

Eine interessante Alternative oder Ergänzung dazu ist es, die von Boto an AWS geschickten HTTP-Requests zu untersuchen. Dies erlaubt außerdem einen tieferen Einblick darin, was hinter den Kulissen passiert. Hierbei ist lediglich noch das Problem zu lösen, dass alle Requests zur Amazon-Cloud per TLS verschlüsselt sind. Hierzu bieten Proxys wie mitmproxy [4] eine Lösung, die darin besteht, dem Client ein eigenes Zertifikat zu präsentieren und gegenüber dem Server selbst als Client aufzutreten.

comments powered by Disqus

Artikel der Woche

Eigene 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 /2019