A idéia desse projeto é executar o docker compose que tem a aplicação backend (feito em Python e Flask) e o banco de dados na Máquina Virtual da Magalu Cloud.
O repositório no github para ver o código do
Provider
Primeiro definimos o provider.
terraform {
required_providers {
mgc = {
source = "MagaluCloud/mgc"
version = "0.30.0"
}
random = {
source = "hashicorp/random"
version = "3.6.2"
}
}
}
provider "mgc" {
alias = "sudeste"
region = "br-se1"
}
No provider, as regiões disponíveis são sudeste br-se1 e nordeste br-ne1.
Virtual Machine
A máquina virtual é equivalente ao AWS EC2, onde você tem controle do que quiser instalar para rodar sua solução, seja scripts, servidores web, qualquer linguagem e etc.
Dica: faça testes localmente com o que tem um Vagrantfile para ser usado.
resource "mgc_virtual_machine_instances" "this" {
depends_on = [mgc_ssh_keys.this, mgc_network_security_groups.this]
name = "mgc-vm-instance"
machine_type = {
name = "BV1-1-10"
}
image = {
name = "cloud-ubuntu-24.04 LTS"
}
network = {
associate_public_ip = true
delete_public_ip = true
interface = {
security_groups = [{
id = mgc_network_security_groups.this.id
}]
}
}
ssh_key_name = mgc_ssh_keys.this.name
}
O depends_on cria dependência com o recurso mgc_ssh_keys e mgc_network_security_groups. A máquina virtual atual só será criado após a criação de quem ele depende.
No atributo machine_type, o valor usado é o BV1-1-10, que possui 1 vCPU e 1GB de RAM. Essas informações são encontradas ao criar a instância no site.
A image usada é o cloud-ubuntu-24.04 LTS. Os valores desse atributo pode ser visto listando os detalhes da instância pelo cli.
No atributo network, temos o campo associate_public_ip que indica que ao criar a instância, deverá ser cria um IP público e o campo delete_public_ip indica que ao destruir a instância, o IP gerado também deverá ser deletado. Importante saber que o IP público tem custo.
O atributo interface possui o atributo security_groups onde deverá ser atribuido o id do security group criado, que será explicado mais adiante.
Por fim temos o campo ssh_key_name que seu valor deve ser atribuido ao campo name recurso mgc_ssh_keys, não o seu id.
resource "random_string" "this" {
length = 5
special = false
lower = true
min_numeric = 2
min_lower = 3
}
resource "mgc_ssh_keys" "this" {
provider = mgc.sudeste
name = "mgc_ssh_key_${random_string.this.id}"
key = file("../mgc_ssh_key.pub")
}
No recurso mgc_ssh_keys indicamos o provider que ele pertence, o name que será referenciado no recurso mgc_virtual_machine_instances e que foi concatenado com uma string aleatória gerado pelo recurso random_string. O conteúdo da chave pública deverá ser colocada no campo key, a função file pega o conteúdo de um arquivo e atribui no campo.
A geração da chave SSH está nessa seção.
Security Group
O security group são regras de tráfego, por padrão na Magalu Cloud, todo o , contém o código do backend.
O atributo restart com o valor always irá reiniciar o container sempre que ele der erro e finalizar a aplicação.
O docker compose vai injetar variáveis de ambiente no container usando o env_file, essa abordagem é mais dinâmica e mais segura que por as variáveis na imagem ou declará-las no atributo environment.
O depends_on diz que irá criar o container backend depois que a condição (condition) do serviço database estiver saudável (service_healthy). Essa verificação de saúde do serviço será feito pelo atributo healthcheck no serviço do banco de dados.
O healthcheck irá testar (test) a saúde do container criado com o comando curl -f http://localhost:3000/healthz. Esse comando irá fazer uma requisição para a rota /healthz e vai esperar status code 2XX como resposta. A implementação dessa rota faz acesso ao banco de dados e caso ocorra tudo certo, irá retornar status code 200. Se a aplicação não responder em um espaço de tempo de 5s (timeout), será considerado uma falha e todo o processo irá se repetir 5 vezes (retries) em um espaço de tempo entre cada tentativa de 5s (interval). Caso os testes não passem, o container será considerado como unhealthy.
O funcionamento do interval, retry e timeout está melhor explicada na imagem abaixo.
Na documentação do docker, você vai encontrar explicação mais detalhada sobre o , ).
Criação da infra e Deploy
Baixe o código
git clone https://github.com/deirofelippe/magalucloud-terraform.gitcd ./magalucloud-terraform
Para gerar essa chave, use o comando
ssh-keygen -t rsa -b 2048 -f ./mgc_ssh_key -N "".
- Irá criar um par de chave pública e privada do tipo rsa
-t rsa, com 2048 bits-b 2048, o nome do arquivo será mgc_ssh_key e será criado na pasta atual-f ./mgc_ssh_key, por ultimo será gerado uma nova passphrase com valor vazio-N "". - O comando irá gerar a chave privada
mgc_ssh_keye a chave públicamgc_ssh_key.pub. A chave privada sempre ficará com você e a chave pública ficará no servidor desejado. O terraform vai fazer o upload e a configuração da chave pública no servidor automaticamente, não necessitando do uso do comandossh-copy-idpara fazer o ssh remoto conceder o acesso sem o uso de senha.
- Irá criar um par de chave pública e privada do tipo rsa
Gere os arquivos de configuração:
terraform -chdir=./terraform initVeja o plano de execução:
terraform -chdir=./terraform planCriar a infra no provedor:
terraform -chdir=./terraform apply -auto-approve
Copie o IP público gerado e cole nos comandos abaixo, trocando o
<IP-PÚBLICO>e execute-os.
do repositório, possui as requests que podem ser feitas.
Ao final destrua os recursos criados
terraform -chdir=./terraform destroy -auto-approve.
Conclusão
Obrigado pela leitura :)
Repositório do projeto: https://github.com/deirofelippe/magalucloud-terraform
SOCIAL SHARE CARD GENERATOR