Облачная платформа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 для ресурса, так как значение этого таймаута хранится в стейте. Если установить слишком маленькое значение, то провайдер просто не будет работать и исправить это можно будет только ручным изменением стейта.