Ao longo dos anos, o desenvolvimento em nuvem passou por uma grande mudança de paradigma. Aplicações mais novas e complexas são implantadas rapidamente na nuvem para minimizar o tempo de inatividade. E através de tudo isso, o conceito de Infraestrutura-como-Código e várias ferramentas surgiram para simplificar o processo de desenvolvimento de aplicativos.

Você pode estar se perguntando: o que é Infraestrutura-como-Código? Como isso melhora o processo de desenvolvimento e experiência, e onde o Terraform se encaixa nisso? Bem, vamos explorar tudo isso e muito mais neste guia. Mas antes de começarmos, aqui estão alguns pré-requisitos:

  • Conhecimento básico sobre a nuvem e terminologias em nuvem

  • Acesso a um PC para implementar exemplos de código

  • Uma conta GCP

Com isso, vamos começar.

Aqui está o que vamos cobrir:

  1. Visão geral da Infraestrutura como Código

  2. O que é o Terraform?

  3. Benefícios do Terraform

  4. Termos Comuns Usados no Terraform

  5. Projeto de Demonstração: Como Escrever uma Configuração do Terraform

  6. Conclusão

Visão Geral da Infraestrutura como Código (IaC)

Infraestrutura como código refere-se à geração de ferramentas de infraestrutura em nuvem e aplicativos com um documento de configuração baseado em código. Esse processo, ao ser executado, automatiza a sequência e o processo de criação de bancos de dados, máquinas virtuais e servidores. Isso melhora a experiência do usuário ao reduzir a frequência de implantações manuais de serviços em nuvem, especialmente para vários serviços idênticos.

Há duas abordagens distintas para a infraestrutura como código: a abordagem Imperativa e a abordagem Declarativa.

Quando você está utilizando a abordagem Declarativa para geração de infraestrutura, você simplesmente detalha suas saídas esperadas/desejadas para a infraestrutura a ser gerada, e então a ferramenta IaC que você está usando descobre como produzir essa saída.

Por outro lado, a abordagem Imperativa envolve especificar os passos exatos necessários para alcançar o estado de infraestrutura desejado. Embora a abordagem Imperativa pareça mais adequada para configurações de infraestrutura complexas, a abordagem Declarativa também pode funcionar muito bem.

Algumas ferramentas são capazes de ambas as abordagens, enquanto outras são adequadas apenas para uma ou outra. Exemplos de algumas das ferramentas IaC populares usadas globalmente incluem Terraform IaC, AWS Cloud Formation, Ansible e Pulumi, Chef, entre outras.

Como o nome sugere – infraestrutura como código – o código que cria a infraestrutura é escrito em várias linguagens de modelo dentro do espaço de IaC. Linguagens de modelo populares incluem JSON, YAML, modelo ARM, HCL, Scripts Heat, e assim por diante.

Você também pode usar ferramentas de script para executar infraestrutura em nuvem. Alguns populares incluem Bash e PowerShell. Estes às vezes vêm pré-instalados na maioria dos computadores pessoais.

De todas essas ferramentas, no entanto, o Terraform se destaca por várias razões – e é o que examinaremos neste artigo.

O que é o Terraform?

O Terraform é uma ferramenta de código aberto desenvolvida pela HashiCorp em 2014. Ele evoluiu ao longo dos anos e agora funciona como uma ferramenta de infraestrutura agnóstica de nuvem que permite criar infraestrutura em vários provedores de serviços em nuvem.

O Terraform também oferece Terraform Cloud, uma ferramenta de software como serviço baseada em nuvem. Ela permite a implantação baseada em nuvem de ferramentas em nuvem, em vez de usar os antigos métodos locais que tínhamos na extinta ferramenta Terraform CLI.

Além disso, assim como outras ferramentas de IaC que utilizam linguagens de modelo, o framework de modelo usado para criar infraestrutura no Terraform é a linguagem de modelo da HashiCorp (HCL).

Vantagens do Terraform

Agora vou destacar alguns dos benefícios de usar o Terraform como engenheiro de nuvem, juntamente com o papel-chave da ferramenta no ecossistema em nuvem.

1. Abordagem Declarativa

Essa abordagem para automação de infraestrutura em nuvem garante que toda a infraestrutura necessária a ser implantada (bancos de dados, servidores, etc.) seja explicitamente declarada e executada conforme necessário. Isso ajuda a evitar conflitos.

2. Tratamento de Conflitos

Além de suas eficientes capacidades de automação de ferramentas em nuvem, o Terraform possui propriedades robustas de detecção e tratamento de conflitos. Uma das formas como ele lida com conflitos é através da função Terraform plan. Esta função destaca quaisquer conflitos percebidos ou potenciais na orquestração da infraestrutura, o que permite uma correção fácil antes da implementação. Vou discutir isso mais detalhadamente nas seções subsequentes.

3. Cloud Agnostic

