Conhecendo o Terraform

Atualizado em: 25 de julho de 2022

O Terraform é uma ferramenta para construir, alterar e configurar uma infraestrutura de rede de forma segura e eficiente. Com ele é possível gerenciar serviços de nuvem bem conhecidos, bem como soluções internas personalizadas. Veja a lista completa de serviços de infraestrutura de nuvem suportados em: https://www.terraform.io/docs/providers/index.html.

Os arquivos de configuração do Terraform descrevem os componentes necessários para executar um único aplicativo ou todo o seu datacenter. Ele pode gerar um plano de execução descrevendo o que ele fará para atingir o estado desejado e, em seguida, ele pode executar as instruções para construir a infraestrutura descrita. Conforme a configuração muda, o Terraform é capaz de determinar o que mudou e criar planos de execução incrementais que podem ser aplicados.

O Terraform trata a infraestrutura como código e dessa forma você pode versioná-lo usando o Git, por exemplo, e ter um backup, fazer rollback em caso de problemas e fazer auditoria à medida que o tempo passa e as alterações vão sendo realizadas no seu ambiente.

O Terraform é desenvolvido e mantido pela empresa Hashicorp. Ele é gratuito com código fonte aberto e assim pode receber contribuições da comunidade no GitHub (https://github.com/hashicorp/terraform). Ele está disponível para download na página: https://www.terraform.io/downloads.html

Neste tutorial, será mostrado como instalar e usar o Terraform para criar um instância na AWS.

Instalando o Terraform

0) Instalando o Terraform no Ubuntu.

wget -O- https://apt.releases.hashicorp.com/gpg | gpg --dearmor | sudo tee /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform
terraform -v
terraform --help

Usando o Terraform

1) Crie uma conta Free Tier na Amazon https://aws.amazon.com/ siga as instruções das páginas: https://docs.aws.amazon.com/chime/latest/ag/aws-account.htmlhttps://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/free-tier-limits.html. Na criação da conta será necessário cadastrar um cartão de crédito, mas como você criará instâncias usando os recursos oferecidos pelo plano Free Tier, nada será cobrado se você não ultrapassar o limite para o uso dos recursos e tempo oferecidos e descritos no link anterior.

2) Após a criação da conta na AWS, acesse a interface CLI da Amazon na página: https://aws.amazon.com/cli/

3) Clique no nome do usuário (canto superior direito) e escolha a opção “Security Credentials“. Em seguida clique na opção “Access Keys (Access Key ID and Secret Access Key)” e clique no botão “New Access Key” para criar e visualizar o ID e o Secret da chave, conforme exemplo abaixo (https://docs.aws.amazon.com/general/latest/gr/managing-aws-access-keys.html). A Access Key e Secret Key mostradas a seguir são apenas para exemplo. Elas são inválidas e você precisa trocar pelos dados reais gerados para sua conta.

Access Key ID: YOUR_ACCESSKEY_ACCOUNT
Secret Access Key: YOUR_SECRET_ACCOUNT

4) Crie o diretório abaixo.

mkdir -p $HOME/.aws/

5) Acesse o diretório criado anteriormente e crie o arquivo credentials com o seguinte conteúdo. A Access Key e Secret Key mostradas a seguir são apenas para exemplo. Elas são inválidas e você precisa trocar pelos dados reais gerados para sua conta.

[default]
aws_access_key_id = YOUR_ACCESSKEY_ACCOUNT
aws_secret_access_key = YOUR_SECRET_ACCOUNT

6) Crie o diretório packt-terraform.

mkdir -p $HOME/packt-terraform/

7) Acesse o diretório criado anteriormente e crie o arquivo main.tf com o seguinte conteúdo. Será criada uma instância no serviço EC2 (Elastic Compute Cloud) da AWS  do tipo t2.micro (Variable ECUs, 1 vCPUs, 2.5 GHz, Intel Xeon Family, 1 GiB memory, EBS only) usando o Ubuntu 20.04 64 bits.

