【发布时间】:2021-05-04 08:46:29
【问题描述】:
在 terraform 中,如果我使用 for_each 对地图进行迭代,是否有任何方法可以在任何迭代中访问先前迭代期间创建的资源中的值?
module "my_module" {
for_each = var.regions
这显然意味着顺序很重要,但如果我确保我的地图的定义方式是依赖关系先于依赖关系,我可以引用它吗?
【问题讨论】:
标签: terraform
在 terraform 中,如果我使用 for_each 对地图进行迭代,是否有任何方法可以在任何迭代中访问先前迭代期间创建的资源中的值?
module "my_module" {
for_each = var.regions
这显然意味着顺序很重要,但如果我确保我的地图的定义方式是依赖关系先于依赖关系,我可以引用它吗?
【问题讨论】:
标签: terraform
对于这样的情况,我认为使用 Terraform 的 count 功能是有意义的:
module "my_module" {
# assuming var.regions is a list:
count = len(var.regions)
# region is var.regions[count.index]
# previous region is var.regions[count.index - 1]
您需要解决如何处理第一个项目;要么只迭代len(var.regions)-1 次,要么为第一个项目做一些特别的事情。
for_each 语法用于迭代映射或集合。这意味着顺序应该不重要,因为地图和集合不是有序的数据结构。这也意味着您实际上不能“以依赖关系先于依赖关系的方式定义您的地图”。您可能希望定义一个包含地图键的列表,其中的键按可接受的顺序排列。
【讨论】:
Terraform 的重复结构不是迭代:从概念上讲,实例都同时应用它们的动作。实际上,如果您拥有的实例数量超过了 -parallelism 选项所允许的数量,情况并非总是如此,但即使在这种情况下,Terraform 处理它们的顺序也是未定义的。
Terraform 中的依赖关系在块之间,而不是在同一块的多个实例之间,因为重复的处理是作为处理块的一部分发生的,在依赖关系已经解决很久之后。
因此,如果您想让一个模块实例依赖于另一个模块实例,您必须将它们声明为两个单独的块,其中一个引用另一个。无法在同一对象的多个实例之间创建依赖关系。
【讨论】: