Photo by Pankaj Patel on Unsplash

[hashpost.tf]: Usando o famosinho $ terraform fmt para formatar o código do Terraform da sua IaC

DevOps from Zero!💻

--

Opa, bora com TUDO pessoal!! 🙌 🚀. Mais um ano pra gente, mais 365 oportunidades de crescermos e sermos melhores profissionais, vamos começar o ano falando sobre Terraform (que por sinal eu amo demais 💜), e ver mais detalhadamente como você pode formatar o código da sua infraestrutura com o comando $ terraform fmt. Desejo que esse ano seja de MUITO sucesso para todos, com muitas realizações, promoções, trabalhos, projetos e muita saúde, temos que trabalhar e também cuidar da gente, sair, se divertir com a família e nunca deixar de estudar!! 📚

Vou também divulgar aqui para vocês, que eu estou preparando MUITOS conteúdos sobre Hashicorp, seja Terraform, Consul, Packer, fiquem ligados, vamos aprender MUITO sobre infraestrutura como código esse ano, tentarei manter os posts aqui no Medium e também pretendo buscar mais conhecimentos em eventos presenciais, DevOps, Days, Meetups. E para tirar essa ideia e por em prática, abordarei uma série de artigos sobre Terraform aqui no Medium, e hoje vamos falar sobre o comando $ terraform fmt e alguns exemplos de uso.

Falando em Terraform, você já leu meus outros artigos??

Se não leu, você está dando bobeira hein!? Aqui no Medium tem MUITOS artigos, que eu já escrevi no passado sobre Terraform e IaC no geral, é a chance de você aprender do zero, e ler minhas experiências. 😆

Eu estou sempre postando conteúdos sobre DevOps, Linux e automação, se você tem interesse em se manter progredindo nessa área, não deixe de aprender e ler os outros artigos, vai ajudar demais você na sua jornada.

Pré-Requisitos

Para que você se sinta confortável, e queira acompanhar até o fim o post, listarei abaixo alguns tópicos que seria legal ter antes de começar.

  • Terraform v1.0.0 (tenho usado essa versão aqui para labs).
  • Uma conta na AWS (vamos visualizar os recursos criados).
  • AWS CLI (pode ser necessário para rodar algum comando).
  • VSCode (editor de texto, fique a vontade para codar no seu preferido).
  • Ubuntu 22.04.1LTS (gosto do LINUX mas use o seu favorito).

Criação do arquivos de configuração do Terraform (.tf)

Vamos usar o provedor de nuvem da AWS, sabemos que existem n provedores, basta visualizar na página do Terraform Registry, para encontrar aquele que você mais se identificar ou estiver usando em labs de estudos. Vamos criar alguns recursos de redes na VPC da AWS, sendo eles:

  • VPC
  • Subnet
  • Internet Gateway
  • Security Groups
  • Route Tables
  • Route Table Association

Vamos separar os arquivos dentro de uma estrutura do Terraform, para que fique mais fácil de trabalhar e o nosso código fique organizado, seguindo as práticas de mercado. Eu costumo criar um diretório denominado learn-terraform-fmt, por exemplo, e dentro do diretório crio os arquivos necessários, com a extensão sendo .tf

  • Criando primeiramente o main.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.73.0"
}
}
}
provider "aws" {
shared_credentials_file = "/home/myuser/.aws"
profile = "iaclabs"
region = "sa-east-1"
default_tags {
tags = {
Environment = "Test"
Owner = "Amaury"
maneged-by = "Terraform"
Project = "Test"
}
}
}
  • Também precisamos do arquivo de recursos que é o network.tf
resource "aws_vpc" "my_vpc" {
cidr_block = "10.0.0.0/16"

tags = {
Name = "vpc-terraform"
}
}

resource "aws_subnet" "my_subnet" {
vpc_id = aws_vpc.my_vpc.id
cidr_block = "10.0.1.0/24"

tags = {
Name = "subnet-terraform"
}
}

resource "aws_internet_gateway" "my_intrnet_gateway" {
vpc_id = aws_vpc.my_vpc.id

tags = {
Name = "internet-gateway-terraform"
}
}

resource "aws_route_table" "my_route_table" {
vpc_id = aws_vpc.my_vpc.id

route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.my_intrnet_gateway.id
}

tags = {
Name = "route-table-terraform"
}
}

resource "aws_route_table_association" "my_rta" {
subnet_id = aws_subnet.my_subnet.id
route_table_id = aws_route_table.my_route_table.id
}

resource "aws_security_group" "my_security_group" {
name = "security_group_terraform"
vpc_id = aws_vpc.my_vpc.id

ingress {
//description = "SSH from VPC"
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}

egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}

[Guia de Boas Práticas]: “Sempre use o recurso de TAGS no Terraform, isso ajuda no ajuste de cobrança, propriedade, automação, controle de acesso e muitos outros casos de uso. Dado que essas tags são um aspecto importante do gerenciamento bem-sucedido de um ambiente de IaC”. Referência aqui.

