Облачная платформаEvolution

Использование таймаутов в terraform провайдере


Уровни таймаутов в провайдере

1-й уровень. Дефолтный таймаут

Дефолтный таймаут на уровне провайдера. Составляет 1 час для всех ресурсов.

2-й Уровень. Уровень переменной окружения

Переменная окружения CLOUDRU_TERRAFORM_TIMEOUT переопределяет дефолтный таймаут.

Пример использования:

CLOUDRU_TERRAFORM_TIMEOUT=30m terraform apply

Чтобы посмотреть, какое значение применилось, можно запустить в режиме дебага:

TF_LOG=DEBUG CLOUDRU_TERRAFORM_TIMEOUT=30m terraform apply

3-й уровень. Уровень таймаутов ресурса

Данный таймаут самый приоритетный, и он переопределяет как дефолтный таймаут, так и таймаут переменной окружения CLOUDRU_TERRAFORM_TIMEOUT.

Пример для ресурса:

resource "cloudru_evolution_compute_disk" "resource_disk" {
project_id = var.project_id
zone = {
id = local.demo_az.id
}
name = "test-disk"
description = "test disk"
size = 10
readonly = false
shared = false
encrypted = false
bootable = false
disk_type = {
id = local.disk_type.id
}
image = {
id = local.demo_image.id
}
timeouts {
create = "60m"
update = "30m"
delete = "5m"
}
# Если вы хотите, чтобы изменения в таймаутах постоянно не всплывали в стейте, то можно
# указать, чтобы они игнорировались, но нужно учитывать, что таймаут для метода delete
# берёт своё значение из стейта и если изменения игнорируются, то не удастся поменять
# значение для delete и других методов в стейте.
lifecycle {
ignore_changes = [timeouts]
}
}

Пример для датасорса:

data "cloudru_evolution_compute_zone_collection" "zone_demo_collection" {
# Обязательный параметр
project_id = var.project_id
# Опциональный параметр
# page_size = 100
# Опциональный параметр
# filter = "test"
timeouts {
read = "10s"
}
}

Также можно указывать не все таймауты уровня ресурса, и тогда они будут использовать дефолтный таймаут или таймаут переменной окружения CLOUDRU_TERRAFORM_TIMEOUT.

Как искать, какое значение таймаута было задано в логах

В логе можно поискать значение Timeout value is:.

Пример того, как это выглядит в логе:

provider.terraform-provider-cloud_2.1.1_darwin_arm64: Timeout value is: 60s

Бесконечный таймаут

Чтобы установить бесконечный таймаут, есть 2 варианта:

  1. В случае, если не используется таймаут уровня ресурса, можно указать через переменную окружения:

CLOUDRU_TERRAFORM_TIMEOUT=0s terraform apply

Тогда дефолтный таймаут будет переопределён, и таймаут не будет работать. Он станет бесконечным.

  1. Также можно указать бесконечный таймаут уровня ресурса.

Пример:

timeouts {
create = "0s"
update = "0s"
delete = "0s"
}

Тогда для указанных операций таймаут станет бесконечным, но только в рамках этого ресурса. Даже если установлен CLOUDRU_TERRAFORM_TIMEOUT=0s, таймаут уровня ресурса выше по приоритету и будет учитываться именно он.

В случае бесконечного таймаута можно увидеть такое сообщение:

provider.terraform-provider-cloud_2.1.1_darwin_arm64: timeout: Deadline wasn't set

Также в логах можно найти такое значение:

provider.terraform-provider-cloud_2.1.1_darwin_arm64: Timeout value is: 0s

Ограничения

Мы сознательно не добавили таймаут для метода Read для ресурса, так как значение этого таймаута хранится в стейте. Если установить слишком маленькое значение, провайдер просто не будет работать и исправить это можно будет только ручным изменением стейта.