Armazenar o estado do Terraform no Armazenamento do Azure

Terraform permite a definição, visualização e implantação de infraestrutura em nuvem. Usando Terraform, você cria arquivos de configuração usando a sintaxe HCL. A sintaxe HCL permite especificar 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 na infraestrutura antes que elas sejam implantadas. Depois de verificar as alterações, você aplica o plano de execução para implantar a infraestrutura.

O estado Terraform é usado para reconciliar recursos implantados com configurações Terraform. State permite que o Terraform saiba quais recursos do Azure adicionar, atualizar ou excluir.

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

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

Neste artigo, vai aprender a:

  • Criar uma conta de armazenamento do Azure
  • Use o armazenamento do Azure para armazenar o estado remoto do Terraform.
  • Compreender o bloqueio de estado
  • Compreender a encriptação em repouso

1. Configure seu ambiente

  • Subscrição do Azure: se não tem uma subscrição do Azure, crie uma conta gratuita antes de começar.

2. Configurar conta de armazenamento de estado remoto

Antes de usar o Armazenamento do Azure como back-end, você deve criar uma conta de armazenamento.

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

#!/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 contas de armazenamento, consulte Resolver erros para nomes de contas de armazenamento.
  • O estado Terraform é armazenado em texto simples e pode conter segredos. Se o estado estiver incorretamente protegido, o acesso não autorizado aos sistemas e a perda de dados podem resultar.
  • Neste exemplo, o Terraform autentica na 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 esta 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, um ponto de extremidade de serviço ou um 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 de Armazenamento do Azure.
  • container_name: O nome do contêiner de blob.
  • key: O nome do arquivo de armazenamento 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 Terraform ou na linha de comando. Recomendamos que você use uma variável de ambiente para o access_key valor. O uso de 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 da Chave 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, consulte 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 Terraform com um bloco de backend configuração.

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

Agora você pode encontrar o arquivo de estado no blob de Armazenamento do Azure.

4. Entenda o bloqueio de estado

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

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

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

Azure blob with lock

5. Entenda a criptografia em repouso

Os dados armazenados em um blob do Azure são criptografados antes de serem persistentes. 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 do Armazenamento do Azure, consulte 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óximos passos