O Terraform é um provedor de serviços de automação multipropósito e multi-nuvem com eficientes capacidades de automação de infraestrutura nos principais provedores de serviços em nuvem (AWS, GCP e Azure). Ele também permite a automação híbrida e entre provedores.

4. Amigável ao Usuário

O Terraform é uma das maiores ferramentas de automação em nuvem com as maiores comunidades de usuários por aí. Ele possui extensos tutoriais para iniciantes que ajudam você a se familiarizar rapidamente com a ferramenta. Aqui está um link para a sua documentação para que você possa se aprofundar mais.

5. Capacidades de Gerenciamento de Arquivos

O Terraform cria automaticamente um backup local dos estados de automação em seu computador local para garantir o acesso imediato e o gerenciamento de arquivos em caso de qualquer problema. Ele também oferece opções de backup remoto para provedores de serviços em nuvem remotos, quando necessário.

6. Controle de Versão

Assim como o sistema de controle de versão Git, o Terraform possui um sistema de controle de versão embutido que permite rastrear alterações em um arquivo Terraform. Ele também permite que você volte a versões anteriores do seu código se houver erros na versão atual, por exemplo.

7. Reutilização de Código

O Terraform oferece uma ampla variedade de modelos de código para fácil reutilização em sua página de documentação para desenvolvedores.

Agora que destacamos os benefícios do Terraform, vamos aprender alguns termos comuns usados no Terraform e o que eles significam.

Termos Comuns Usados no Terraform

Antes de começar a usar o Terraform, você deve estar familiarizado com alguns termos-chave que aparecem com frequência. Aqui está o que você precisa saber:

  1. Provedores: no Terraform, um Provedor é uma interface de programação que permite que o Terraform interaja com várias APIs e serviços de nuvem. Por exemplo, você usaria um provedor para interagir com um provedor de serviços em nuvem como GCP ou Azure.

  2. Módulos: Módulos são criados especificamente dentro da estrutura do Terraform e servem como componentes reutilizáveis que permitem orquestrar facilmente serviços em nuvem. Você também pode armazenar informações importantes sobre serviços em nuvem em um módulo e, em seguida, modificá-lo para garantir a exclusividade usando variáveis de módulo.

  3. Recursos: Recursos no Terraform referem-se aos componentes da infraestrutura em nuvem a serem criados. Exemplos incluem redes em nuvem, máquinas virtuais, zonas de disponibilidade e outras infraestruturas.

  4. Estado: O conceito de estado no Terraform forma a base de sua eficiência. O estado mantém o controle da configuração atual dos seus recursos de infraestrutura e contém detalhes sobre cada recurso que o Terraform criou, modifcou ou excluiu. O sistema de controle de versão do Terraform o utiliza para rastrear quaisquer alterações que você fizer em um arquivo de código e usa essas informações para destruir e provisionar a infraestrutura conforme necessário.

  5. Espaço de trabalho: Um espaço de trabalho funciona de forma semelhante a um sistema de controle de versão, pois cria uma espécie de restrição em torno de um arquivo de trabalho. Os espaços de trabalho permitem que você gerencie várias instâncias de uma única configuração de infraestrutura de forma limpa e isolada dentro do mesmo backend. Você pode usar os espaços de trabalho para separar ambientes como desenvolvimento, staging e produção enquanto usa a mesma configuração do Terraform.

Projeto de Demonstração: Como Escrever uma Configuração do Terraform

Nesta seção, vamos aprofundar na escrita do nosso primeiro arquivo do Terraform para orquestrar uma máquina virtual de programa do Google Cloud com apenas algumas linhas de código. Mas antes de começarmos, vamos discutir os vários comandos que você deve entender antes de implementarmos o projeto de demonstração.

Comandos Comuns do Terraform

  • Terraform init: Este comando inicializa a ferramenta Terraform e baixa arquivos essenciais específicos do provedor de nuvem. Ele também estabelece uma conexão entre o Terraform e o provedor de nuvem em questão. No nosso caso, é entre o GCP e o provedor do Terraform.

  • Terraform fmt: Este comando garante automaticamente a formatação e a indentação ideais do código. Ele garante a execução ordenada do código e minimiza quaisquer erros.

  • Terraform plan: Este comando descreve os passos de execução do código Terraform e detecta quaisquer erros que possam ocorrer durante o processo de execução. Ele também destaca quaisquer erros no código Terraform que possam prejudicar a execução. Por fim, ele trabalha em conjunto com o gerenciamento de estado do Terraform para detectar qualquer mudança de estado e desprovisionar ou gerar quaisquer serviços de nuvem adicionais, se necessário.

  • Terraform apply: Este comando executa o estado planejado do Terraform implementado pelo comando Terraform plan.

  • Terraform destroy: Este comando é o comando final no esquema do Terraform que é usado para desativar ou destruir todos os serviços em nuvem criados usando o comando Terraform apply. É importante observar que você deve executar os comandos listados acima sequencialmente para garantir que sua infraestrutura seja criada corretamente.

Criando uma Máquina Virtual GCP com IaC