terraform {
  required_providers {
    aws = {
    source = "hashicorp/aws"
    version = ">= 2.4.0, < 3.74.1"
    }
  }

  required_version = ">= 0.13.7"
}
# Receive latest version Ubuntu 20.04
# reference: https://www.terraform.io/docs/providers/aws/r/instance.html
data "aws_ami" "ubuntu" {
  most_recent=true
  owners=["099720109477"] # Canonical
  filter {
    name="root-device-type"
    values=["ebs"]
  }

  filter {
    name="virtualization-type"
    values=["hvm"]
  }

  filter {
    name="name"
    values=["ubuntu*20.04-amd64-server-*"]
  }

# https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/finding-an-ami.html
# https://docs.aws.amazon.com/cli/latest/userguide/install-linux.html
# example: aws ec2 describe-images --filters "Name=name,Values=ubuntu*20.04-amd64-server-*"
}
provider "aws" {
  profile = "default"
  region = "us-east-2"
}

resource "aws_instance" "hello-instance" {
  ami = data.aws_ami.ubuntu.id
  instance_type = "t2.micro"

  tags = {
    Name = "hello-instance"
  }
}

8) Dentro desse mesmo diretório em que está o template do terraform, execute os comandos abaixo para testar a comunicação e visualizar as mudanças a serem realizadas antes de aplicá-las no ambiente.

terraform providers
terraform init
terraform plan
terraform apply

9) A lista de recursos e providers suportados pelo Terraform está disponível em:
https://www.terraform.io/docs/providers

10) Acesse https://console.aws.amazon.com/ec2 para visualizar se a instância realmente foi criada e está sendo executada.

11) Voltando ao diretório $HOME/packt-terraform/, você verá o arquivo terraform.tfstate, contendo o estado atual do seu ambiente. Esse arquivo será atualizado a cada mudança no ambiente usando o Terraform. As informações são mostradas no padrão JSON, mas você pode obter uma visualização no padrão “chave = valor” com o comando abaixo.

terraform state show aws_instance.hello-instance

Onde: aws_instance.hello-instance é o nome do recurso criado no arquivo main.tf.

12) Se quiser destruir o ambiente, execute o comando abaixo. É importante realizar este passo para evitar que a instância AWS fique ligada por tempo indefinido e você acabe ultrapassando os limites oferecidos pelo plano Free Tier e seja cobrado por isso posteriormente. Se quiser apenas remover um recurso específico, sem destruir todo o ambiente, basta editar o aquivo main.tf, apagar o recurso e  executar o comando terraform apply.

terraform destroy

13) Organize e separe as configurações do ambiente gerenciado pelo Terraform em diretórios (um para cada tipo de ambiente) para evitar conflitos. Você também pode salvar e versionar o código no Git, dando commit, push e criando tags a cada mudança de configuração. Fazendo isso você estará praticando IAC (Infrastructure as code) https://en.wikipedia.org/wiki/Infrastructure_as_Code

16) No Github eu publiquei alguns arquivos de exemplo de uso do Terraform: https://github.com/aeciopires/terraform

ATENÇÃO.: Alguns códigos foram desenvolvidos usando a versão 0.11.x e outros usando a versão 0.12.x do Terrafom. O código muda muito de uma versão para outra. Hoje, o Terraform está na versão 1.1.x. Alguns códigos mais recentes podem ser encontrados aqui: https://github.com/aeciopires/adsoft

17) Mais informações sobre o Terraform podem ser obtidas em:

Categories:

3 respostas para “Conhecendo o Terraform”

  1. Avatar de Sérgio Francisco

    Muito legal esse post, Aécio! Excelente para quem está iniciando e quer ter uma noção sobre a ferramenta. 😀

    Eu já trabalho com Terraform há alguns anos e também escrevi um post sobre como essa ferramenta funciona, para o que serve, como é o fluxo de trabalho, etc.

    O link aqui para quem quiser ler é esse: https://edukti.com/terraform

    Abraço!

  2. Avatar de Aécio Pires
    Aécio Pires

    Oi, Sérgio!
    Obrigado por escrever o seu post e compartilhar aqui. Está bem didático, mais atualizado e complementa o que escrevi aqui. Continuo usando o terraform na versão 1.4.x (ainda não tive tempo para lidar com as mudanças da versão 1.5.x), mas é muito bom usar essa ferramenta no dia a dia.

    Também uso o Terraform junto com o Terragrunt… a produtividade é muito alta ao usar essas duas ferramentas juntas.

    https://terragrunt.gruntwork.io/
    https://terragrunt.gruntwork.io/docs/

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *