Olá pessoal, nesse post irei falar de uma ferramenta de linha de comando que poderá ajuda-lo na automatização das rotinas de transferências de arquivos com o Azure.
Você que já trabalhou com Windows já deve ter ouvido em algum momento falar sobre o robocopy certo? Bom, se nunca ouviu falar de uma olhada, é um utilitário de comando do windows que permite você manipular transferência de arquivos entre pastas e servidores de forma eficiente, um grande diferencial é o gerenciamento de interrupções, mas o robocopy é bem robusto e vai além, se você utiliza sistema operacional Windows execute o seguinte comando no seu prompt:
PS C:\Windows\system32> robocopy /?
Irá aparecer todas as opções possíveis e documentação dessa robusta ferramente.
![](https://static.wixstatic.com/media/a794bc_03c0d2a886ab43a0a24150824d572ebb~mv2.png/v1/fill/w_49,h_33,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/a794bc_03c0d2a886ab43a0a24150824d572ebb~mv2.png)
Contudo, o post não é sobre o Robocopy e sim sobre o AzCopy, apesar das semelhanças são ferramentas diferentes, principais diferenças:
AzCopy é multiplataforma, operando em Windows, Linux e Mac.
AzCopy é focado para cópia de e para uma Azure Storage Account.
AZCopy precisa de Download, não é nativo do sistema operacional, como o Robocopy.
Falando exclusivamente do AzCopy agora, essa ferramenta te proporciona a capacidade de poder copiar arquivos de qualquer lugar para uma Azure Storage Account dos tipos Blob (ADLS também) e File, inclusive pode copiar dados de um Bucket no S3 da AWS, as opções que mostrarei estarão focadas no Blob que é um dos mais usados.
Após fazer o download do seu AzCopy com o link abaixo, copie o executável para sua pasta C:\Windows\System32, ou configure sua variável de ambiente informando o local do arquivo para facilitar a utilização, ou você pode chamar direto o executável da pasta aonde ele estiver armazenado.
Reginaldo, por que a pasta System32, isso é pegadinha? Não, apenas porque ela é um dos caminhos que já estão configurados nas variáveis de ambiente.
Feito isso, abra um Powershell (ou um cmd, mas a telinha azul é mais fascinante rs) em modo administrador e digite o seguinte comando:
PS C:\Windows\system32> azcopy --help
![](https://static.wixstatic.com/media/a794bc_4b90a0936eba4a078e82ca7e869922d4~mv2.png/v1/fill/w_49,h_30,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/a794bc_4b90a0936eba4a078e82ca7e869922d4~mv2.png)
As demonstrações utilizarão um container no Blob do Azure, contudo, o Storage Account não é o foco deste post, falaremos em outros posts dele.
Para conectar o AzCopy ao Azure Storage Account você possui algumas opções como autenticação via Active Directory, Service Principal, SAS token, nessa demostração utilizarei o SAS (shared access signatures).
Primeiro passo, gere seu SAS Token via Azure porta, essa token será usada no comando Copy e Sync:
Se você tiver qualquer dúvida de como configurar uma Storage account com Blob e liberar os acessos via SAS, Access keys, AD, fique a vontade em me contatar.
![](https://static.wixstatic.com/media/a794bc_b4a7e898d3a44de59783d0f35e88847b~mv2.png/v1/fill/w_49,h_45,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/a794bc_b4a7e898d3a44de59783d0f35e88847b~mv2.png)
Salve o SAS token que irá aparecer após clicar no botão gerar SAS.
Vamos para o Powershell, na imagem que rodamos o azcopy --help você já viu a descrição dos comandos, destacarei 6 comandos legais e bem úteis.
Após o comando --help, o env poderá checar os valores das variáveis de ambiente do Azcopy, muito útil, pois, você pode customizar algumas variáveis para melhorar a paralelização e concorrência das cópias.
O comando benchmark faz diversos testes com opções diferentes para encontrar a melhor quantidade de conexões concorrentes e assim melhorar throughput.
![](https://static.wixstatic.com/media/a794bc_3360495440ad4133b48bb9db06860431~mv2.png/v1/fill/w_49,h_23,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/a794bc_3360495440ad4133b48bb9db06860431~mv2.png)
Você pode customizar essa concorrência com a variável de ambiente AZCOPY_CONCURRENCY_VALUE, exemplo:
$env:AZCOPY_CONCURRENCY_VALUE = 1000
Não existe o melhor valor, você pode deixar no AUTO para o AzCopy gerenciar ou no default que o cálculo é baseado na quantidade de processadores da maquina, a dica é, teste varias possibilidades para o seu ambiente.
Agora um comando sensacional, o Sync, com esse comando você pode manter uma pasta local sincronizada com um container no Blob, isso é, qualquer novo arquivo, alteração ou exclusão nesse diretório é replicado para o Blob.
Exemplo, dentro do meu Blob tenho um container chamado Salesdata e dentro dele criei uma pasta chamada Sync, na minha máquina local tem uma pasta no diretório C:\temp\Sample.
Observação, para visualizar os dados no Blob estou usando a ferramenta Azure Storage Explorer, você também pode usar para fazer upload e download de arquivos, por detrás dos panos ela utiliza o AzCopy também, inclusive você pode ver os comandos de AzCopy que são usados por ele.
![](https://static.wixstatic.com/media/a794bc_5c471468a583491696ca64b857d72467~mv2.png/v1/fill/w_49,h_28,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/a794bc_5c471468a583491696ca64b857d72467~mv2.png)
![](https://static.wixstatic.com/media/a794bc_7e144fa576f8486e92abb16f67a5e52f~mv2.png/v1/fill/w_49,h_50,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/a794bc_7e144fa576f8486e92abb16f67a5e52f~mv2.png)
A ideia é qualquer arquivo que for criado ou alterado dentro dessa pasta C:\Temp\sample replique para o Blob, com o AzCopy pode ser feito assim:
azcopy sync "C:\Temp\sample\" 'https://datalakereginaldo.blob.core.windows.net/salesdata/sync <coloque aqui seu SAS token>' --check-md5 FailIfDifferent --delete-destination true
Vou adicionar 1 arquivo .TXT nesse caminho C:\Temp\sample e rodar o comando.
![](https://static.wixstatic.com/media/a794bc_43ae845422584e3c8082e18d60e825c0~mv2.png/v1/fill/w_49,h_24,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/a794bc_43ae845422584e3c8082e18d60e825c0~mv2.png)
Para cada execução é gerado um Job ID e um log com todas as informações do que foi executado.
Irei alterar apenas uma vírgula dentro do arquivo criado e reexecutar 2 vezes seguidas:
![](https://static.wixstatic.com/media/a794bc_406dd10ada6b4f01a7fd787efdc3a710~mv2.png/v1/fill/w_49,h_42,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/a794bc_406dd10ada6b4f01a7fd787efdc3a710~mv2.png)
O Azcopy validou que o arquivo foi alterado na origem e replicou novamente para manter o destino exatamente igual, assim como também identificaria um arquivo novo na pasta e replicaria o mesmo, se um arquivo for excluído no destino ele também identifica e reenvia o arquivo novamente. Na segunda chamada nada foi identificado e nada transferido.
Pronto, agora você pode agendar um Job (no Windows, SQL, na sua aplicação...) e deixar suas pastas sincronizando com apenas 1 comando, tudo gerando logs para análises e troubleshooting.
Uma das grandes vantagens do AzCopy é se você estiver copiando um arquivo grande e sua conexão falhar, ele não reiniciará toda a cópia do início e sim continuar da onde parou, pois, ele divide a cópia em blocos, o tamanho de cada bloco pode ser configurado pelo parâmetro block-size-mb, podendo dividir um arquivo até 50 mil blocos e transferir arquivos de até 200 TB.
Nesse exemplo estou usando o comando copy, usado para copiar o arquivo para o Blob ou do Blob para sua máquina ou servidor, ou de um Blob para outro.
![](https://static.wixstatic.com/media/a794bc_f70555053cf948bc993aa3ed2f67d42f~mv2.png/v1/fill/w_49,h_34,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/a794bc_f70555053cf948bc993aa3ed2f67d42f~mv2.png)
Se por algum motivo você precisar pausar um Job, por algum gargalo de latência de rede ou discos, pode para-lo, ele vai salvar o status e manter na lista de jobs e em algum momento poderá reiniciá-lo de onde ele parou.
azcopy jobs list
![](https://static.wixstatic.com/media/a794bc_be0077c0f64947d5b70d8aefbecee75d~mv2.png/v1/fill/w_49,h_23,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/a794bc_be0077c0f64947d5b70d8aefbecee75d~mv2.png)
Obs: O status InProgress pode significar que o Job ainda está rodando ou ele foi pausado, infelizmente ainda não tem o status Paused, você pode utilizar o JOB ID localizar seu arquivo de Log e fazer a validação para saber se está ou não em execução.
Exemplo de um Job pausado e posteriormente reiniciado:
![](https://static.wixstatic.com/media/a794bc_53606a19283545f293baf4e6f3b6ce03~mv2.png/v1/fill/w_49,h_29,al_c,q_85,usm_0.66_1.00_0.01,blur_2,enc_auto/a794bc_53606a19283545f293baf4e6f3b6ce03~mv2.png)
Bom pessoal, sobre o AzCopy é isso, espero que tenha sido útil e que vocês possam ter inúmeras ideias de aplicação para o AzCopy, por ser um utilitário de linha de comando é flexível para automatização de rotinas e com o poder da multiplataforma.
Ah! Reginaldo, mas o Azure Data Factory não é melhor? Ok, chegaremos nessa reposta, aguarde os próximos posts.
Fiquem bem e até a próxima.
Referências: