2016-04-27 25 views
5

Sto utilizzando tkinter per creare un'applicazione GUI che restituisce i gruppi di sicurezza. Attualmente, se desideri modificare le tue credenziali (ad es. Se hai inserito per sbaglio quelle sbagliate) dovresti riavviare l'applicazione altrimenti boto3 continuerà a utilizzare le vecchie credenziali.Boto3 utilizza vecchie credenziali

Non sono sicuro del motivo per cui continua a utilizzare le vecchie credenziali perché sto eseguendo di nuovo tutto utilizzando le credenziali attualmente immesse.

Questo è uno snippet del codice che imposta le variabili di ambiente e avvia boto3. Funziona perfettamente se inserisci le credenziali giuste la prima volta.

os.environ['AWS_ACCESS_KEY_ID'] = self.accessKey 
os.environ['AWS_SECRET_ACCESS_KEY'] = self.secretKey 

self.sts_client = boto3.client('sts') 

self.assumedRoleObject = self.sts_client.assume_role(
    RoleArn=self.role, 
    RoleSessionName="AssumeRoleSession1" 
) 

self.credentials = self.assumedRoleObject['Credentials'] 

self.ec2 = boto3.resource(
    'ec2', 
    region_name=self.region, 
    aws_access_key_id=credentials['AccessKeyId'], 
    aws_secret_access_key=credentials['SecretAccessKey'], 
    aws_session_token=credentials['SessionToken'], 
) 

Le credenziali variabili sono impostate utilizzando:

self.accessKey = str(self.AWS_ACCESS_KEY_ID_Form.get()) 
self.secretKey = str(self.AWS_SECRET_ACCESS_KEY_Form.get()) 
self.role = str(self.AWS_ROLE_ARN_Form.get()) 
self.region = str(self.AWS_REGION_Form.get()) 
self.instanceID = str(self.AWS_INSTANCE_ID_Form.get()) 

C'è un modo per utilizzare credenziali diverse in boto3 senza riavviare il programma?

+1

Questo è un modo errato per assegnare un accesso mutevole per il modulo boto3. Perché l'API boto assumerà e utilizzerà la chiave di accesso memorizzata nella cache @Vor answer è il modo esplicito per dire al boto. – mootmoot

+0

@mootmoot Se ricarico il modulo usando 'importlib.reload', si dovrebbe 'cancellare' la cache giusto? –

risposta

3

È necessario boto3.session.Session per sovrascrivere le credenziali di accesso.

solo fare questo riferimento http://boto3.readthedocs.io/en/latest/reference/core/session.html

import boto3 

# Assign you own access 
mysession = boto3.session.Session(aws_access_key_id='foo1', aws_secret_access_key='bar1') 

# If you want to use different profile call foobar inside .aws/credentials 
mysession = boto3.session.Session(profile_name="fooboar") 

# Afterwards, just declare your AWS client/resource services  
sqs_resource=mysession.resource("sqs") 

# or client 
s3_client=mysession.client("s3") 

In sostanza, piccolo cambiamento al codice. è sufficiente passare la sessione anziché direttamente boto3.client/boto3.resource

self.sts_client = mysession.client('sts') 
+0

Questo ha funzionato, grazie –

3

Certo, basta creare diversi sessions da botocore.session.Session oggetto per ogni set di credenziali:

import boto3 
s1 = boto3.session.Session(aws_access_key_id='foo1', aws_secret_access_key='bar1') 
s2 = boto3.session.Session(aws_access_key_id='foo2', aws_secret_access_key='bar2') 

Inoltre è possibile sfruttare set_credentials metodo per mantenere 1 seduta Un cambiamento creds al volo:

import botocore 
session - botocore.session.Session() 

session.set_credentials('foo', 'bar') 
client = session.create_client('s3') 
client._request_signer._credentials.access_key 
u'foo' 

session.set_credentials('foo1', 'bar') 
client = session.create_client('s3') 
client._request_signer._credentials.access_key 
u'foo1' 
+0

Grazie per la tua risposta! È questo per impostare più sessioni contemporaneamente? Mi piacerebbe avere solo 1 sessione e terminare la sessione precedente, se possibile. –

+0

@ Farhan.K Ho aggiornato la mia risposta – Vor

+0

Non sono esattamente sicuro di come implementarlo poiché non sono sicuro di dove verrà impostato il 'ruolo'. Inoltre, funzionerebbe con il mio codice corrente o dovrei riscrivere la parte 'self.ec2 = boto3.resource' del mio codice? –

Problemi correlati