Magalu Cloud: Experimentando o serviço de armazenamento de objetos

Johnnes Cruz
luizalabs
Published in
7 min readMay 23, 2024

Introdução

O serviço de armazenamento de objetos (Storage objects) é um dos mais elementares de um provedor de cloud e nesse artigo pretendo trazer uma experimentação dele fornecido pelo Magalu. Nesse experimento irei utilizar a região Nordeste localizada em Fortaleza (br-ne1) mas existe a região Sudeste que está em São Paulo (br-se1).

Interface Gráfica (console)

Telas de login já tem uma forma padrão de ser construída e com o serviço de Magalu Cloud (MGC) não é diferente, porém logo de cara vemos uma boa funcionalidade: As contas de usuários foram integradas com o SuperApp e o site, isto é, se você já tem conta no e-commerce do Magazine Luiza não precisa criar uma nova para o serviço de cloud.

Tela de login

A próxima tela demonstra os serviços disponíveis e suas regiões, atualmente o serviço MGC tem disponibilidade na região Nordeste e Sudeste. O Turia IAM é o serviço que realiza controle de acessos, grupos de usuários, etc. Mas o foco desse artigo será o Object Storage.

Tela inicial do serviço do MGC

O processo de criar um bucket é bastante simples, são disponibilizados os seguintes campos de um formulário: Região, permissões de acesso e o nome que precisa ser único (O próprio serviço te apresenta um nome válido). As permissões de acesso são:

  • Privado: Os arquivos somente são acessados por autorizações de usuários da cloud;
  • Público: Os arquivos podem ser acessados por todos os usuários.
Tela de criação de bucket

Com o bucket criado você terá a listagem de buckets na região selecionada e as opções de torna-lo público, criar acesso via ACL ou exclui-lo. O acesso via ACL te permite informar um email de usuário e disponibilizar acesso a esse usuário.

Tela de listadem de buckets

O MGC ainda não tem um painel para operar o bucket e atualmente deve ser realizado via linha de comando (CLI), então vamos lá.

O processo para configurar o CLI é necessário criar uma API Key que é o mecanismo de controle de acessos, segue exemplo:

Tela para criar uma API Key

Command Line Interface (CLI)

A linha de comando é uma forma padrão que os serviços de cloud disponibilizam para os usuários operarem os recursos na nuvem. O MGC possui seu próprio CLI mas também existe a compatibilidade com outros CLI como AWS e o rclone.

Instalando o CLI

Estou utilizando sistema linux (Pop!_OS 22.04 LTS) e portanto seguirei o tutorial de instalação para linux, mas existem outras formas.

# Realizando download
$ curl -O https://github.com/MagaluCloud/mgccli/releases/download/v0.18.6/mgccli_0.18.6_linux_arm64.tar.gz

# Criando um diretório na home do teu usuário
$ mkdir ~/mgc_cli

# Extraindo arquivos
$ tar -xvf mgc_0.18.3_linux_amd64.tar.gz -C ~/mgc_cli

# Configurando variável de ambiente para rodar comandos com mgc em qualquer diretório
$ export PATH=$HOME/mgc_cli:$PATH

Processo de instalação finalizado com sucesso!

$ mgc -v
mgc version v0.18.6

Configurando o CLI

1 — Realize o login

$ mgc auth login

2 — Após o login, outras configurações como output e a região que irá trabalhar

# Configurando os tipos de saídas
# Detalhes de outros formatos: mgc - cli.output help
$ mgc config set defaultOutput json

# Configurando a região (Nordeste: br-ne1 Sudeste: br-se1)
# Listar regiões: mgc config get-schema region -o jsonpath=$.enum
$ mgc config set region "br-ne1"

3 — Configure a API Key criada

# Listando as api keys
$ mgc object-storage api-key list

Saída:

A saída tem 2 resultados, uma é a minha chave do portal e a outra foi a criada. Poderia usar do portal mas para controlar acessos é uma boa prática não usar a “padrão”.

