¿Cómo especificar las credenciales al conectarse a boto3 S3?

105

En boto, solía especificar mis credenciales cuando me conectaba a S3 de esta manera:

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

Luego podría usar S3 para realizar mis operaciones (en mi caso, eliminar un objeto de un depósito).

Con boto3 todos los ejemplos que encontré son los siguientes:

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

No pude especificar mis credenciales y, por lo tanto, todos los intentos fallan con InvalidAccessKeyIderror.

¿Cómo puedo especificar las credenciales con boto3?

Robert Brax
fuente
Esta respuesta podría ayudarlo: stackoverflow.com/a/36913771/2681632
Ilja Everilä
1
Consulte la sección "Configuración de credenciales" en la documentación oficial: boto3.readthedocs.io/en/latest/guide/configuration.html
Mark B

Respuestas:

162

Puedes crear una sesión :

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

Luego use esa sesión para obtener un recurso S3:

s3 = session.resource('s3')
Alasdair
fuente
24
funciona, lo tomaré como la respuesta. ¡¡¿Por qué diablos no documentan esto como la forma obvia de hacerlo? !!
Robert Brax
3
Como se mencionó en un comentario anterior, esto está de hecho en la documentación .
Moot
70

Puede obtener una clientnueva sesión directamente como a continuación.

 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
                      )
Rajez
fuente
9
Esto funciona para obtener un cliente s3 , pero el OP quería un recurso s3 en su lugar.
Alasdair
Estoy de acuerdo con @Alasdair. Los documentos no muestran cómo hacer nada con el cliente, ni tú tampoco, así que no veo cómo esta respuesta es relevante.
Cerin
Intenté esto pero me da el error "No se pueden ubicar las credenciales". Anteriormente había eliminado la carpeta ~ / .aws para probar esto, ya que sé que boto buscará por defecto los créditos allí ...
Prathamesh dhanawade
6

Esto es más antiguo, pero también lo coloco aquí para mi referencia. boto3.resource está implementando la sesión predeterminada, puede pasar a través de los detalles de la sesión 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

puede ver que solo toma los mismos argumentos que Boto3.

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()
DataDecay
fuente
5

Me gustaría ampliar la respuesta de @ JustAGuy. El método que prefiero es usar AWS CLIpara crear un archivo de configuración. La razón es que, con el archivo de configuración, el CLIo SDKbuscará automáticamente las credenciales en la ~/.awscarpeta. Y lo bueno es que AWS CLIestá escrito en python.

Puede obtener cli de pypi si aún no lo tiene. Estos son los pasos para configurar cli desde la terminal

$> 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]:

Después de esto, puede acceder a botocualquiera de las api sin tener que especificar claves (a menos que desee usar una credencial diferente).

x85ms16
fuente