es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Copiar objeto desde el cubo de Minio al cubo de S3.

Estoy tratando de usar nativo boto3 para copiar objetos desde un bucket de Minio a un bucket de AWS S3. He visto que el protocolo es exactamente el mismo, pero el problema está en el endpoint de los buckets. Sé que es posible a través del cliente mc, pero quiero usar el cliente nativo boto3. He configurado tanto el bucket de origen como el de destino como públicos, pero aún no lo he logrado. Aquí hay un código de ejemplo:

import boto3

SESSION_s3 = boto3.session.Session(region_name="MY_REGION")
s3 = SESSION_s3.client('s3',
                      aws_access_key_id='MY_ACCESS_KEY',
                      aws_secret_access_key='MY_SECRET_KEY')

SESSION_minio = boto3.session.Session(region_name="MY_REGION")
config = boto3.session.Config(signature_version='s3v4')
minio = SESSION_minio.client('s3', endpoint_url='http://my_minio_public_server:9000',
                             aws_access_key_id='username',
                             aws_secret_access_key='password', config=config)

src = {"Bucket": "minio_bucket", "Key": "example.jpg"}
s3.copy(src, "s3_bucket_name", "example.jpg", SourceClient=minio)

Esto lleva al siguiente error:

botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the CopyObject operation: Access Denied

¿Hay alguna manera de conseguir esta conectividad entre los dos clientes? ¿O hay alguna mejor idea? Teniendo en cuenta que el cliente de Minio no es una opción para mí.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El error que está recibiendo indica que se ha producido un error de Acceso denegado. Esto se debe generalmente a una mala configuración en la clave de acceso, clave secreta o política del cubo.

    Ha mencionado que ha configurado los cubos de origen y destino como públicos, sin embargo, es importante asegurarse de que las políticas IAM (Identidad y Acceso de AWS, por sus siglas en inglés) para ambos cubos también sean públicas. Puede hacer esto estableciendo las ACL (Listas de Control de Acceso, por sus siglas en inglés) correspondientes del cubo a través de la Consola de administración de AWS o mediante el siguiente código.

    s3 = boto3.client('s3', aws_access_key_id='MI_CLAVE_DE_ACCESO', aws_secret_access_key='MI_CLAVE_SECRETA',
                       endpoint_url='https://s3.amazonaws.com')
    s3.put_bucket_acl(Bucket='minio_bucket', ACL='lectura-pública')
    s3.put_bucket_acl(Bucket='nombre_cubo_s3', ACL='lectura-pública')
    

    También puede tratar de asegurarse de que está utilizando la URL del punto final correcta para Minio. La URL del punto final debe ser la URL de su servicio Minio con el puerto, la clave de acceso y la clave secreta.

    minio = boto3.client('s3', aws_access_key_id='nombre_usuario', aws_secret_access_key='contraseña',
                         endpoint_url='http://mi_servidor_publico_minio:9000')
    

    Además, puede tratar de establecer los permisos adecuados para los objetos que se van a copiar. Puede hacerlo actualizando la política del cubo de ambos cubos o estableciendo ACL específicas de objetos.

    minio.put_object_acl(Bucket='minio_bucket', Key='ejemplo.jpg', ACL='lectura-pública')
    

    Por último, si aún tiene dificultades, puede tratar de habilitar el registro de depuración para ver si se están produciendo otros errores. Puede hacer esto agregando las siguientes líneas a su script:

    import logging
    logging.basicConfig(level=logging.DEBUG)
    

    Esto habilitará el registro de depuración para boto3 y puede verificar los registros para ver si hay otros errores adicionales.

    Si aún tiene problemas, puede tratar de utilizar la biblioteca ‘botocore’ en lugar de ‘boto3’. ‘botocore’ es la biblioteca subyacente que utiliza ‘boto3’, y utilizarla directamente puede ayudarle a depurar cualquier problema.

    import botocore.session
    
    session = botocore.session.Session()
    s3 = session.create_client('s3', aws_access_key_id='MI_CLAVE_DE_ACCESO', aws_secret_access_key='MI_CLAVE_SECRETA',
                               region_name='MI_REGIÓN')
    minio = session.create_client('s3', aws_access_key_id='nombre_usuario', aws_secret_access_key='contraseña',
                                  endpoint_url='http://mi_servidor_publico_minio:9000',
                                  config=botocore.config.Config(signature_version='s3v4'))
    
    src = {"Bucket": "minio_bucket", "Key": "ejemplo.jpg"}
    s3.copy_object(CopySource=src, Bucket='nombre_cubo_s3', Key='ejemplo.jpg')
    

    Este código establece la sesión ‘botocore’, los clientes ‘s3’ y ‘minio’. Luego utiliza el método ‘copy_object’ directamente en el cliente ‘s3’ para copiar el objeto, en lugar de utilizar el método ‘copy’ como antes.

    Espero que esto ayude, y por favor avíseme si tiene cualquier otra pregunta o problema.

Comments are closed.