【发布时间】:2021-11-29 07:59:25
【问题描述】:
由 terraform 创建后创建的资源会占用创建它的集群上的 CPU/RAM, 因此在创建同一集群上的下一个资源之前需要某种延迟。
作为实现这一目标的一个选项,决定使用 time_sleep terraform 资源来实现 创建资源之前的一些延迟。
还决定使用-parallelism=1,以便资源一个一个地创建。
假设我们有一个模块(尽可能简单):
模块测试,main.tf
resource "time_sleep" "wait_3_seconds" {
create_duration = "3s"
}
resource "null_resource" "topic_events" {
triggers = {
always_run = timestamp()
topic = var.topic_name
}
depends_on = [time_sleep.wait_3_seconds]
}
模块测试,变量.tf
variable topic_name {}
主模块调用模块测试(见上文):
module "test" {
for_each= tomap(var.environments[var.dim_arr].clusters.events.topics)
source = "./test"
topic_name = "${var.dim_arr}.${each.value.topic}"
}
逻辑是在循环中处理输入值,但由于 time_sleep 测试模块中的资源在这个循环中引入了一些延迟,这反过来又 应该会减少服务器的负载。
但是 terraform 尝试在嵌套模块中创建所有 time_sleep 资源 然后遍历主模块中的对象并以这种方式创建它们:
a) 创建所有 time_sleep 资源
b) 所有依赖于它们的资源(参见 a))都被创建
有什么办法可以改变这个逻辑,让
-创建使用时间睡眠的资源
-time_sleep 资源导致延迟以减少集群负载
-处理循环中的下一个对象
欢迎提出任何建议或想法。
谢谢。
【问题讨论】:
-
TF 是声明性编程语言,而不是程序性语言。您正在尝试做的只是现在 TF 的设计方式。为什么不使用其他 IoC 工具来让您正确地做自己想做的事?
-
我有一个 for_each 循环。在这个循环中处理资源,但是不是循环 terraform 将工作拆分为 2 个部分(忽略depends_on)并创建第一部分,然后将其链接到第二部分,而不是创建任何一个 time_sleep 资源的资源实现我想要实现的目标。
-
我只是在测试一些东西,
depends_on非常严格,我们几乎无能为力我尝试使用for_each创建两个模块,并在它们之间使用索引depends_on = [module.test2[each.key]]但不允许,它与A single static variable reference is required: only attribute access and indexing with constant keys. No calculations, function calls, template expressions, etc are allowed here出错