BlobFuse - Azure Blob Storage como Filesystem no Linux
Tags: azure, linux, cloud, infrastructure
Published: 2021-02-02 04:41:16

Fala comunidade!

Depois de um tempo ausente, estamos de volta com força total e sem hiatos! 

E nada melhor do que tirar a poeira da mobília com um post bacana sobre Infra Azure, concordam?

Bom, vamos lá!

Antes de mais nada, a primeira coisa a ser entendida antes de entrarmos no técnico é: <b>Já ouviram falar sobre Blobfuse?</b>

<b>Blobfuse</b> é um driver utilizado em sistemas operacionais baseados em Linux (diferentes distros) que simula um filesystem que aponta direto para um blob storage do Azure, ou seja, através do driver, o Blobfuse simula um diretório virtual.

O Blobfuse dá suporte à instalação nas seguintes distros: 
- Ubuntu: 16, 4, 18, 4 e 20, 4
- RHELversions: 7.5, 7.8, 8.0, 8.1, 8.2
- CentOS: 7.0, 8.0
- Debian: 9.0, 10.0
- SUSE: 15
- OracleLinux 8.1

Mas will, não seria mais fácil apontar diretamente para um <b>File Share</b> dentro do meu Blob Storage?

Depende!

Por dois motivos:
- File Share tem o limite de <b>5TB</b>, parece muito, mas tratando-se de armazenamento, acreditem, não é!
- Exige o uso do protoclo <b>SMB 3.0</b> para ser usado nas distros listadas acima.

Então avalie bem a sua necessidade.

Agora que já entendemos o Blobfuse, vamos à prática?

Primeiramente vamos logar no portal do Azure (www.portal.azure.com) e abrir o <b>Cloud Shell</b> para executarmos comandos na linguagem Powershell (imagem abaixo).

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/4qv2oe89wlbukzq9is3c.jpg)

Obs: Se preferir, pode fazer isso direto pela console do Powershell ISE também, basta apenas logar na sua subscription.

Daqui pra frente nós vamos usar scripts powershell para a criação da Sorage Account, CLI para a criação da VM e o Packer para o deploy da imagem.

Logado no Powershell, execute os comandos abaixo:
<b>Listar as suas Subscriptions (caso tenha mais de uma)</b>
- Get-AzSubscription

<b>Selecionar o ID da sua Subscription e insira-o como parâmetro</b>
- Set-AzContext -Subscription "xxxxx-xxxxx-xxxxxxxxxxxxxxxx"

<b>Crie seu Resource Group (RG)</b>
- $resourceGroup = "BlobFuseWiluey" (<i>Aqui crie o nome que quiser</i>)
- $location = "eastus"
- New-AzResourceGroup -Name $resourceGroup -Location $location

<b>Crie a Storage Account</b>
- $storageAccount = New-AzStorageAccount -ResourceGroupName $resourceGroup -Name "blobfusestoragewill" -SkuName Standard_LRS -Location $location
- $ctx = $storageAccount.Context

<b>Crie o Container Storage</b>
- $containerName = "blobfuse-will-azure"
- New-AzStorageContainer -Name $containerName -Context $ctx -Permission blob

Aqui finalizamos a primeira etapa, já temos nossa Storage Account criada.

Agora vamos brincar um pouco com DevOps e gerar a imagem da nossa máquina virtual com o Packer.

Não conhece o <b>Packer</b>?

O Packer é um dos produtos da HashiCorp (como o Terraform), criado para gerar e gerenciar imagens de forma automatizada. 
O Packer é capaz de construir a imagem de sua aplicação, banco de dados ou sistema operacional utilizando os seus mesmos <b>playbooks</b> e scripts inseridos no Userdata.

Uma vantagem do Packer é possibilidade de criar imagens multiplataforma com o mesmo código, uma vez que ele é compatível com AWS, Microsoft Azure, Google Cloud, VMWare, Docker, Digital Ocean, dentre outras.
O Packer não substitui os seus <b>configurations managers</b>, mas faz uso deles para provisionar as imagens criadas.

