Transfiere todos los contenedores de una cuenta de Azure Storage

El Servicio de transferencia de almacenamiento puede transferir datos de todos los contenedores dentro de una sola cuenta de Microsoft Azure Storage en un solo trabajo de transferencia. Esto simplifica el flujo de trabajo para casos de uso como la transferencia de registros distribuidos en varios contenedores.

Configura una transferencia para todos los contenedores

Para transferir todos los contenedores dentro de una cuenta de almacenamiento, especifica el contenedor de origen como * (un solo asterisco) en el objeto de la API pública AzureBlobStorageData o como https://AZURE_ACCOUNT_NAME.blob.core.windows.net/* cuando especifiques el origen en un comando gcloud.

No se admite especificar una carpeta de origen o path para las transferencias de varios contenedores. Consulta Cómo filtrar los contenedores y objetos que se transferirán para especificar rutas de acceso con prefijos.

Cuando se ejecuta el trabajo de transferencia, el Servicio de transferencia de almacenamiento primero consulta Azure para obtener una lista actualizada de todos los contenedores de la cuenta de almacenamiento especificada. Luego, para cada contenedor encontrado, crea una carpeta correspondiente en el destino y transfiere los datos del contenedor a esa carpeta nueva.

gcloud

El siguiente comando crea un trabajo de transferencia que transfiere todos los contenedores de la cuenta de Azure Storage especificada a un bucket de Cloud Storage.

gcloud transfer jobs create \
  https://AZURE_ACCOUNT_NAME.blob.core.windows.net/* \
  gs://GCS_BUCKET_NAME \
  --source-creds-file="PATH_TO_AZURE_SAS_FILE" \
  --project="PROJECT_ID"

Aquí:

  • AZURE_ACCOUNT_NAME: El nombre de tu cuenta de Azure Storage.
  • GCS_BUCKET_NAME: Es el nombre del bucket de destino de Cloud Storage.
  • PATH_TO_AZURE_SAS_FILE: Es la ruta de acceso local a un archivo de texto que contiene tu token SAS de Azure a nivel de la cuenta. Por ejemplo: ~/.azure/sas_token.txt. El token SAS se debe crear a nivel de la cuenta de almacenamiento con Servicio, Contenedor y Objeto seleccionados para Tipos de recursos permitidos. Consulta Configura el acceso a una fuente: Microsoft Azure Storage para obtener más detalles.
  • PROJECT_ID: Es el ID del proyecto de Google Cloud propietario de la transferencia.

REST

Para crear esta transferencia con la API de REST, realiza una solicitud POST al extremo https://storagetransfer.googleapis.com/v1/transferJobs.

Cuerpo de la solicitud:

{
  "description": "Transfer all containers from my Azure account",
  "projectId": "PROJECT_ID",
  "status": "ENABLED",
  "transferSpec": {
    "azureBlobStorageDataSource": {
      "storageAccount": "AZURE_ACCOUNT_NAME",
      "container": "*",
      "azureCredentials": {
        "sasToken": "AZURE_SAS_TOKEN"
      }
    },
    "gcsDataSink": {
      "bucketName": "GCS_BUCKET_NAME"
    }
  }
}

Aquí:

  • PROJECT_ID: Es el ID del proyecto de Google Cloud propietario de la transferencia.
  • AZURE_ACCOUNT_NAME: El nombre de tu cuenta de Azure Storage.
  • AZURE_SAS_TOKEN: Es la cadena completa del token de SAS a nivel de la cuenta, como ?sv=2020-08-04&ss=bfqt&srt=sco&.... El token SAS se debe crear a nivel de la cuenta de almacenamiento con Servicio, Contenedor y Objeto seleccionados para Tipos de recursos permitidos. Consulta Configura el acceso a una fuente: Microsoft Azure Storage para obtener más detalles.
  • GCS_BUCKET_NAME: Es el nombre del bucket de destino de Cloud Storage.

Biblioteca cliente

En este ejemplo, se usa la biblioteca cliente de Python google-cloud-storage-transfer para crear una transferencia.

from google.cloud import storage_transfer_v1

def create_transfer_all_azure_containers(
    project_id: str,
    description: str,
    azure_storage_account: str,
    azure_sas_token: str,
    gcs_sink_bucket: str,
):
    """Creates a transfer job from all containers in an Azure account to Cloud Storage."""

    client = storage_transfer_v1.StorageTransferServiceClient()

    transfer_job_request = storage_transfer_v1.CreateTransferJobRequest(
        {
            "transfer_job": {
                "project_id": project_id,
                "description": description,
                "status": storage_transfer_v1.TransferJob.Status.ENABLED,
                "transfer_spec": {
                    "azure_blob_storage_data_source": {
                        "storage_account": azure_storage_account,
                        "container": "*",  # Wildcard for all containers
                        "azure_credentials": {"sas_token": azure_sas_token},
                    },
                    "gcs_data_sink": {"bucket_name": gcs_sink_bucket},
                },
            }
        }
    )

    result = client.create_transfer_job(transfer_job_request)
    print(f"Created transfer job: {result.name}")

