JP

16 de mai de 20213 min

Acessando e modificando Terraform State

Atualizado: 29 de abr de 2023

Antes de começar a falar sobre o acesso aos estados, é necessário explicar o que são os estados ou State. O que são os States?

O que é o Terraform State?

O Terraform State é uma forma do Terraform gerenciar a infra, configurações e os recursos criados afim de manter um mapeamento do que já existe e controlar a atualização e criação de novos recursos.

Um exemplo básico é quando criamos um Bucket S3, um EC2 ou uma SQS via Terraform. Todos estes recursos são mapeados no estado e passam a ser gerenciados pelo Terraform.


Localização do State

Local

Por padrão o Terraform aloca o estado localmente no arquivo terraform.tfsate. Utilizar o State localmente pode funcionar bem para um estudo específico no qual não exista a necessidade em compartilhar o State entre times.

Remote

Ao contrário do Local, quando temos times compartilhando dos mesmos recursos, a utilização do State de forma remota se torna imprescindível. O Terraform provê suporte para que o State possa ser compartilhado de forma remota. Não entraremos em detalhes em como configurar, mas é possível manter o State no Amazon S3, Azure Blob Storage, Google Cloud Storage, Alibaba Cloud OSS e entre outras nuvens.

O State é representado pelo arquivo terraform.tfsate, um arquivo no formato JSON, segue um exemplo de um Bucket S3 mapeando no State:

{
 
"version": 4,
 
"terraform_version": "0.12.3",
 
"serial": 3,
 
"lineage": "853d8b-6ee1-c1e4-e27e-e10",
 
"outputs": {},
 
"resources": [
 
{
 
"mode": "managed",
 
"type": "aws_s3_bucket",
 
"name": "s3_bucket_xpto",
 
"provider": "provider.aws",
 
"instances": [
 
{
 
"schema_version": 0,
 
"attributes": {
 
"acceleration_status": "",
 
"acl": "private",
 
"arn": "arn:aws:s3:::bucket.xpto",
 
"bucket": "bucket.xpto",
 
"bucket_domain_name": "bucket.xpto",
 
"bucket_prefix": null,
 
"bucket_regional_domain_name": "bucket.xpto",
 
"cors_rule": [],
 
"force_destroy": false,
 
"grant": [],
 
"hosted_zone_id": "Z3NHGSIKTF",
 
"id": "bucket.xpto",
 
"lifecycle_rule": [],
 
"logging": [],
 
"object_lock_configuration": [],
 
"policy": null,
 
"region": "us-east-1",
 
"replication_configuration": [],
 
"request_payer": "BucketOwner",
 
"server_side_encryption_configuration": [],
 
"tags": {
 
"Environment": "staging"
 
},
 
"versioning": [
 
{
 
"enabled": false,
 
"mfa_delete": false
 
}
 
],
 
"website": [],
 
"website_domain": null,
 
"website_endpoint": null
 
},
 
"private": "UJbhV=="
 
}
 
]
 
}
 
]
 
}


Acessando e alterando o State

Apesar do State estar alocado em um arquivo JSON, não é recomendado a alteração direta no arquivo. O Terraform provê a utilização do comando Terraform state executado via CLI para que pequenas modificações sejam efetuadas.

Através do CLI, podemos executar comandos afim de manipular o State, segue o uso:

terraform state <subcommand> [options] [args]

Sub-comandos:

list Lista os recursos no estado

mv Move um item no estado

pull Extrai o estado atual e lista o resultado no stdout

push Atualiza um estado remoto de um arquivo de estado local

rm Remove instância do estado

show Mostra recursos do estado

1. Listando os recursos do State

Comando:

terraform state list

O comando acima possibilita listar os recursos que estão sendo gerenciados pelo State

Exemplo:

$ terraform state list
 
aws_s3_bucket.s3_bucket
 
aws_sqs_queue.sqs-xpto

No exemplo acima, temos um Bucket S3 e um SQS que foram criados via terraform e que estão sendo gerenciados pelo State.

2. Visualizando um recurso e seus atributos

Comando:

terraform state show [options] ADDRESS

O comando acima possibilita mostrar em detalhes um recurso específico e seus atributos

Exemplo:

$ terraform state show aws_sqs_queue.sqs-xpto
 
# aws_sqs_queue.sqs-xpto:
 
resource "aws_sqs_queue" "sqs-xpto" {
 
arn = "arn:aws:sqs:sqs-xpto"
 
content_based_deduplication = false
 
delay_seconds = 90
 
fifo_queue = false
 
id = "https://sqs-xpto"
 
kms_data_key_reuse_period_seconds = 300
 
max_message_size = 262144
 
message_retention_seconds = 345600
 
name = "sqs-xpto"
 
receive_wait_time_seconds = 10
 
tags = {
 
"Environment" = "staging"
 
}
 
visibility_timeout_seconds = 30
 
}

3. Removendo recursos do State

Comando:

terraform state rm [options] ADDRESS...

O comando acima remove um ou mais items do State. Diferente de um terraform destroy, que remove o recurso do State e os objetos remotos criados na nuvem.

Exemplo:

$ terraform state rm aws_sqs_queue.sqs-xpto


Material de estudo

Se quer aprender mais sobre o assunto e alcançar um alto nível de conhecimento, recomendo fortemente a leitura do(s) seguinte(s) livro(s):

Terraform: Up & Running: Writing Infrastrucutre as Code (Versão Inglês) é um livo focado em como utilizar Terraform e seus benefícios. O autor buscou fazer comparações com diversas outras ferramentas IAC (Infrastructure as code) como Ansible e Cloudformation (IAC nativa da AWS) e principalmente de como criar e provisionar diferentes recursos para múltiplos serviços de nuvem. Atualmente, Terraform é a ferramenta mais utilizada em projetos de Software para a criação e gerenciamento de recursos no serviços de nuvem como AWS, Azure, Google cloud e vários outros. Se você quer ser um engenheiro completo, recomendo fortemente aprender sobre o tema.

Amazon AWS: Descomplicando a computação na nuvem é um livro para aqueles que estão começando na AWS e querem entender o funcionamento e a dinâmicas dos serviços como S3, EC2, ElasticCache, Route 53, SNS, Cloudwatch e muito mais.

AWS Cookbook (Versão Inglês) é um guia prático contendo 70 receitas detalhadas sobre os recursos da AWS e como resolver diferentes desafios. É um livro bem escrito e de fácil entendimento cobrindo os principais serviços da AWS através de exemplos práticos. A AWS ou Amazon Web Services é o serviço de nuvem mais utilizando atualmente em todo o mundo, caso queira entender mais sobre o tema para ficar bem posicionado no mercado, recomendo fortemente o estudo.

E aí, Curtiu? Até mais!

    0