Transferir todos os contêineres em uma conta de armazenamento do Azure

O Serviço de transferência do Cloud Storage pode transferir dados de todos os contêineres em uma única conta do Armazenamento do Microsoft Azure em um único job de transferência. Isso simplifica o fluxo de trabalho para casos de uso como a ingestão de registros espalhados por vários contêineres.

Configurar uma transferência para todos os contêineres

Para transferir todos os contêineres em uma conta de armazenamento, especifique o contêiner de origem como * (um único asterisco) no objeto da API pública AzureBlobStorageData ou como https://AZURE_ACCOUNT_NAME.blob.core.windows.net/* ao especificar a origem em um comando gcloud.

Não é possível especificar uma pasta de origem ou path para transferências de vários contêineres. Consulte Filtrar quais contêineres e objetos transferir para especificar caminhos usando prefixos.

Quando o job de transferência é executado, o Serviço de transferência do Cloud Storage primeiro consulta o Azure para receber uma lista atualizada de todos os contêineres na conta de armazenamento especificada. Em seguida, para cada contêiner encontrado, ele cria uma pasta correspondente no destino e transfere os dados do contêiner para essa nova pasta.

gcloud

O comando a seguir cria um job de transferência que transfere todos os contêineres da conta especificada do Azure Storage para um bucket do 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"

Em que:

  • AZURE_ACCOUNT_NAME: o nome da sua conta do Azure Storage.
  • GCS_BUCKET_NAME: o nome do bucket de destino do Cloud Storage.
  • PATH_TO_AZURE_SAS_FILE: o caminho local para um arquivo de texto que contém o token SAS do Azure no nível da conta. Por exemplo, ~/.azure/sas_token.txt. O token SAS precisa ser criado no nível da conta de armazenamento com Serviço, Contêiner e Objeto selecionados em Tipos de recursos permitidos. Consulte Configurar o acesso a uma origem: Microsoft Azure Storage para mais detalhes.
  • PROJECT_ID: o ID do projeto do Google Cloud que é proprietário da transferência.

REST

Para criar essa transferência com a API REST, faça uma solicitação POST para o endpoint https://storagetransfer.googleapis.com/v1/transferJobs.

Corpo da solicitação:

{
  "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"
    }
  }
}

Em que:

  • PROJECT_ID: o ID do projeto do Google Cloud que é proprietário da transferência.
  • AZURE_ACCOUNT_NAME: o nome da sua conta do Azure Storage.
  • AZURE_SAS_TOKEN: a string completa do token SAS no nível da conta, como ?sv=2020-08-04&ss=bfqt&srt=sco&.... O token SAS precisa ser criado no nível da conta de armazenamento com Serviço, Contêiner e Objeto selecionados para Tipos de recursos permitidos. Consulte Configurar o acesso a uma origem: Microsoft Azure Storage para mais detalhes.
  • GCS_BUCKET_NAME: o nome do bucket de destino do Cloud Storage.

Biblioteca de cliente

Este exemplo usa a biblioteca de cliente Python google-cloud-storage-transfer para criar uma transferência.

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",
    )

Em que:

  • PROJECT_ID: o ID do projeto do Google Cloud que é proprietário da transferência.
  • AZURE_ACCOUNT_NAME: o nome da sua conta do Azure Storage.
  • AZURE_SAS_TOKEN: a string completa do token SAS no nível da conta, como ?sv=2020-08-04&ss=bfqt&srt=sco&.... O token SAS precisa ser criado no nível da conta de armazenamento com Serviço, Contêiner e Objeto selecionados para Tipos de recursos permitidos. Consulte Configurar o acesso a uma origem: Microsoft Azure Storage para mais detalhes.
  • GCS_BUCKET_NAME: o nome do bucket de destino do Cloud Storage.

Consulte Criar transferências para mais informações sobre como criar transferências e as opções disponíveis.

Filtrar quais contêineres e objetos transferir

É possível usar prefixos ou um arquivo de manifesto para controlar quais contêineres e objetos são incluídos na transferência.

Filtrar por prefixo

Para transferir contêineres ou caminhos específicos dentro de contêineres, forneça uma lista includePrefixes ou excludePrefixes. Quando o campo do contêiner é *, o primeiro segmento de cada caminho de prefixo é tratado como o nome do contêiner. Isso permite especificar caminhos diferentes para contêineres diferentes no mesmo job. Para aplicar um prefixo a todos os contêineres na conta de armazenamento, use * como o primeiro segmento, como */PREFIX.

Por exemplo, para transferir tudo de container-a e objetos abaixo de um caminho específico em container-b, defina os prefixos de inclusão da seguinte forma:

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

Essa configuração:

  • Transfere todos os objetos de container-a.
  • Transfere todos os objetos no caminho logs/2025/ de container-b.
  • Ignora todos os outros contêineres na conta de armazenamento.

Para transferir todos os objetos no caminho logs/2025/ de todos os contêineres na conta de armazenamento, especifique "*/logs/2025/" em includePrefixes.

Consulte Filtrar por prefixo para mais informações sobre prefixos de inclusão e exclusão.

Filtrar usando um manifesto

Para usar um arquivo de manifesto em uma transferência de vários contêineres, o caminho de cada objeto listado no arquivo CSV de manifesto precisa começar com o nome do contêiner.

Exemplo:

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

Consulte Transferir arquivos ou objetos específicos usando um manifesto para mais detalhes sobre arquivos de manifesto.

Transferências baseadas em eventos

As transferências baseadas em eventos do Azure são compatíveis com configurações de vários contêineres.

Para ter o melhor desempenho e evitar o processamento desnecessário de eventos, configure seu filtro de eventos no Azure para especificar quais contêineres devem acionar eventos. Sem um filtro, os eventos serão gerados para todas as atualizações de contêiner na conta de armazenamento.

Para mais detalhes, consulte Transferências baseadas em eventos do Azure Blob Storage.

Cotas de API do Azure

A transferência de muitos contêineres pode aumentar o número de solicitações de API feitas ao Azure. As contas do Azure Storage têm limites de taxa de solicitação, geralmente em torno de 20.000 solicitações por segundo. Se você tiver um número muito grande de contêineres, o Serviço de transferência do Cloud Storage poderá limitar o processo de listagem para permanecer dentro desses limites.