Почему terraform не может правильно вычислить локальную переменную в следующем тривиальном сценарии? - PullRequest
1 голос
/ 15 апреля 2020

Имеется следующая конфигурация (main.tf):

locals {
    locations = toset(["a", "b"])
}

resource "local_file" "instance" {
    for_each = local.locations

    content  = each.value
    filename = "${path.module}/${each.value}.txt"
}

output "primary_filename" {
    value = local_file.instance["a"].filename
}

И, похоже, она работает нормально:

C:\work\test> dir


    Directory: C:\work\test


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----        4/15/2020  11:47 PM            280 main.tf


C:\work\test> terraform init

Initializing the backend...

Initializing provider plugins...
- Checking for available provider plugins...
- Downloading plugin for provider "local" (hashicorp/local) 1.4.0...

...
C:\work\test> terraform apply -auto-approve
local_file.instance["b"]: Creating...
local_file.instance["a"]: Creating...
local_file.instance["a"]: Creation complete after 0s [id=86f7e437faa5a7fce15d1ddcb9eaeaea377667b8]
local_file.instance["b"]: Creation complete after 0s [id=e9d71f5ee7c92d6dc9e92ffdad17b8bd49418f98]

Apply complete! Resources: 2 added, 0 changed, 0 destroyed.

Outputs:

primary_filename = ./a.txt
C:\work\test>

Теперь я удаляю файл a.txt и запускаю заново:

C:\work\test> del .\a.txt
C:\work\test> terraform apply -auto-approve
local_file.instance["a"]: Refreshing state... [id=86f7e437faa5a7fce15d1ddcb9eaeaea377667b8]
local_file.instance["b"]: Refreshing state... [id=e9d71f5ee7c92d6dc9e92ffdad17b8bd49418f98]

Error: Invalid index

  on main.tf line 13, in output "primary_filename":
  13:     value = local_file.instance["a"].filename
    |----------------
    | local_file.instance is object with 1 attribute "b"

The given key does not identify an element in this collection value.

Это можно исправить с помощью функции try:

    value = try(local_file.instance["a"].filename, "")

Что заставляет его работать:

C:\work\test> terraform apply -auto-approve
local_file.instance["b"]: Refreshing state... [id=e9d71f5ee7c92d6dc9e92ffdad17b8bd49418f98]
local_file.instance["a"]: Refreshing state... [id=86f7e437faa5a7fce15d1ddcb9eaeaea377667b8]
local_file.instance["a"]: Creating...
local_file.instance["a"]: Creation complete after 0s [id=86f7e437faa5a7fce15d1ddcb9eaeaea377667b8]

Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Outputs:

primary_filename = ./a.txt
C:\work\test>

Теперь я знаю, что мы Я не должен удалять ресурсы вне terraform, но вещи случаются, и я ожидаю, что terraform обрабатывает это изящно. И это так, за исключением этого поведения локальной переменной.

Мне не нравится использовать функцию try, потому что это скрыло бы реальную проблему. В идеале он должен вести себя как try на этапе планирования и без try на этапе применения.

В любом случае, у меня есть ощущение, что я упускаю что-то важное здесь, как будто я не использую локальные переменные правильно или что-то еще. Итак, что мне не хватает?

...