2016-03-29 9 views
11

Sto lottando per scoprire come posso ottenere il mio aws_access_key_id e aws_secret_access_key in modo dinamico dal mio codice.Boto3: ottieni le credenziali in modo dinamico?

In boto2 potrei fare quanto segue: boto.config.get_value('Credentials', 'aws_secret_access_key') ma non riesco a trovare un metodo simile in boto3. Sono stato in grado di trovare le chiavi se guardo in boto3.Session()._session._credentials ma quella mi sembra la madre di tutti gli hack e preferirei non andare su quella strada.

+0

Potrebbe chiarire il motivo per cui è necessario un accesso diretto alle credenziali nel codice? Inoltre, questo non è il posto giusto per esprimere opinioni o delusioni in un cambiamento dell'API. Portalo nei forum di AWS. –

+0

Ne ho bisogno perché copio i dati da S3 a Redshift e quindi ho bisogno di 'aws_access_key_id' e' aws_secret_access_key'. Preferirei non dover scrivere il codice che va nei file config/credential e trovarli fuori quando Boto lo fa già. –

+0

Sì, passare quelle chiavi a Redshift per l'accesso S3 è un grosso problema. Vorrei che ci permettessero di assegnare un ruolo IAM a Redshift per evitare la necessità di farlo. Sarei preoccupato che la tua soluzione non funzionasse su un'istanza EC2 utilizzando un profilo di istanza IAM o una funzione Lambda. –

risposta

12

Generalmente è una buona pratica solo per use temporary credentials. È possibile ottenere credenziali temporanee con STS.get_session_token.

EDIT: Come di this PR, è possibile accedere alle credenziali di sessione corrente in questo modo:

import boto3 

session = boto3.Session() 
credentials = session.get_credentials() 

# Credentials are refreshable, so accessing your access key/secret key 
# separately can lead to a race condition. Use this to get an actual matched 
# set. 
credentials = credentials.get_frozen_credentials() 
access_key = credentials.access_key 
secret_key = credentials.secret_key 

redshift = session.client('redshift') 
... 

io consiglierei comunque utilizzando le credenziali temporanee limitate all'ambito di esattamente che cosa deve redshift.

5

Usa botocore

>>> import botocore.session 
>>> session = botocore.session.get_session() 

>>> session.get_credentials().access_key 
'AKIAABCDEF6RWSGI234Q' 

>>> session.get_credentials().secret_key 
'abcdefghijkl+123456789+qbcd' 

>>> session.get_config_variable('region') 
'us-east-1'