Хранение состояния Terraform в службе хранилища Azure

Terraform включает определение, предварительную версию и развертывание облачной инфраструктуры. С помощью Terraform вы создаете файлы конфигурации с помощью синтаксиса HCL. Синтаксис HCL позволяет указать поставщика облачных служб, таких как Azure, и элементы, составляющие облачную инфраструктуру. После создания файлов конфигурации вы создадите план выполнения , который позволяет предварительно просмотреть изменения инфраструктуры перед развертыванием. После того как вы проверите изменения, примените план выполнения для развертывания инфраструктуры.

Состояние Terraform используется для приведения в соответствие развернутых ресурсов с конфигурациями Terraform. Состояние позволяет Terraform знать, какие ресурсы Azure нужно добавлять, обновлять или удалять.

По умолчанию состояние Terraform хранится локально, что не идеально подходит по следующим причинам:

  • Локальное состояние не работает хорошо в команде или среде совместной работы.
  • Состояние Terraform может включать конфиденциальную информацию.
  • Локальное хранение состояния повышает вероятность случайного удаления.

В этой статье вы узнаете, как:

  • Создание учетной записи хранилища Azure
  • Используйте службу хранилища Azure для хранения удаленного состояния Terraform.
  • Понимание блокировки состояния
  • Понять шифрование неактивных данных

1. Настройка среды

Настройте учетную запись для хранения удаленного состояния

Прежде чем использовать службу хранилища Azure в качестве серверной части, необходимо создать учетную запись хранения.

Выполните следующие команды или конфигурацию, чтобы создать учетную запись хранения 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

Ключевые моменты:

  • Для учетных записей хранения Azure требуется глобально уникальное имя. Дополнительные сведения об устранении неполадок с именами учетных записей хранения см. в статье "Устранение ошибок для имен учетных записей хранения".
  • Состояние Terraform хранится в виде обычного текста и может содержать секреты. Если состояние безопасности неверно, это может привести к несанкционированному доступу к системам и потере данных.
  • В этом примере Terraform проходит проверку подлинности в учетной записи хранения Azure с помощью ключа доступа. В рабочем развертывании рекомендуется оценить доступные варианты проверки подлинности , поддерживаемые серверной частью Azurerm, и использовать наиболее безопасный вариант для вашего варианта использования.
  • В этом примере доступ к общедоступной сети разрешен для этой учетной записи хранения Azure. В рабочем развертывании рекомендуется ограничить доступ к этой учетной записи хранения с помощью брандмауэра хранилища, конечной точки службы или частной конечной точки.

3. Конфигурирование состояния бэкенда terraform

Чтобы настроить состояние серверной части, вам потребуется следующая информация о хранилище Azure:

  • storage_account_name. Имя учетной записи хранения Azure.
  • container_name: имя контейнера BLOB-данных.
  • ключ: имя создаваемого файла хранилища состояний.
  • access_key: ключ доступа к хранилищу.

Каждое из этих значений можно указать в файле конфигурации Terraform или в командной строке. Рекомендуется использовать переменную среды для значения access_key. Использование переменной среды предотвращает запись ключа на диск.

Выполните следующие команды, чтобы получить ключ доступа к хранилищу и сохранить его в виде переменной среды:

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

Ключевые моменты:

  • Чтобы защитить ключ доступа к учетной записи хранения Azure, сохраните его в Azure Key Vault. Затем переменная среды может быть задана с помощью команды, аналогичной следующей. Дополнительные сведения о Azure Key Vault см. в документации по Azure Key Vault.

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

Создайте конфигурацию Terraform с конфигурационным блоком 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"
}

Замените <storage_account_name> именем учетной записи хранения Azure.

Выполните следующую команду, чтобы инициализировать конфигурацию:

terraform init

Выполните следующую команду, чтобы запустить конфигурацию:

terraform apply

Теперь вы можете найти файл состояния в blob Azure Storage.

4. Общие сведения о блокировке состояния

Блобы Azure Storage автоматически блокируются перед всеми операциями, записывающими состояние. Этот шаблон предотвращает одновременные операции состояния, которые могут привести к повреждению.

Дополнительные сведения см. в разделе "Блокировка состояния " в документации Terraform.

При просмотре блоба на портале Azure или в других инструментах управления Azure вы увидите блокировку.

Блоб Azure с блокировкой

5. Понимание шифрования данных в состоянии покоя

Данные, хранящиеся в блобе Azure, шифруются до их сохранения. При необходимости Terraform извлекает состояние из серверной части и сохраняет его в локальной памяти. Если вы используете этот шаблон, состояние никогда не записывается на локальный диск.

Дополнительные сведения о шифровании службы хранилища Azure см. в разделе "Шифрование службы хранилища Azure" для неактивных данных.

Устранение неполадок с Terraform в Azure

Устранение распространенных проблем при использовании Terraform в Azure

Дальнейшие шаги