Esta es la contestación más válida que te podemos aportar, sin embargo obsérvala detenidamente y valora si se puede adaptar a tu proyecto.
Solución:
No está utilizando la sesión que creó para descargar el archivo, está utilizando el cliente s3 que creó. Si desea utilizar el cliente, debe especificar las credenciales.
your_bucket.download_file('k.png', '/Users/username/Desktop/k.png')
o
s3 = boto3.client('s3', aws_access_key_id=... , aws_secret_access_key=...)
s3.download_file('your_bucket','k.png','/Users/username/Desktop/k.png')
A partir de un ejemplo en la documentación oficial, el formato correcto es:
import boto3
s3 = boto3.client('s3', aws_access_key_id=... , aws_secret_access_key=...)
s3.download_file('BUCKET_NAME', 'OBJECT_NAME', 'FILE_NAME')
También puede usar un objeto similar a un archivo abierto en modo binario.
s3 = boto3.client('s3', aws_access_key_id=... , aws_secret_access_key=...)
with open('FILE_NAME', 'wb') as f:
s3.download_fileobj('BUCKET_NAME', 'OBJECT_NAME', f)
El código en cuestión utiliza s3 = boto3.client ('s3')
que no proporciona ninguna credencial.
El formato para autenticar un cliente se muestra aquí:
import boto3
client = boto3.client(
's3',
aws_access_key_id=ACCESS_KEY,
aws_secret_access_key=SECRET_KEY,
aws_session_token=SESSION_TOKEN,
)
# Or via the Session
session = boto3.Session(
aws_access_key_id=ACCESS_KEY,
aws_secret_access_key=SECRET_KEY,
aws_session_token=SESSION_TOKEN,
)
Y, por último, también puede reutilizar la sesión autenticada que creó para obtener el depósito y luego descargar el archivo del depósito.
from boto3.session import Session
import boto3
ACCESS_KEY = 'ABC'
SECRET_KEY = 'XYZ'
session = Session(aws_access_key_id=ACCESS_KEY,
aws_secret_access_key=SECRET_KEY)
# session is authenticated and can access the resource in question
session.resource('s3')
.Bucket('bucket_name')
.download_file('k.png','/Users/username/Desktop/k.png')
Comentarios y calificaciones
Si te animas, puedes dejar una sección acerca de qué le añadirías a esta división.