微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Terraform 嵌套 for 循环

如何解决Terraform 嵌套 for 循环

在这里有点挣扎,想知道是否有可能。我有一个 vars,如下所示:

variable "subnets" {
  type = list(object({
    name = string
    cidr_block = string
  }))
  default = [
    {
      name = private
      cidr_block = 10.0.0.1/24
    },{
      name = public
      cidr_block = 10.0.0.2/24
    }
  ]
}

然后我使用数据源查询当前区域的区域

data aws_availability_zones available {}

现在我要做的是在每个 az 区域中创建上述子网,但我似乎无法将这些区域与上述 var 结合起来。

我正在尝试的是

resource aws_suubnet subnet {
 for each  = {for idx,az.name in data.aws_availability_zones.available.names : idx => az.name}
 vpc_id    = var.vpc_id
 availability_zone = data.aws_availability_zones.available.names[each.key]
 cidr_block = (this is where I want to query my var.subnets but I don't seem to be able to do another for 
 here)
}

我希望最终得到的是 6 个子网,3 个私有子网和 3 个公共子网,每个区域中各有一个。非常感谢这里的任何帮助。谢谢

解决方法

我认为您在这里的目的是动态选择两个可用的可用区域并在每个区域中声明一个子网。

这是可能的,我将在下面展示一个配置示例,但首先我要提醒的是,这是一个潜在风险的设计,因为可用区集会随着时间的推移而变化,因此您可能会发现没有任何直接更改根据您的配置,稍后的 Terraform 计划建议在不同的可用区中重新创建一个或两个子网。

出于这个原因,我通常建议将子网分配给可用区,这是您有意选择并在配置中静态编码的内容,而不是动态选择它们,以确保您的配置的效果随着时间的推移保持稳定,除非您有意改变它。


抛开这个警告,我仍然想在这里回答一般性问题,因为在其他情况下可能会出现将两个不同长度的集合“压缩在一起”的一般想法,因此了解它的模式可能会仍然证明是有用的,包括如果您最终决定将可用区列表作为变量而不是数据源查找。

oneToolImg = 'E:\Ujala Documents\hfu ss\forschungspraktikum\oneTool.jpg';
a = imread(oneToolImg);
figure(1)
imshow(a)
pval = impixel(a);
tool = (a(:,:,1)>91) & (a(:,2)>82) & (a(:,3)<252);
figure,imshow(tool)

上例中的最后一个表达式依赖于 the element function,它类似于 variable "subnets" { type = list(object({ name = string cidr_block = string })) } data "aws_availability_zones" "available" { } locals { # The availability zones are returned as an unordered # set,so we'll sort them to be explicit that we're # depending on one particular ordering. zone_names = sort(data.aws_availabililty_zones.available.names) subnets = tolist([ for i,sn in var.subnets : { name = sn.name cidr_block = sn.cidr_block zone = element(local.zone_names,i) } ]) } 之类的索引,但是如果 local.zone_names[i] 太大,它不会返回错误,而是会环绕并再次从区域列表中重新选择相同的项目。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。