webentwicklung-frage-antwort-db.com.de

Empfohlene Methode zum Verwalten von Anmeldeinformationen mit mehreren AWS-Konten?

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

26
Jonathan Eunice

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!

7
garnaat

aktualisiert am 06.02.2015, korrigiert am 19.03.2015 durch Befolgen des oberen Abschnitts

Neue standardisierte Freigabe von Boto- und AWSCLI-Anmeldeinformationen (Boto> == 2.29.0)

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:

  1. zulassen der Freigabe von Anmeldeinformationen durch Boto, AWSCLI und möglicherweise andere SDKs
  2. bewahren Sie die gesamte Konfiguration in einer einzigen Datei auf, die sich im Benutzerprofilverzeichnis befindet
  3. erlauben die Verwendung von benannten Profilen
  4. halte es so einfach wie möglich (vermeide beispielsweise Konflikte mit anderen Methoden)

Erstellen Sie eine Anmeldeinformationsdatei

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:

Standardprofil verwenden

import boto
con = boto.connect_s3()

Verwenden Sie das von 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()

Geben Sie in Ihrem Code ein explizites Profil an

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

  1. Umgebungsvariablen für Schlüssel/Geheimnis

  2. Umgebungsvariablen für Profil

  3. Explizites Profil für freigegebene Anmeldeinformationsdateien

  4. Standardprofil für freigegebene Anmeldeinformationsdateien

  5. Explizites Profil der Konfigurationsdatei

  6. 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.

Verwende das boto config Profil (boto> = 2.24.0)

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.

Konfigurationsdatei mit AWSCLI teilen

AWSCLI wurde ein wirklich großartiges Tool. Da das Format der Konfigurationsdatei fast identisch ist, benutze ich es folgendermaßen:

  1. behalten Sie die von AWSCLI erstellte ~/.aws/config -Datei bei (dies ist der Standardspeicherort).
  2. kopieren Sie den Abschnitt [default] und benennen Sie ihn in [Credentials] um (wobei Sie die gleichen Werte beibehalten).
  3. füge alle Profile hinzu, die ich verwende
  4. setzen Sie die Variable 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.

67
Jan Vlcinsky

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.

5
redmax

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
0
Ryder

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
0
storm_m2138