Agora vamos lá!

Altere o seu Cloud Shell agora para usar o Bash, onde vamos executar scripts CLI (imagem abaixo).

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/wptvix1pcbjjkhd3pt5k.jpg)

Feito isso, vamos "setar" a <b>subscription</b> correta, não vamos provisionar o recurso no lugar errado, certo?

<b>Execute o comando abaixo para listar suas Subscriptions:</b>
- az account show

<b>"Sete" a Subscription:</b>
- az account set --subscription "xxxxxxx-xxxxxxxxx-xxxxxxxxxxxxxx"

Como não vamos criar uma VM para servir como nosso <i>configuration Manager</i>, vamos usar o módulo nativo do Azure.
Porém para usar o módulo nativo, e necessário gerar uma role de acesso (RBAC) para gerar os códigos que serão usados no script para autenticação.

<b>Execute o comando abaixo e guarde os ID's gerados</b>
- az ad sp create-for-rbac --query "{ client_id: appId, client_secret: password, tenant_id: tenant }"

<b>Com o comando abaixo você pega o ID da Subscription</b>
- az account show --query "{ subscription_id: id }"

<b>Obs:</b> Não transfira, ceda ou mostre publicamente esse ID para NINGUÉM!

Basicamente os comandos acima lhe trarão os IDs dos parametros abaixo:
 - "client_id":       "xxxxx-xxxxxxxx-xxxxxxxxxxxxxxx"
 - "client_secret":   "xxxxx-xxxxxxxx-xxxxxxxxxxxxxxx"
 - "tenant_id":       "xxxxx-xxxxxxxx-xxxxxxxxxxxxxxx"
 - "subscription_id": "xxxxx-xxxxxxxx-xxxxxxxxxxxxxxx"

Agora com os IDs em mãos, vá para o Cloud Shell (em modo BASH) e gere o JSON com as configuraçõe da nossa imagem.

O script com o JSON está no meu <b>GitHub</b>, pegue-o no link abaixo:
- https://github.com/Wiluey/packer/blob/master/RedHat7.json

Agora que possui o JSON, execute o comando o comando abaixo (no BASH):
- <b>vi RedHat7.json</b> <i>(um novo arquivo será criado)</i>
- Tecle <b>"I"</b>(insert) e cole o JSON dentro deste arquivo novo que foi aberto com o "vi"
- Tecle <b>ESC</b> seguido de <b>:wq</b> <i>(para salvar e sair)</i>

Agora com o JSON criado, vamos chamado o módulo do PACKER para gerar a nossa imagem.

Execute o comando abaixo:
- <b>packer build RedHat7.json</b>

Uma imagem parecida vai informar o status do Deploy:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/nl675lhi4nbgs6k15bpf.jpg)

O tempo de geração da imagem leva em torno de 10 a 12 minutos.

Quando o processo finalizar, teremos o output abaixo:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/75devrmptvnftn30y4j8.jpg)

E indo até o Resource Group, você verá o recurso provisionado:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/a4c31qr8jx6wuytnjyq2.jpg)

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/bq9mmxkno3ytwp0m4zjo.jpg)

Repare que em "Data Disks" não há nenhuma LUN ou LVM montado. Isso foi proposital para que a minha imagem fosse a mais "limpa" possível.
E o <b>Blobfuse<b> vai fazer esse papel depois...

Agora é o momento de criarmos nossa máquina virtual Linux Red Hat 7 a partir da nossa imagem.

No Cloud Shell (em modo BASH), execute o comando abaixo:
- az vm create --resource-group BlobFuseWiluey --name WilueyVmLinux --image PackerImageBlobfuse --admin-username wiluey --admin-password "xxxxxx" <i>(senha forte aqui)</i>

Após o deploy da nova VM criada a partir da nossa imagem, teremos um output confirmando o IP Publico atribuído a ela (conforme imagem):
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/ceg0khw1com6wxi1keci.jpg)

Agora vamos testar/validar o acesso à nossa máquina virtual, execute o comando:
- <b>ssh seuuser@seuippublico</b>

