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 tales:
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 el error InvalidAccessKeyId .
¿Cómo puedo especificar las credenciales con boto3?
Me gustaría ampliar la respuesta de @JustAGuy. El método que prefiero es usar AWS CLI para crear un archivo de configuración. El motivo es que, con el archivo de configuración, la CLI o el SDK buscarán automáticamente las credenciales en la carpeta ~/.aws . Y lo bueno es que AWS CLI está 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 boto y a cualquiera de las API sin tener que especificar claves (a menos que desee usar unas credenciales diferentes).
Esto es más antiguo, pero también lo coloco aquí para mi referencia. boto3.resource solo está implementando la sesión predeterminada, puede pasar los detalles de la sesión de 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.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()Puede obtener un client con una nueva sesión directamente como se muestra 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 )Existen numerosas formas de almacenar credenciales sin dejar de usar boto3.resource(). Yo mismo estoy usando el método AWS CLI. Funciona perfectamente.
puede establecer variables predeterminadas de aws env para claves secretas y de acceso, de esa manera no necesita cambiar el código de creación de cliente predeterminado, aunque es mejor pasarlo como parámetro si no tiene credenciales predeterminadas
Si confía en sus .aws/credentials para almacenar la identificación y la clave de un usuario, se recogerá automáticamente.
Por ejemplo
session = boto3.Session(profile_name='dev') s3 = session.resource('s3') Esto seleccionará el perfil de desarrollador (usuario) si su archivo de credentials contiene lo siguiente:
[dev] aws_access_key_id = AAABBBCCCDDDEEEFFFGG aws_secret_access_key = FooFooFoo region=op-southeast-2