• JP

Acessando e modificando o Terraform State

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

E aí, Curtiu? Até mais!



Posts recentes

Ver tudo