[
{
"description": "",
"key_pair_id": "UUID",
"key_pair_secret": "UUID",
"name": "Portal",
"start_validity": "2024-04-20T00:00:00Z",
"tenant_name": "Johnnes Santos",
"uuid": "UUID"
},
{
"description": "",
"key_pair_id": "UUID",
"key_pair_secret": "UUID",
"name": "test-mgc-io",
"start_validity": "2024-04-28T00:00:00Z",
"tenant_name": "Johnnes Santos",
"uuid": "UUID"
}
]

Selecionado a API Key criada (Usar o UUID do test-mgc-io)

$ mgc object-storage api-key set {uuid}

Saída:

{
"description": "",
"key_pair_id": "UUID",
"key_pair_secret": "UUID",
"name": "test-mgc-io",
"start_validity": "2024-04-28T00:00:00Z",
"tenant_name": "Johnnes Santos",
"uuid": "UUID"
}

Pronto, CLI configurada.

Realizando operações básicas

Criando um bucket

# Existe o parâmetro - region nos comandos caso deseje especificar diferente
# do configurado no setup da cli
$ mgc object-storage buckets create "private-mgc-io2"

Saída:

{
"enable_versioning": true,
"name": "private-mgc-io2"
}

Listagem de buckets

$ mgc object-storage buckets list

Saída:

{
"Buckets": [
{
"CreationDate": "2024-04-28T21:48:27.000Z",
"Name": "private-mgc-io"
},
{
"CreationDate": "2024-04-28T23:23:54.000Z",
"Name": "private-mgc-io2"
}
],
"Owner":{
"DisplayName": "UUID",
"ID": "UUID"
}
}

Excluir bucket

# Por mais que o nome precisa ser único é necessário especificar a região
# A região padrão é br-se1
$ mgc object-storage buckets delete "private-mgc-io2"

Saída:

# Solicita a confirmação de exclusão
This command will delete bucket private-mgc-io2, and its result is NOT reversible.
Please confirm by retyping: private-mgc-io2 private-mgc-io2

Upload de arquivo

$ mgc object-storage objects upload --src "./index.html" --dst "private-mgc-io"

Saída:

Uploading index.html … done! [22B in 986ms]
{
"file": "index.html",
"uri": "private-mgc-io/index.html"
}

Listando arquivos de um bucket

$ mgc object-storage objects list --dst "private-mgc-io"

Saída:

{
"CommonPrefixes": [],
"Contents":[
{
"ContentSize": 22,
"Key": "index.html",
"LastModified": "2024–04–28T23:48:17.126Z"
}
]
}

Obter a url de um arquivo

$ mgc object-storage objects public-url --dst "private-mgc-io/index.html"

Saída:

{
"url": "https://br-ne1.magaluobjects.com/private-mgc-io/index.html"
}

Como o acesso é privado e não está disponível na internet ao buscar o dado pela url usando o curl ou navegador temos a seguinte saída:

$ curl https://br-ne1.magaluobjects.com/private-mgc-io/index.html

Saída:

<?xml version='1.0' encoding='UTF-8'?>
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied.</Message>
<RequestId>17a78c28–0cb5–45a9–9566-df5f3c015295</RequestId>
</Error>

Disponibilizando url assinada para download seguro

$ mgc object-storage objects presign - dst "private-mgc-io/index.html" - expires-in "5m"

Saída:

{
"url": "https://br-ne1.magaluobjects.com/private-mgc-io/index.html?X-Amz-Algorithm=AWS4-HMAC-SHA256\\u0026X-Amz-Credential=5e34a423-2ae3-4043-bbaa-364e4b3d592a%2F20240428%2Fus-east-1%2Fs3%2Faws4_request\\u0026X-Amz-Date=20240428T234529Z\\u0026X-Amz-Expires=300\\u0026X-Amz-Signature=2337f43b7c231788804aca394f9766ee8873168a5e6048d93978ace723d8356c\\u0026X-Amz-SignedHeaders=host"
}

Agora que temos um link com assinatura para o arquivo podemos visualiza-lo:

