skip to Main Content

I am trying to create an AWS route53 hosted zone and add records to it. I added the following resources to a module main.tf

resource "aws_route53_zone" "zone" {
  name = var.name
}

data "aws_route53_zone" "zone_data" {
  name = var.name

}

resource "aws_route53_record" "record" {
  zone_id = data.aws_route53_zone.zone_data.zone_id
  name    = var.record_name
  type    = var.record_type
  ttl     = var.record_ttl
  records = var.record_value
}

Then I reference that module in a stack main.py as follows:

module "route53" {
  source = "../../modules/route53"
  name   = "website.com"
  type   = "NS"
  ttl    = "30"

}

My issue is that building the stack will use the same name variable for both zone and record resources. How do I add another name to the stack module route53 for the record resource that is different from the zone resource?

3

Answers


  1. Chosen as BEST ANSWER

    Randomly experimenting with solutions got me to add the resource variables' names as arguments to the module. This seems to allow referring to arguments of a specific resource in the root module if its argument name is the same as other resources (e.g. record_name vs name).

    module "route53" {
      source = "../../modules/route53"
      name   = "website.com"
      record_name   = "_auth.website.com"
      record_type   = "NS"
      record_ttl    = "30"
    
    }
    

  2. If you have multiple records and names, the best way is to use for_each. For example:

    variable "names" {
        default = ["website.com", "website1.com", "website2.com"]
    }
    

    then

    module "route53" {
      source = "../../modules/route53"
      for_each = toset(var.name)
      name   = each.key
      type   = "NS"
      ttl    = "30"
    
    }
    

    This way you can have same module for multiple names.

    Login or Signup to reply.
  3. If all you’re trying to do in the module is create a zone and a record, you could use split to get the zone from the record name given. Like this:

    main.tf

    module "route53" {
      source = "./modules/route53"
      name   = "something.website.com"
      type   = "NS"
      ttl    = "30"
    }
    

    modules/route53/main.tf

    variable "name" {}
    variable "type" {}
    variable "ttl" {}
    
    resource "aws_route53_zone" "this" {
      name = split(".", var.name)[0]
    }
    
    resource "aws_route53_record" "this" {
      zone_id = aws_route53_zone.this.zone_id
      name    = var.name
      type    = var.type
      ttl     = var.ttl
      records = [var.name]
    }
    

    If however, you want multiple records in that zone, you could consider something like this, but this will depend heavily on what record configuration you’re after.

    main.tf

    module "route53" {
      source = "./modules/route53"
      name   = "website.com"
    
      record_configs = {
        something = {
          type    = "A"
          records = ["192.168.0.99"]
        }
        other = {
          type    = "CNAME"
          records = ["something.website.com"]
        }
      }
    }
    

    modules/route53/main.tf

    variable "name" {}
    variable "record_configs" {}
    
    resource "aws_route53_zone" "this" {
      name = var.name
    }
    
    resource "aws_route53_record" "this" {
      for_each = var.record_configs
    
      zone_id = aws_route53_zone.this.zone_id
      name    = each.key
      type    = each.value.type
      records = each.value.records
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search