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

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

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

По умолчанию сведения о состоянии Terraform сохраняются локально. Такой подход применять нежелательно по следующим причинам:

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

Вы узнаете, как выполнять следующие задачи:

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

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

2. Настройка учетной записи хранения для сведений об удаленном состоянии

Прежде чем использовать службу хранилища 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 — имя контейнера больших двоичных объектов;
  • key — имя файла хранилища сведений о состоянии, который необходимо создать;
  • 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.

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

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

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

Блокировку можно увидеть при просмотре большого двоичного объекта на портале Azure или с помощью других средств управления Azure.

Azure blob with lock

5. Сведения о шифровании неактивных данных

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

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

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

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

Следующие шаги