Was ist der beste Weg, um mehrere Amazon Web Services-Konten (AWS) über boto
zu verwalten?
Ich bin mit BotoConfig -Dateien vertraut, die ich verwende. Jede Datei beschreibt jedoch nur ein einziges Konto ... und ich arbeite mit mehr als nur einer Organisation. Aus all den üblichen rechtlichen, finanziellen und Sicherheitsgründen können diese Konten nicht gemischt werden.
Derzeit verwende ich eine boto
config-Datei pro Konto. Z.B.:
~/.boto
Standardkonto~/.boto_clowncollege
für das Konto "clowncollege"~/.boto_razorassoc
für das Konto "razorassoc"~/.boto_xyz
für das Konto "xyz"Dann so etwas wie:
def boto_config_path(account=None):
"""
Given an account name, return the path to the corresponding boto
configuration file. If no account given, return the default config file.
"""
path = '~/.boto' + ('_' + account if account else '')
clean_path = os.path.abspath(os.path.expanduser(path))
if os.path.isfile(clean_path):
return clean_path
else:
errmsg = "cannot find boto config file {} for {}".format(clean_path, account)
raise ValueError(errmsg)
def aws_credentials(account=None):
"""
Return a Tuple of AWS credentials (access key id and secret access key) for
the given account.
"""
try:
cfg = INIConfig(open(boto_config_path(account)))
return ( cfg.Credentials.aws_access_key_id, cfg.Credentials.aws_secret_access_key )
except Exception:
raise
conn = EC2Connection(*aws_credentials('razorassoc'))
Gut, schlecht oder gleichgültig? Verbesserungsvorschläge
In Zukunft stellt boto bessere Tools bereit, mit denen Sie mehrere Anmeldeinformationen verwalten können. Im Moment gibt es jedoch einige Umgebungsvariablen, die möglicherweise helfen.
Zunächst können Sie festlegen, dass BOTO_CONFIG auf eine zu verwendende Boto-Konfigurationsdatei verweist. Dabei werden alle an den normalen Speicherorten gefundenen Konfigurationsdateien überschrieben.
Zweitens können Sie BOTO_PATH auf eine durch Doppelpunkte getrennte Liste von Orten setzen, um nach einer Boto-Konfigurationsdatei zu suchen. Die Datei wird zuerst dort gesucht, bevor Sie die normalen Suchorte suchen.
Keines von ihnen gibt Ihnen genau das, was Sie wollen, aber es kann mit etwas weniger Code leichter zu erreichen sein.
Wenn Sie Ideen haben, wie Sie dies in boto erreichen möchten, lassen Sie es mich wissen!
aktualisiert am 06.02.2015, korrigiert am 19.03.2015 durch Befolgen des oberen Abschnitts
Seit Boto 2.29 gibt es eine neue einfache Möglichkeit, BOTO- und AWS-CLI-Anmeldeinformationen weiterzugeben, wie von Mike Garnaat in Eine neue und standardisierte Methode zum Verwalten von Anmeldeinformationen in den AWS-SDKs beschrieben
Ziel ist es:
Erstellen Sie die Datei ~/.aws/credentials
(Mac/Linux) oder %USERPROFILE%\.aws\credentials
(Windwos) wie folgt:
[default]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr
region = eu-west-1
[jekyl]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr
region = eu-west-1
[hyde]
aws_access_key_id = AxxxZ
aws_secret_access_key = CxxxZ
region = eu-west-1
Ab sofort können Sie einen Code wie diesen verwenden:
import boto
con = boto.connect_s3()
AWS_PROFILE
env festgelegte explizite Profil. var(Dies ist meine bevorzugte Option, um den Profilnamen aus dem Code herauszuhalten und dem Bereitsteller meiner Anwendung dennoch die Möglichkeit zu geben, ein bestimmtes Profil auszuwählen.)
$ export AWS_PROFILE=jekyl
und halten Sie Ihren Code so einfach wie bisher:
import boto
con = boto.connect_s3()
import boto
con = boto.connect_s3(profile_name="jekyl")
Dies ist alles, was Sie normalerweise tun müssen
Die Logik zum Auswählen der richtigen Anmeldeinformationen wird in siehe Problem # 2292 wie folgt beschrieben:
Die Ladereihenfolge von der höchsten zur niedrigsten Priorität:
1.Direkt vom Code übergeben
Umgebungsvariablen für Schlüssel/Geheimnis
Umgebungsvariablen für Profil
Explizites Profil für freigegebene Anmeldeinformationsdateien
Standardprofil für freigegebene Anmeldeinformationsdateien
Explizites Profil der Konfigurationsdatei
Abschnitt Anmeldeinformationen für Konfigurationsdatei
Ein vom Code übergebenes Profil überschreibt einen beliebigen Satz in einer Umgebungsvariablen.
Um die Dinge sauber und einfach zu halten, ist es gut, ältere Methoden loszuwerden. Entfernen Sie daher alle Dateien im alten Stil (wie ~/.aws/config
oder ~/.boto
), und deaktivieren Sie die Umgebungsvariable BOTO_CONFIG
, falls festgelegt, und möglicherweise auch die Datei, auf die eine solche Variable verweist.
Und das ist wirklich alles für boto> = 2.29.0
Hinweis: Versuchen Sie nicht, den Speicherort der Konfigurationsdatei mit env.variable (wie AWS_CONFIG_FILE
) zu steuern, da dies nicht wie erwartet funktioniert.
Die folgende Beschreibung gilt nur für diejenigen, die kein Upgrade auf Boto 2.29.0 oder höher durchführen können.
Seit Boto 2.24.0 gibt es eine Funktion namens profile_name
In Ihrer ~/.boto
-Datei haben Sie bereits den Abschnitt [Credentials] (Anmeldeinformationen). Dieser Abschnitt dient als Ausweichoption und anschließend als Abschnitt [profile] (Profil) für verschiedene Profile:
[Credentials]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr
[profile jekyl]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr
[profile hyde]
aws_access_key_id = AxxxZ
aws_secret_access_key = CxxxZ
Wenn Sie dann eine Verbindung erstellen, gehen Sie folgendermaßen vor:
import boto
con = boto.connect_s3(profile_name="jekyl")
Beachten Sie, dass diese Funktion seit Boto 2.24.0 verfügbar ist.
Das Tutorial finden Sie hier http://docs.pythonboto.org/en/latest/boto_config_tut.html?highlight=profile
Es gibt sogar einige Hinweise zur Verwendung von Schlüsselanhängern, aber ich werde mich zuerst an dieses Profilmaterial gewöhnen, von dem ich einige Jahre lang geträumt habe.
AWSCLI wurde ein wirklich großartiges Tool. Da das Format der Konfigurationsdatei fast identisch ist, benutze ich es folgendermaßen:
~/.aws/config
-Datei bei (dies ist der Standardspeicherort).[default]
und benennen Sie ihn in [Credentials]
um (wobei Sie die gleichen Werte beibehalten).BOTO_CONFIG
so, dass sie auf diese Datei ~/.aws/config
verweist.Der ~/.boto
würde dann zu `~/.aws/config mit folgendem Inhalt:
[default]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr
[Credentials]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr
[profile jekyl]
aws_access_key_id = AxxxA
aws_secret_access_key = Zxxxr
[profile hyde]
aws_access_key_id = AxxxZ
aws_secret_access_key = CxxxZ
Auf diese Weise wird es sowohl für AWSCLI als auch für Boto einschließlich der Profile freigegeben.
Anstatt mehrere separate Boto-Konfigurationsdateien zu erstellen, sollten Sie das ConfigParser-Modul verwenden und für jedes Konto einen Abschnitt in der .boto-Datei erstellen.
ihre .boto-Datei könnte in etwa so aussehen
#Contents of ~/.boto
[clown-college]
aws_access_key_id = 123sesamestreet
aws_secret_access_key = 678idsaf567ujd
[razor-assoc]
aws_access_key_id = 437piedmont
aws_secret_access_key = 997567ujdfs
Verwenden Sie in Ihrem Python-Code ConfigParser, um den entsprechenden Zugriffsschlüssel für das Konto zu laden, das Sie verwenden möchten.
import ConfigParser
from os.path import expanduser
########## BEGIN MAIN ##############
# get the path to the user's homedir
user_home = expanduser("~")
#load their .boto config file
config = ConfigParser.ConfigParser()
config.read([str(user_home + "/.boto")])
#get the keypair for ClownCollege
print config.get('clown-college', 'aws_access_key_id')
print config.get('clown-college', 'aws_secret_access_key')
print config.get('razor-assoc', 'aws_access_key_id')
print config.get('razor-assoc', 'aws_secret_access_key')
Dies kann in eine Funktion eingebunden werden, die in Ihrem gesamten Boto-Code verwendet werden kann, um das korrekte Konto einfach einzurichten.
Ab boto> = 2.38 können anscheinend alle vorherigen Lösungen immense Kopfschmerzen und Probleme verursachen.
Nachdem dies heute ausgiebig auf mehreren BSD-basierten Plattformen getestet wurde, scheint die Verwendung von aws configure
Interaktives Skript. Rufen Sie es ohne Profil auf und füllen Sie einen [Standard] -Block für die Dateien .aws/config und .aws/credentials aus. Außerdem wird alles konfiguriert, was Sie für die Arbeit mit Ihrem aws-Toolset benötigen ( obwohl es noch unklar ist, welche Verhexungen es auf Ihren localhost wirft). Rufen Sie es erneut mit einem beliebigen Profilnamen auf, und es wird ein entsprechender Eintrag erstellt.
Beachten Sie, dass dies für Versionen von boto <2.3 immer noch nicht funktioniert.
aws configure --profile somename
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: us-east-1
Default output format [None]: json
Beachten Sie, dass pro http://boto.cloudhackers.com/de/latest/boto_config_tut.html - bei der Verwendung von connect_cloudwatch () für die Boto-Version 2.48.0 eigentlich die benötigt wurde
cloudwatch_region_endpoint
Oder die Verbindung würde immer noch dieselbe Region wie die aktuelle Instanz verwenden, wenn data von der Instanz selbst in EC2 übertragen wird (wenn sich die Instanz in einer anderen Region befindet als die, in die sie verschoben wird).
cat .boto
[Boto]
cloudwatch_region_name = us-west-2
cloudwatch_region_endpoint = monitoring.us-west-2.amazonaws.com
Ich habe versucht, das zum .aws/credentials-Profil hinzuzufügen, aber es schien nicht zu funktionieren.
cat .aws/credentials
[cloudwatch_centralized_reporting]
region = us-west-2
aws_access_key_id = XXX
aws_secret_access_key = XXX