Armazene o estado Terraform no armazenamento do Azure

O Terraform permite a definição, a visualização e a implantação da infraestrutura de nuvem. Usando o Terraform, você cria arquivos de configuração usando sintaxe de HCL. A sintaxe da HCL permite que você especifique o provedor de nuvem, como o Azure, e os elementos que compõem sua infraestrutura de nuvem. Depois de criar os arquivos de configuração, você cria um plano de execução que permite visualizar as alterações de infraestrutura antes de serem implantadas. Depois de verificar as alterações, aplique o plano de execução para implantar a infraestrutura.

O estado terraform é usado para reconciliar recursos implantados com configurações Terraform. O estado permite que o Terraform saiba quais recursos do Azure serão adicionados, atualizados ou excluídos.

Por padrão, o estado do Terraform é armazenado localmente, o que não é ideal pelos seguintes motivos:

  • O estado local não funciona bem em um ambiente de equipe ou colaborativo.
  • O estado Terraform pode incluir informações confidenciais.
  • Armazenar o estado localmente aumenta a chance de exclusão inadvertida.

Neste artigo, você aprenderá como:

  • Criar uma conta de armazenamento do Azure
  • Usar o armazenamento do Azure para armazenar o estado remoto do Terraform.
  • Entender o bloqueio de estado
  • Entender a criptografia em repouso

1. Configurar seu ambiente

  • Assinatura do Azure: caso você não tenha uma assinatura do Azure, crie uma conta gratuita antes de começar.

2. Configurar uma conta de armazenamento de estado remoto

Antes de usar o Armazenamento do Azure como um back-end, crie uma conta de armazenamento.

Execute os seguintes comandos ou configuração para criar uma conta de armazenamento do Azure e um contêiner:

#!/bin/bash

RESOURCE_GROUP_NAME=tfstate
STORAGE_ACCOUNT_NAME=tfstate$RANDOM
CONTAINER_NAME=tfstate

# Create resource group
az group create --name $RESOURCE_GROUP_NAME --location eastus

# Create storage account
az storage account create --resource-group $RESOURCE_GROUP_NAME --name $STORAGE_ACCOUNT_NAME --sku Standard_LRS --encryption-services blob

# Create blob container
az storage container create --name $CONTAINER_NAME --account-name $STORAGE_ACCOUNT_NAME

Pontos principais:

  • As contas de armazenamento do Azure exigem um nome globalmente exclusivo. Para saber mais sobre como solucionar problemas de nomes de conta de armazenamento, confira Resolver erros de nomes de conta de armazenamento.
  • O estado Terraform é armazenado em texto simples e pode conter segredos. Se o estado estiver protegido incorretamente, o acesso não autorizado aos sistemas e a perda de dados podem resultar.
  • Neste exemplo, o Terraform autentica a conta de armazenamento do Azure usando uma Chave de Acesso. Em uma implantação de produção, é recomendável avaliar as opções de autenticação disponíveis suportadas pelo back-end azurerm e usar a opção mais segura para seu caso de uso.
  • Neste exemplo, o acesso à rede pública é permitido a essa conta de armazenamento do Azure. Em uma implantação de produção, é recomendável restringir o acesso a essa conta de armazenamento usando um firewall de armazenamento, ponto de extremidade de serviço ou ponto de extremidade privado.

3. Configurar o estado de back-end do Terraform

Para configurar o estado de back-end, você precisa das seguintes informações de armazenamento do Azure:

  • storage_account_name: o nome da conta do Armazenamento do Azure.
  • container_name: o nome do contêiner de blob.
  • chave: o nome do arquivo do repositório de estado a ser criado.
  • access_key: a chave de acesso de armazenamento.

Cada um desses valores pode ser especificado no arquivo de configuração ou na linha de comando. Recomendamos que você use uma variável de ambiente para o valor access_key. Usar uma variável de ambiente impede que a chave seja gravada no disco.

Execute os seguintes comandos para obter a chave de acesso de armazenamento e armazená-la como uma variável de ambiente:

ACCOUNT_KEY=$(az storage account keys list --resource-group $RESOURCE_GROUP_NAME --account-name $STORAGE_ACCOUNT_NAME --query '[0].value' -o tsv)
export ARM_ACCESS_KEY=$ACCOUNT_KEY

Pontos principais:

  • Para proteger ainda mais a chave de acesso da conta do Armazenamento do Azure, armazene-a no Cofre de Chaves do Azure. A variável de ambiente pode então ser definida usando um comando semelhante ao seguinte. Para obter mais informações sobre o Azure Key Vault, confira a documentação do Azure Key Vault.

    export ARM_ACCESS_KEY=$(az keyvault secret show --name terraform-backend-key --vault-name myKeyVault --query value -o tsv)
    

Crie uma configuração do Terraform com um bloco de configuração de backend.

terraform {
  required_providers {
    azurerm = {
      source  = "hashicorp/azurerm"
      version = "~>3.0"
    }
  }
  backend "azurerm" {
      resource_group_name  = "tfstate"
      storage_account_name = "<storage_account_name>"
      container_name       = "tfstate"
      key                  = "terraform.tfstate"
  }

}

provider "azurerm" {
  features {}
}

resource "azurerm_resource_group" "state-demo-secure" {
  name     = "state-demo"
  location = "eastus"
}

Substitua <storage_account_name> pelo nome da sua conta de armazenamento do Azure.

Execute o seguinte comando para inicializar a configuração:

terraform init

Execute o seguinte comando para executar a configuração:

terraform apply

Você poderá encontrar o arquivo de estado no Azure Storage Blob.

4. Entender o bloqueio de estado

Os blobs de Armazenamento do Azure são bloqueados automaticamente antes de qualquer operação que grava o estado. Esse padrão impede operações de estado simultâneas, o que pode causar danos.

Para obter mais informações, confira Bloqueio de Estado na documentação do Terraform.

Você pode ver o bloqueio ao examinar o blob por meio do portal do Azure ou em outras ferramentas de gerenciamento do Azure.

Azure blob with lock

5. Entender a criptografia em repouso

Os dados armazenados em um Blob do Azure são criptografados antes de serem persistidos. Quando necessário, o Terraform recupera o estado do back-end e o armazena na memória local. Se você usar esse padrão, o estado nunca será gravado no disco local.

Para obter mais informações sobre a criptografia de Armazenamento do Azure, confira Criptografia do serviço de Armazenamento do Azure para dados em repouso.

Solucionar problemas do Terraform no Azure

Solucionar problemas comuns ao usar o Terraform no Azure

Próximas etapas