Terraform:一起创建和 depends_on

Terraform: create and depends_on together

我有这个 terraform 代码...

// 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]
}

我 select 一个不同于 PRO 的环境,所以这个模块除了... 运行 terraform 计划后我得到...

Error: Invalid index

  on main.tf line 287, in module "records":
 287:   zone_name = keys(module.zones.this_route53_zone_zone_id)[0]
    |----------------
    | module.zones.this_route53_zone_zone_id is object with no attributes

The given key does not identify an element in this collection value.

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

我们在 github.com/mineiros-io/terraform-aws-route53

创建了一个 route53 模块作为 open-source terraform 库的一部分

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

  • example.com
  • 创建区域
  • 使用可预测的方式引用 zone_id = module.zones.zone["example.com"].zone_id
  • 在区域中创建记录

注意:依赖关系应该以自然方式解决,因此无需在此解决方案中使用 depends_on 如果需要意外的依赖关系,我们还提供了一种方法为此 terraform 0.12 通过使用 module_depends_on = [...] 这将强制依赖模块中的所有资源。

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",
      ]
    },
  ]
}

在此处查看一些更复杂的示例:github.com/mineiros-io/terraform-aws-route53/tree/master/examples

计划类似于:

  # module.records.aws_route53_record.record["a-ci"] will be created
  + resource "aws_route53_record" "record" {
      + allow_overwrite = false
      + fqdn            = (known after apply)
      + id              = (known after apply)
      + name            = "ci"
      + records         = [
          + "34.24.14.04",
        ]
      + ttl             = 300
      + type            = "A"
      + zone_id         = (known after apply)
    }

  # module.zones.aws_route53_delegation_set.delegation_set[0] will be created
  + resource "aws_route53_delegation_set" "delegation_set" {
      + id           = (known after apply)
      + name_servers = (known after apply)
    }

  # module.zones.aws_route53_zone.zone["example.com"] will be created
  + resource "aws_route53_zone" "zone" {
      + comment           = "example.com (PRO)"
      + delegation_set_id = (known after apply)
      + force_destroy     = false
      + id                = (known after apply)
      + name              = "example.com"
      + name_servers      = (known after apply)
      + tags              = {
          + "Name"        = "example.com"
          + "environment" = "PRO"
        }
      + zone_id           = (known after apply)
    }

Plan: 3 to add, 0 to change, 0 to destroy.

注意:为了清楚起见,您也可以合并模块的两个调用并在同一个模块调用中创建区域和记录。我只是拆分了用法以匹配您的初始示例。