O output:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/cyxprjzi81w4rtbpo5zg.jpg)

Sucesso!

Agora a etapa final, criar o Blobfuse e fazer o linux reconhecer nosso container como um filesystem.

A imagem abaixo comprova que nossa distro possui apenas os pontos de montagem padrão (o "barra").
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/vhwmapq7da0ys6ho0msm.jpg)

Logados no Linux, o primeiro passo é criar as variáveis de ambiente globais, utilizando o comando <b>export</b>:
- export AZURE_STORAGE_ACCOUNT=nome_da_sua_storage_account
- export AZURE_STORAGE_ACCESS_KEY=a_sua_chave_de_acesso

Não sabe onde encontra isso?
Vem comigo!

Execute o comando abaixo:
- az storage account keys list -g BlobFuseWiluey -n blobfusestoragewill

Obviamente alterando os parâmetros para os seus, onde <b>"-g"</b> é o nome do Resource Group e <b>"-n"</b> é o nome da Storage Account.

O output:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/rzqtz50k6tmgsp1fx7wu.jpg)

Na variável de ambiente, basta inserir o valor retornado em "value" da <b>Key1</b>.

Criadas as variáveis, agora vamos criar os diretórios que serão nossos binários.

Primeiramente eleve seus privilégios:
- <b>sudo su</b>

Depois execute os comandos abaixo <i>(inserindo o nome que quiser)</i>:
- <b>cd /home/wiluey</b>
- <b>mkdir blobfuse-mount-will/</b>
- <b>chown wiluey:wiluey blobfuse-mount-will/</b>

Acima estamos autorizando o usuário a acessar nosso filesystem, afinal não podemos usar o <b>root</b> o tempo todo, até mesmo por questões de segurança.

Execute a instalação do Blobfuse:
- <b>rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm</b>
- <b>yum install blobfuse -y</b>

Crie uma pasta temporária vazia:
- <b>mkdir /blobfuse-mount-will-tmp</b>

Agora vamos fazer o "mount" do nosso diretório com o Blobfuse:
- <b>blobfuse /home/wiluey/blobfuse-mount-will --container-name=blobfuse-will-azure --tmp-path=/blobfuse-will-tmp</b>

Vamos validar se o filesystem foi devidamente reconhecido pelo SO:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/imhi7brhsga4wizjj90p.jpg)

Sucesso!

Vamos fazer o teste e copiar algum arquivo para nosso container storage, o mesmo deve aparecer no Linux, certo?

Existem diversas maneiras, mas pra ganharmos tempo, vou fazer o upload via Portal.

Fazendo uma primeira verificação, constatamos que o volume está vazio.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/l6ma92jubet5yxqpi33r.jpg)

Navegue até seu Container Storage, selecione um arquivo qualquer da sua máquina e faça o upload do mesmo para o Azure conforme imagem abaixo:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/flvddzdshrevhpelj9ow.jpg)

Arquivo encontra-se no container após o upload:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/7uopqjthf482nufsihve.jpg)

Vamos ver se ele está na VM, dentro do nosso filesystem?
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/6mw1ioxtkous3dl5thbf.jpg)

<b>Voilà!</b>

Tudo certo, nosso filesystem foi reconhecido com sucesso e está acessível!

Existem outras opções para uso de área temporária, como o <b>ramdisk</b>, que consiste em usar parte da sua memória RAM como se fosse um disco local, mas isso fica pro próximo post, ainda tem muito assunto sobre Infra Azure para falarmos.

Agora um <b>ponto de atenção</b> super importante:
Este foi apenas um laboratório que servirá de estudos e aprendizado aos leitores.
E por ser um laboratório, diversas regras de segurança foram deixadas de lado, portanto se um dia houver a necessidade de criar uma arquitetura desta em ambiente produtivo, conte com um arquiteto experiente que conheça bem a <b>segurança</b> do Azure e as boas práticas para manter os dados da sua empresa seguros, não arrisque as práticas deste tutorial!

Acompanhem o blog para ficar por dentro do mundo Cloud Computing!

Grande abraço e até a próxima!