Agora que você aprendeu esses comandos importantes, vamos testá-los criando nossa primeira máquina virtual GCP com IaC.

No seu editor de código, digite o seguinte código:

provider "google" {
  project = "your-gcp-project-id"  # Replace with your GCP Project ID
  region  = "us-central1"          
  zone    = "us-central1-a"        
}

Este código destaca o provedor de nuvem que estamos usando para gerar os recursos em nuvem de que precisamos. No nosso caso, é o programa de nuvem do Google. O nome atribuído a ele é apenas “google”. Outros provedores de nuvem como AWS e Azure são “aws” e “azure”, respectivamente.

A segunda linha identifica o identificador de assinatura do GCP, que é único para cada conta do GCP (e ajuda a facilitar a integração precisa). Você deve usar o seu no espaço fornecido.

Você também precisará incluir uma região de recursos adequada e uma zona de disponibilidade de recursos. Isso serve como base física para a máquina virtual que criaremos para que possamos executá-la. Neste cenário, escolhi a região central dos EUA e a zona de disponibilidade 1-a, respectivamente. Você pode ler mais aqui sobre as regiões e zonas de disponibilidade na nuvem.

resource "google_compute_instance" "vm_instance" {
  name         = "example-vm"      
  machine_type = "e2-medium"          

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11" 
    }
  }

O trecho de código acima especifica o recurso computacional exato que será orquestrado, que no nosso caso é uma instância de máquina virtual codificada como “vm_instance”. 'example-vm’ é o nome que queremos atribuir à máquina virtual que criaremos para este projeto. É importante notar que o nome da máquina virtual também deve ser único. O tipo de máquina virtual que escolhemos foi o tipo VM E2 (Propósito Geral)-médio. Você pode obter mais informações sobre os tipos de máquinas virtuais aqui.

Além disso, também especificamos o sistema operacional inicial esperado (“boot_disk”), que é uma imagem do sistema operacional Debian Linux versão 11 no meu caso.

  network_interface {
    network = "default"  # Attach to the default VPC network
    access_config {

    }
  }

output "instance_ip" {
  value = google_compute_instance.vm_instance.network_interface[0].access_config[0].nat_ip
}

Para completar a criação da nossa máquina virtual, precisamos configurar uma Rede Virtual para permitir o acesso remoto à VM. O bloco de interface de rede conecta a máquina virtual à rede VPC (Virtual Private Cloud) padrão fornecida pelo GCP. Não poderemos interagir com nossa máquina virtual sem a rede VPC. O bloco de saída também exibe o endereço IP de acesso padrão no terminal, que podemos usar para nos conectar à máquina virtual.

Aqui está o código final esperado:


provider "google" {
  project = "your-gcp-project-id"  # Replace with your GCP Project ID
  region  = "us-central1"          
  zone    = "us-central1-a"       
}

resource "google_compute_instance" "vm_instance" {
  name         = "example-vm"         
  machine_type = "e2-medium"          

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"  
    }
  }

  network_interface {
    network = "default"  # Attach to the default VPC network
    access_config {

    }
  }

output "instance_ip" {
  value = google_compute_instance.vm_instance.network_interface[0].access_config[0].nat_ip
}

Continuando a partir daí, agora executaremos este código usando os comandos destacados na imagem abaixo:

O comando terraform -v confirma que o Terraform foi instalado com sucesso no terminal. A saída esperada será a versão da ferramenta Terraform instalada.

O próximo comando executado é a função terraform init que inicializa uma comunicação com o provedor de serviços de nuvem, que no nosso caso é o GCP. Todas as dependências necessárias também são instaladas.

O comando terraform fmt também é executado para garantir formatação adequada do código e endentação. Em seguida, o comando terraform plan é executado sequencialmente.

A partir da imagem acima, você pode ver as etapas que o Terraform pretende utilizar para gerar a máquina virtual esperada.

Após a execução bem-sucedida do Terraform plan, então executaremos a função terraform apply para executar as etapas delineadas pelo Terraform plan.

Isso gerará um prompt pedindo uma confirmação da execução do Terraform, como mostrado acima. Digitar “Yes” permitirá que a operação prossiga sem problemas.

Após a execução bem-sucedida, uma mensagem de sucesso será exibida conforme mostrado acima. Com isso, criamos nossa infraestrutura na nuvem apenas com código. O comando terraform destroy pode então ser chamado para remover as máquinas virtuais criadas.

Conclusão

Neste artigo, você aprendeu o básico sobre a infraestrutura como código. Discutimos o Terraform, seus benefícios e algumas de suas principais características e comandos. Também ilustramos seu uso em um projeto de demonstração.

Para aprimorar ainda mais o seu conhecimento, você pode consultar a documentação do Terraform para mais exemplos de código. Também recomendo utilizar o conhecimento recém-adquirido para automatizar um projeto com usos da vida real.

Sinta-se à vontade para me enviar mensagens com quaisquer comentários ou perguntas. Você também pode conferir meus outros artigos aqui. Até a próxima, continue codificando!