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!
Comentarios