$ curl $(echo '{"url": "https://br-ne1.magaluobjects.com/private-mgc-io/index.html?X-Amz-Algorithm=AWS4-HMAC-SHA256\\u0026X-Amz-Credential=5e34a423-2ae3-4043-bbaa-364e4b3d592a%2F20240428%2Fus-east-1%2Fs3%2Faws4_request\\u0026X-Amz-Date=20240428T234529Z\\u0026X-Amz-Expires=300\\u0026X-Amz-Signature=2337f43b7c231788804aca394f9766ee8873168a5e6048d93978ace723d8356c\\u0026X-Amz-SignedHeaders=host"}' | jq .url -r)

Saída:

<h1>Hello world!</h1>

Ao disponibilizar um arquivo para download externo você ainda mantém o mesmo mecanismo de permissão do acesso ao arquivo e caso queira que o arquivo fique disponível para acesso/download na internet é preciso que você configure o ACL.

Configurando ACL para um arquivo

$ mgc object-storage objects acl set "private-mgc-io/index.html" - public-read

Agora sim, podemos obter o arquivo acessando com a url assinada:

$ curl https://br-ne1.magaluobjects.com/private-mgc-io/index.html?X-Amz-Algorithm=AWS4-HMAC-SHA256\\u0026X-Amz-Credential=5e34a423-2ae3-4043-bbaa-364e4b3d592a%2F20240428%2Fus-east-1%2Fs3%2Faws4_request\\u0026X-Amz-Date=20240428T234529Z\\u0026X-Amz-Expires=300\\u0026X-Amz-Signature=2337f43b7c231788804aca394f9766ee8873168a5e6048d93978ace723d8356c\\u0026X-Amz-SignedHeaders=host

Saída:

<h1>Hello world!</h1>

Acesso pela url do arquivo

curl https://br-ne1.magaluobjects.com/private-mgc-io/index.html

Saída:

<h1>Hello world!</h1>

As opções de ACL são (Mais detalhes):

  • private: O dono tem acesso total e somente os usuários com permissão podem acessar;
  • public-read: O dono tem acesso total e é aberto para leitura para todos;
  • grant-write: Configurar permissão de escrita |

Excluindo arquivo

$ mgc object-storage objects delete - dst "private-mgc-io/index.html"

Saída:

# Solicita a confirmação de exclusão
This command will delete the object at private-mgc-io/index.html, and its result is NOT reversible.
Please confirm by retyping: private-mgc-io/index.html private-mgc-io/index.html

Existem outras operações para o CLI mas nesse primeiro experimento gostaria de mostrar essas as operações mais básicas.

Comandos para repetir o experimento

mgc --version

mgc object-storage buckets create "private-mgc-io"

mgc object-storage objects list --dst "private-mgc-io"

mgc object-storage objects upload --src "./index.html" --dst "private-mgc-io"

mgc object-storage objects presign --dst "private-mgc-io/index.html" --expires-in "5m" > "file.json"

curl $( cat file.json | jq .url -r)

mgc object-storage objects acl get "private-mgc-io/index.html"

Salve esse trecho em um arquivo .sh, crie um arquivo index.html e execute bash -x <mgc-experiment>.sh

Conclusão

O serviço de cloud do Magalu é uma ideia interessante principalmente por já nascer com 2 regiões de disponibilidade, logo que lançarem ao público novos serviços essa característica pode fornecer mecanismos de alta disponibilidade de sistemas que estão hospedados no Brasil.

A compatibilidade com a AWS é uma boa forma de facilitar a adoção pelas empresas por utilizar a ferramenta de CLI da AWS e o SKD, nesse experimento não demonstrei essa funcionalidade mas na documentação oficial possui os comandos que executei usando a AWS CLI.

Porém, como é um serviço novo possui limitações, a principal é que o console não permite realizar as operações. Para isso, deve ser sempre via CLI ou código. Outra limitação é funcionalidade de classes de armazenamento para tentar baratear ainda mais o armazenamento, consequentemente não temos a funcionalidade de ciclos de vida de bucket.

--

--