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 directorio en el almacenamiento de blobs entre cuentas de almacenamiento diferentes.

Estoy trabajando en un servicio de transferencia de datos, que copia los datos en un directorio específico del contenedor al contenedor de destino. Este servicio recibirá la URL del contenedor fuente con token SAS y el directorio que se debe copiar como entradas. (Suponga que la URL del contenedor de destino es estática)

He intentado utilizar el comando de shell azcopy utilizando el módulo subprocess y pude hacerlo. Pero ¿hay alguna otra manera de hacer lo mismo utilizando la biblioteca SDK de almacenamiento de blobs de Python sin listar primero todos los blobs en el directorio y copiarlos uno por uno en serie?

¿Hay algún servicio en la nube de Azure que realice la actividad de copia en algún desencadenador (llamada de API)?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, hay una manera de copiar los datos en un directorio específico del contenedor al contenedor de destino utilizando el SDK de Azure Blob Storage para Python. Puede usar el método sync_to_remote del objeto blob_client para realizar esta tarea. El método sync_to_remote copia el blob a otro contenedor de blobs sincrónicamente.

    Aquí hay un fragmento de código de ejemplo para copiar una carpeta de un contenedor fuente a un contenedor de destino utilizando el SDK de Azure Blob Storage para Python:

    from azure.storage.blob import BlobServiceClient, BlobClient
    from azure.storage.blob import ContentSettings, BlobSasPermissions
    import datetime, time
    
    # URL del contenedor fuente con token SAS
    source_container_url = "https://source_container.blob.core.windows.net/?sv=2021-08-01&ss=bjqt&srt=sco&sp=rwdlacupx&se=2022-10-27T07:59:39Z&st=2022-10-27T00:01:39Z&spr=https&sig=XXXXXXXXXXXXXXXXX"
    
    # URL del contenedor de destino
    destination_container_url = "https://destination_container.blob.core.windows.net/"
    
    # Nombre del directorio en el contenedor fuente
    directory_name = "directory_name"
    
    # Inicialice BlobServiceClient del contenedor fuente
    source_blob_service_client = BlobServiceClient.from_container_url(source_container_url)
    
    # Obtenga la lista de blobs en el directorio
    blobs_list = []
    for b in source_blob_service_client.list_blobs(directory_name):
        blobs_list.append(b)
    
    # Inicialice BlobServiceClient del contenedor de destino
    destination_blob_service_client = BlobServiceClient.from_container_url(destination_container_url)
    
    # Copie cada blob en el directorio al contenedor de destino
    for blob in blobs_list:
        blob_client = BlobClient.from_blob_url(blob.url, credential=blob_service_client.credential)
    
        # Construir URL de blob de destino
        destination_blob_url = destination_container_url + directory_name + "/" + blob.name
    
        # Iniciar proceso de copia
        destination_blob_client = BlobClient.from_blob_url(destination_blob_url, credential=blob_service_client.credential)
        destination_blob_client.start_copy_from_url(blob.url)
    
        # Espere a que se complete el proceso de copia
        props = destination_blob_client.get_blob_properties()
        while props.copy.status == 'pending':
            time.sleep(30)
            props = destination_blob_client.get_blob_properties()
    

    En cuanto a su segunda pregunta sobre la actividad de copia basada en disparador, puede usar Azure Functions para crear una función sin servidor que pueda ser desencadenada por una llamada API. La función de Azure puede usar el SDK de Azure Blob Storage para Python para copiar los datos en el directorio específico del contenedor al contenedor de destino.

Comments are closed.