Formatando seu código IaC usando o $ fmt

Os dois arquivos que usamos aqui, serão usados nos próximos exemplos abaixo para que possamos demonstrar o uso do comando $ terraform fmt Antes mesmo de sair provisionando os recursos, precisamos testar e validar se o código, está passando em todas as etapas de validações do Terraform, e se está dentro das práticas de convenções usadas pela ferramenta. Mais detalhes aqui.

Mergulho profundo nas opções do comando $ fmt

Para que possamos validar e testar o nosso código usando as opções válidas do $ terraform fmt precisamos passar por elas e é isso que eu mostrarei abaixo usando algumas opções do comando.

  • -check
    Essa opção tem como objetivo checar, se na sua estrutura de arquivos, existem inconsistências sobre formato. Eu estava aqui testando e tirei uma chave { do meu bloco de recursos e ele logo já mandou esse erro:
# terraform fmt -check

│ Error: Argument or block definition required

│ on main.tf line 22, in terraform:
│ 22:

│ An argument or block definition is required here
  • -diff
    Para verificar alterações na formatação, usamos o -diff esse comando é capaz de verificar quais arquivos precisam de correção de formato, e ele vai além disso, com a funcionalidade de verificar em qual parte do arquivo têm formatação inconsistente, demais hein!?
$ terraform fmt -check -diff main.tf
main.tf
--- old/main.tf
+++ new/main.tf
@@ -7,7 +7,7 @@
}
}

- provider "aws" {
+provider "aws" {
shared_credentials_file = "/home/myuser/.aws"
profile = "iaclabs"
region = "sa-east-1"
  • -recursive
    Por padrão o $ terraform fmt processa apenas os arquivos que estão no mesmo diretório, para arquivos do Terraform que estão em outras estruturas, é necessário passar essa opção ao comando.
  • -fmt
    Já o comando $ fmt faz o formato dos arquivos que estão sendo processados no momento. A Hashicorp recomenda o uso forte do $ fmtnos arquivos de configuração do Terraform, e outro ponto importante, a cada atualização da versão do Terraform, esse comando sofre alterações, por isso sempre mantenha o mesmo atualizado.
resource "aws_vpc" "my_vpc" {
cidr_block = "10.0.0.0/16"

tags = {
Name = "vpc-terraform"
}
}

resource "aws_subnet" "my_subnet" {
vpc_id = aws_vpc.my_vpc.id
cidr_block = "10.0.1.0/24"

tags = {
Name = "subnet-terraform"
}
}

resource "aws_internet_gateway" "my_intrnet_gateway" {
vpc_id = aws_vpc.my_vpc.id

tags = {
Name = "internet-gateway-terraform"
}
}

Veja que ele não está formatado de forma correta, olha os blocos de recursos:

resource "aws_vpc" "my_vpc" {
cidr_block = "10.0.0.0/16"

tags = {
Name = "vpc-terraform"
}
}

Agora executando o comando $ terraform fmt ele passa a ser formatado:

$ terraform fmt 
main.tf
network.tf

Veja abaixo o resultado da formatação do arquivo:

resource "aws_vpc" "my_vpc" {
cidr_block = "10.0.0.0/16"

tags = {
Name = "vpc-terraform"
}
}

resource "aws_subnet" "my_subnet" {
vpc_id = aws_vpc.my_vpc.id
cidr_block = "10.0.1.0/24"

tags = {
Name = "subnet-terraform"
}
}

resource "aws_internet_gateway" "my_intrnet_gateway" {
vpc_id = aws_vpc.my_vpc.id

tags = {
Name = "internet-gateway-terraform"
}
}

Provisionando os recursos de VPC na AWS

Caso vocês pretendem prosseguir com os outros comandos do Terraform, aproveito para informar que os códigos estão funcionais e legíveis para serem provisionados, caso contrário, se estiverem com issues, aproveita e manda um $ terraform fmt e outro $ terraform validate para fechar com chave de outro. 😄

Finalizando

A ideia para hoje era isso pessoal, espero que tenham aprendido e clareado as ideias, sobre o uso do $ terarform fmtpara aplicar formatação consistente, em seus arquivos de configuração do Terraform. É essencial criar arquivos de configuração do Terraform, que seguem um estilo ou formato padronizado, para que assim, todos os membros do seu time, possam ser beneficiados da legibilidade aprimorada do código.

No mais, desejo à todos vocês MUITO sucesso, muitos projetos de DevOps, muito Terraform, e a gente segue conversando e aprendendo mais nos próximos artigos, fiquem ligados que nos posts… vou trazer mais conteúdo bacana de Terraform & IaC, mas é isso, prazer imenso em recebe-los por aqui, por terem lido o artigo sobre Terraform. Ficou com dúvidas, questionamentos, #chama. TMJ!

--

--

DevOps from Zero!💻

SRE/DevOps Engineer| Lifelong learner | Medium Creator | AWS/Azure certified☁️ | Hashicorp Ambassador | Containers | Tech | Community | Coffee