Come specificare le credenziali durante la connessione a boto3 S3?


105

Su boto ho usato per specificare le mie credenziali quando mi collegavo a S3 in questo modo:

import boto
from boto.s3.connection import Key, S3Connection
S3 = S3Connection( settings.AWS_SERVER_PUBLIC_KEY, settings.AWS_SERVER_SECRET_KEY )

Potrei quindi usare S3 per eseguire le mie operazioni (nel mio caso eliminando un oggetto da un bucket).

Con boto3 tutti gli esempi che ho trovato sono questi:

import boto3
S3 = boto3.resource( 's3' )
S3.Object( bucket_name, key_name ).delete()

Non sono riuscito a specificare le mie credenziali e quindi tutti i tentativi falliscono con InvalidAccessKeyIderrore.

Come posso specificare le credenziali con boto3?


Questa risposta potrebbe aiutare: stackoverflow.com/a/36913771/2681632
Ilja Everilä

1
Consulta la sezione "Configurazione delle credenziali" nella documentazione ufficiale: boto3.readthedocs.io/en/latest/guide/configuration.html
Mark B

Risposte:


162

Puoi creare una sessione :

import boto3
session = boto3.Session(
    aws_access_key_id=settings.AWS_SERVER_PUBLIC_KEY,
    aws_secret_access_key=settings.AWS_SERVER_SECRET_KEY,
)

Quindi usa quella sessione per ottenere una risorsa S3:

s3 = session.resource('s3')

24
funziona, la prenderò come risposta. Perché diavolo non documentano questo come il modo più ovvio per farlo? !!
Robert Brax

3
Come accennato in un commento sopra, questo è in effetti nella documentazione .
Moot

70

Puoi ottenere una clientnuova sessione direttamente come di seguito.

 s3_client = boto3.client('s3', 
                      aws_access_key_id=settings.AWS_SERVER_PUBLIC_KEY, 
                      aws_secret_access_key=settings.AWS_SERVER_SECRET_KEY, 
                      region_name=REGION_NAME
                      )

9
Funziona per ottenere un client s3 , ma l'OP voleva invece una risorsa s3 .
Alasdair

Sono d'accordo con @Alasdair. I documenti non mostrano come fare nulla con il cliente, e nemmeno tu, quindi non vedo come questa risposta sia rilevante.
Cerin

Ho provato questo ma mi dà l'errore "Impossibile individuare le credenziali" .. Avevo precedentemente rimosso la cartella ~ / .aws per testarlo perché so che Boto cercherà per impostazione predefinita i
crediti

6

Questo è più vecchio ma lo metto qui anche per mio riferimento. boto3.resource sta solo implementando la sessione predefinita, puoi passare attraverso i dettagli della sessione boto3.resource.

Help on function resource in module boto3:

resource(*args, **kwargs)
    Create a resource service client by name using the default session.

    See :py:meth:`boto3.session.Session.resource`.

https://github.com/boto/boto3/blob/86392b5ca26da57ce6a776365a52d3cab8487d60/boto3/session.py#L265

puoi vedere che richiede solo gli stessi argomenti di Boto3.Session

import boto3
S3 = boto3.resource('s3', region_name='us-west-2', aws_access_key_id=settings.AWS_SERVER_PUBLIC_KEY, aws_secret_access_key=settings.AWS_SERVER_SECRET_KEY)
S3.Object( bucket_name, key_name ).delete()

5

Vorrei espandere la risposta di @ JustAGuy. Il metodo che preferisco è usare AWS CLIper creare un file di configurazione. Il motivo è che, con il file di configurazione, CLIo SDKcercherà automaticamente le credenziali nella ~/.awscartella. E la cosa buona è che AWS CLIè scritto in python.

Puoi ottenere cli da pypi se non lo hai già. Ecco i passaggi per impostare la cli dal terminale

$> pip install awscli  #can add user flag 
$> aws configure
AWS Access Key ID [****************ABCD]:[enter your key here]
AWS Secret Access Key [****************xyz]:[enter your secret key here]
Default region name [us-west-2]:[enter your region here]
Default output format [None]:

Dopodiché puoi accedere a botoqualsiasi API senza dover specificare le chiavi (a meno che tu non voglia utilizzare credenziali diverse).


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.