首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Terraform更好地处理1个资源内的多个循环

用Terraform更好地处理1个资源内的多个循环
EN

Stack Overflow用户
提问于 2022-06-23 05:54:04
回答 1查看 62关注 0票数 0

我试图在多个A记录资源的基础上创建多个CNAME资源,并且正在努力寻找实现这一目标的方法。

目前,我的variable.tfvars文件中有以下内容:

代码语言:javascript
复制
hostnames = [
  "webserver1",
  "webserver2"
]
domain = domain.com
subdomain_addresses = [
  "www-1",
  "www-2",
  "www-3"
]

我有来自我的ec2实例模块的以下输出,它基于var.hostnames的长度:(在这个实例中将有2个私有IP)

代码语言:javascript
复制
output "server_ip_addresses" {
  value = aws_instance.this.*.private_ip
}

目前,我的resource.tf文件中有以下内容:

代码语言:javascript
复制
resource "aws_route53_record" "instance_record" {
  for_each = toset(var.hostnames)

  zone_id = data.aws_route53_zone.route53_zone.zone_id
  name    = "${each.value}.${var.domain}"
  type    = "A"
  ttl     = "300"
  records = module.ec2_instance.server_ip_addresses
}

resource "aws_route53_record" "webservice_records" {
  for_each = toset(var.subdomain_addresses)

  zone_id = data.aws_route53_zone.route53_zone.zone_id
  name    = "${each.value}.${var.domain}"
  type    = "CNAME"
  ttl     = "300"
  records = [values(aws_route53_record.instance_record)[*].name]
}

我需要的是让webservice_records资源为var.subdomain_addresses中的每个条目创建一个子域,但将每个子域与每个aws_route53_record.instance_record.name输出关联起来。

例如,instance_record创建了以下A条记录:

  • webserver1.domain.com = 10.1.1.18
  • webserver2.domain.com = 10.1.1.19

webservice_records创建了以下CNAME:

  • www-1.domain.com = webserver1.domain.com,webserver2.domain.com
  • www-2.domain.com = webserver1.domain.com,webserver2.domain.com
  • www-3.domain.com = webserver1.domain.com,webserver2.domain.com

我目前正在收到以下错误:

代码语言:javascript
复制
╷
│ Error: Incorrect attribute value type
│ 
│   on resource.tf line 62, in resource "aws_route53_record" "webservice_records":
│   62:   records = [values(aws_route53_record.instance_record)[*].name]
│     ├────────────────
│     │ aws_route53_record.instance_record is object with 2 attributes
│ 
│ Inappropriate value for attribute "records": element 0: string required.
╵

是否有人对如何实现这一目标有更好的了解?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-23 10:45:06

您可以使用setproduct函数来实现以下输出:

所以创建一个地图就像这样:

代码语言:javascript
复制
locals {
  hostnames = [
    "webserver1",
    "webserver2"
  ]
  domain = "domain.com"
  subdomain_addresses = [
    "www-1",
    "www-2",
    "www-3"
  ]
  webserver_list = [ for web_list in setproduct(local.hostnames, [local.domain]) :  join(".",web_list) ]
  cname_map = {for sub_domain in local.subdomain_addresses: sub_domain => local.webserver_list}
}


resource "aws_route53_record" "cnames" {
  for_each = local.cname_map

  zone_id = data.aws_route53_zone.route53_zone.zone_id
  name    = each.key
  type    = "CNAME"
  ttl     = "300"
  records = each.value
}

cname_map看起来是这样的:

代码语言:javascript
复制
 cname_map= {
       www-1 = [
           "webserver1.domain.com",
           "webserver2.domain.com",
        ]
       www-2 = [
           "webserver1.domain.com",
           "webserver2.domain.com",
        ]
       www-3 = [
           "webserver1.domain.com",
           "webserver2.domain.com",
        ]
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72725165

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档