¿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?


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')

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
                      )

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()

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


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.