Terraform 地形:共同创造和依靠

Terraform 地形:共同创造和依靠,terraform,terraform-provider-aws,Terraform,Terraform Provider Aws,我有这个地形代码 // Route53 Zone module "zones" { source = "terraform-aws-modules/route53/aws//modules/zones" version = "~> 1.2.0" create = var.environment == "PRO" ? true : false zones = { "exam

我有这个地形代码

// Route53 Zone
module "zones" {
  source  = "terraform-aws-modules/route53/aws//modules/zones"
  version = "~> 1.2.0"

  create = var.environment == "PRO" ? true : false

  zones = {
    "example.com" = {
      comment = "example.com (production)"
      tags = merge(var.global_tags, { environment = var.environment})
    }
  }
}

// Route53 Records
module "records" {
  source  = "terraform-aws-modules/route53/aws//modules/records"
  version = "~> 1.2.0"

  create = var.environment == "PRO" ? true : false

  zone_name = keys(module.zones.this_route53_zone_zone_id)[0]

  records = [
    {
      name    = "ci"
      type    = "A"
      ttl     = 300
      records = [
        "34.24.14.04",
      ]
    },
  ]

  depends_on = [module.zones]
}
我选择了一个不同于PRO的环境,所以这个模块只创建。。。 运行完地形图后,我得到

错误:索引无效
在main.tf第287行的模块“记录”中:
287:zone\u name=键(module.zones.this\u route53\u zone\u zone\u id)[0]
|----------------
|module.zones.this_route53_zone_zone_id是没有属性的对象
给定的键未标识此集合值中的元素。

我该怎么处理?我想将我的代码与任何值一起使用到去变量环境中。

我们在

使用此模块的解决方案如下所示:

  • example.com
  • 使用可预测的方式引用
    zone\u id=module.zones.zone[“example.com”].zone\u id
  • 在区域中创建记录
注意:应以自然的方式解决依赖关系,因此无需在此解决方案中使用
dependens\u
如果需要意外的依赖关系,我们还为
terraform 0.12
提供了一种方法,使用
模块dependens\u=[…]
这将强制依赖模块内的所有资源

module "zones" {
  source  = "mineiros-io/route53/aws"
  version = "~> 0.3.0"

  # not called 'create' but 'module_enabled' in our modules.
  module_enabled = var.environment == "PRO"

  # it is possible to create multiple zones at once all sharing the same
  # delegation set (nameservers)
  name = [ 
    "example.com" ,
  ]

  comment = "example.com (${var.environment})"

  tags = merge(var.global_tags, {
    environment = var.environment
  })
}

module "records" {
  source  = "mineiros-io/route53/aws"
  version = "~> 0.3.0"

  module_enabled = var.environment == "PRO"

  zone_id = module.zones.zone["example.com"].zone_id

  records = [
    {
      name = "ci"
      type = "A"
      ttl  = 300
      records = [
        "34.24.14.04",
      ]
    },
  ]
}
请参见此处一些更复杂的示例:

这个计划看起来像:

#将创建module.records.aws_route53_record.record[“a-ci”]
+资源“aws\U路由53\U记录”“记录”{
+允许覆盖=错误
+fqdn=(应用后已知)
+id=(应用后已知)
+name=“ci”
+记录=[
+ "34.24.14.04",
]
+ttl=300
+type=“A”
+区域_id=(应用后已知)
}
#将创建module.zones.aws\u route53\u委派集。委派集[0]
+资源“aws_路由53_委派集”“委派集”{
+id=(应用后已知)
+名称\服务器=(应用后已知)
}
#将创建module.zones.aws_route53_zone.zone[“example.com”]
+资源“aws\U路由53\U区域”“区域”{
+comment=“example.com(PRO)”
+委托集id=(应用后已知)
+强制销毁=错误
+id=(应用后已知)
+name=“example.com”
+名称\服务器=(应用后已知)
+标签={
+“Name”=“example.com”
+“环境”=“专业”
}
+区域_id=(应用后已知)
}
计划:3添加,0更改,0销毁。
注意:为了清楚起见,您还可以合并模块的两个调用,并在同一个模块调用中创建区域和记录。我刚刚拆分了用法以匹配您最初的示例