GitHub

Tensho

Заметки непутевого программиста

Terraform Output

17/02/2019

Terraform позволяет вывести полезную информацию с помощью output директивы. Таким образом, после применения изменений к инфраструктуре, можно посмотреть, например, IP адрес замененного EC2 или URI новосозданного RDS инстанса. Есть один интересный ньюанс работы с такого рода выхлопом в рамках Terraform модулей. Давайте рассмотрим следующий пример корневого модуля: s

output "a" {
  value = "A"
}

output "b" {
  value = "B"
}

module "x" {
  source = "x"
}

Здесь определены корневые (родительские) значения вывода a и b, а также затребован модуль x. Модуль x имеет свои выводы c и d:

output "c" {
  value = "C"
}

output "d" {
  value = "D"
}

Чтобы увидеть выводы нужно сначала применить обновления к текущему состоянию (даже если фактически состояния нет – первый запуск):

$ terrafrom apply

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

Outputs:

a = A
b = B

Если нужно посмотреть выводы позже, то для этого есть отдельная команда CLI output:

$ terraform output
a = A
b = B

Однако, где ожидаемые c и d из модуля x? Их нет! Точнее они есть, но не видны. Так задумано по дизайну Terraform – корневой модуль должен явно определять выводы модулей, т.к. модуль должен восприниматься чем-то инкапсулированным, скрывающим свои внутринности. Так как же все-таки увидеть желаемое? Во первых можно вспороть модуль через CLI опцию -module:

$ terraform output -module=x
c = C
d = D

Но конечно это подходит только для обособленной интроспекции модуля. Чтобы фактически использовать выводы модуля x в корневом модуле, нужно проксировать изолированный выводы модуля:

output "a" {
  value = "A"
}

output "b" {
  value = "B"
}

module "x" {
  source = "x"
}

// Proxy output from module
output "c" {
  value = "${module.x.c}"
}

output "d" {
  value = "${module.x.d}"
}

Не забываем применить изменения к состоянию и смотрим что теперь все как надо:

$ terrafrom apply

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

Outputs:

a = A
b = B
c = C
d = D