Quiero enumerar los objetos de un cubo. Usé el siguiente código en boto y funcionó bien
from boto.s3.connection import S3Connection from boto.s3.connection import OrdinaryCallingFormat from boto.s3.key import Key destination = S3Connection(aws_access_key_id=aws_access_key_id, aws_secret_access_key='lokesh', is_secure=False, port=9090, host=host, calling_format=OrdinaryCallingFormat()) destination_bucket = destination.get_bucket(bucket_name) destination_all_keys = destination_bucket.get_all_keys() print destination_all_keys for key in destination_all_keys: print keySin embargo, si estoy usando boto3, recibo un error
botocore.exceptions.ClientError: se produjo un error (MethodNotAllowed) al llamar a la operación ListObjects: el método especificado no está permitido en este recurso.
a continuación se muestra el código boto3 que da error
import boto3 destination = boto3.client('s3', endpoint_url=endpoint, aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key, use_ssl=False, config=timeout_config ) destination.list_objects(Bucket=bucket_name)['Contents']La forma correcta de hacer esto es en boto3 usando la sesión de boto3.
import boto3 sess = boto3.session( endpoint_url=endpoint, aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key, use_ssl=False, config=timeout_config) s3 = sess.client("s3") s3.list_objects(Bucket=bucket_name)Además, pasar la clave API es un mal diseño. Si implementa la aplicación en cualquier servicio de AWS que use roles de IAM, las líneas de la clave de acceso le darán dolor de cabeza.
Simplemente configure su archivo de credenciales .aws local y puede usar una configuración simple como esta.
import boto3 sess = boto3.session( endpoint_url=endpoint, use_ssl=False, config=timeout_config) s3 = sess.client("s3") s3.list_objects(Bucket=bucket_name)