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