if __name__ == "__main__":
    create_transfer_all_azure_containers(
        project_id="PROJECT_ID",
        description="All-containers transfer from Azure",
        azure_storage_account="AZURE_ACCOUNT_NAME",
        azure_sas_token="AZURE_SAS_TOKEN",
        gcs_sink_bucket="GCS_BUCKET_NAME",
    )

Aquí:

  • PROJECT_ID: Es el ID del proyecto de Google Cloud propietario de la transferencia.
  • AZURE_ACCOUNT_NAME: El nombre de tu cuenta de Azure Storage.
  • AZURE_SAS_TOKEN: Es la cadena completa del token de SAS a nivel de la cuenta, como ?sv=2020-08-04&ss=bfqt&srt=sco&.... El token SAS se debe crear a nivel de la cuenta de almacenamiento con Servicio, Contenedor y Objeto seleccionados para Tipos de recursos permitidos. Consulta Configura el acceso a una fuente: Microsoft Azure Storage para obtener más detalles.
  • GCS_BUCKET_NAME: Es el nombre del bucket de destino de Cloud Storage.

Consulta Cómo crear transferencias para obtener más información sobre cómo crear transferencias y las opciones disponibles.

Filtra los contenedores y objetos que se transferirán

Puedes usar prefijos o un archivo de manifiesto para controlar qué contenedores y objetos se incluyen en la transferencia.

Filtrar por prefijo

Para transferir contenedores o rutas de acceso específicos dentro de los contenedores, proporciona una lista de includePrefixes o excludePrefixes. Cuando el campo del contenedor es *, el primer segmento de cada ruta de prefijo se trata como el nombre del contenedor. Esto te permite especificar diferentes rutas de acceso para diferentes contenedores dentro del mismo trabajo. Para aplicar un prefijo a todos los contenedores de la cuenta de almacenamiento, usa * como el primer segmento, por ejemplo, */PREFIX.

Por ejemplo, para transferir todo desde container-a, así como los objetos que se encuentran debajo de una ruta de acceso específica en container-b, establece los prefijos de inclusión de la siguiente manera:

"transferSpec": {
  ...
  "azureBlobStorageDataSource": {
    "storageAccount": "my-azure-account",
    "container": "*"
  },
  "objectConditions": {
    "includePrefixes": [
      "container-a",
      "container-b/logs/2025/"
    ]
  },
  ...
}

Esta configuración tiene las siguientes características:

  • Transfiere todos los objetos de container-a.
  • Transfiere todos los objetos de la ruta de acceso logs/2025/ desde container-b.
  • Omite todos los demás contenedores de la cuenta de almacenamiento.

Para transferir todos los objetos de la ruta de acceso logs/2025/ de cada contenedor de la cuenta de almacenamiento, especifica "*/logs/2025/" en includePrefixes.

Consulta Cómo filtrar por prefijo para obtener más información sobre los prefijos de inclusión y exclusión.

Cómo filtrar con un manifiesto

Para usar un archivo de manifiesto en una transferencia de varios contenedores, la ruta de acceso de cada objeto que se enumera en el archivo CSV del manifiesto debe comenzar con el nombre del contenedor.

Por ejemplo:

container-a/photos/photo1.jpg
container-a/photos/photo2.jpg
container-c/archive.zip

Consulta Transfiere objetos o archivos específicos con un manifiesto para obtener más detalles sobre los archivos de manifiesto.

Transferencias basadas en eventos

Las transferencias controladas por eventos desde Azure son compatibles con las configuraciones de varios contenedores.

Para obtener el mejor rendimiento y evitar el procesamiento innecesario de eventos, configura el filtro de eventos en Azure para especificar qué contenedores deben desencadenar eventos. Sin un filtro, se generarán eventos para todas las actualizaciones del contenedor dentro de la cuenta de almacenamiento.

Para obtener más detalles, consulta Transferencias controladas por eventos desde Azure Blob Storage.

Cuotas de la API de Azure

La transferencia desde muchos contenedores puede aumentar la cantidad de solicitudes a la API que se realizan a Azure. Las cuentas de Azure Storage tienen límites de frecuencia de solicitudes, que suelen ser de alrededor de 20,000 solicitudes por segundo. Si tienes una gran cantidad de contenedores, es posible que el Servicio de transferencia de almacenamiento limite el proceso de creación de listas para no superar estos límites.