简体   繁体   中英

Create multiple DNS Route53 A record using Terraform

I have created some AWS EC2 instances using terraform as below:

resource "aws_instance" "deploya"{
....
}
resource "aws_instance" "deployb"{
....
}
resource "aws_instance" "deployc"{
....
}

For the above aws_instances, I want to create route_53 A record.

I have the names for the A record in locals as below. They are also used at many other places in the script

locals {
    namea = "namea.aws.ra.com"
    nameb = "nameb.aws.ra.com"
    namec = "namec.aws.ra.com"
}   

I know I can create Route53 A record for each aws_instance as below:

resource "aws_route53_record" "www" {
      allow_overwrite = true
      zone_id = data.aws_route53_zone.selected.zone_id
      name    = local.namea
      type    = "A"
      ttl     = "300"
      records = [aws_instance.deploya.private_ip]
    }

The issue I am facing in the manual approach above is code length, repetition and maintainability I want to use some iteration here to keep the code compact, which I am not able to figure out being new to Terraform. Also, there could be many more aws_instances.

How can the code be kept compact here?

You can use for_each when creating resources:

locals {
  instances = {
    namea = "namea.aws.ra.com"
    nameb = "nameb.aws.ra.com"
    namec = "namec.aws.ra.com"
  }
}
resource "aws_route53_record" "www" {
  for_each        = local.instances
  allow_overwrite = true
  zone_id         = data.aws_route53_zone.selected.zone_id
  name            = each.value
  type            = "A"
  ttl             = "300"
  records         = [aws_instance.deploya.private_ip]
}

Answering my own question. If someone wants to achieve creating N num of A records for N num of ec2 instances please you can use map to iterate key and value.

locals {
  host_names = {
    namea = "namea.aws.ra.com"
    nameb = "nameb.aws.ra.com"
    namec = "namec.aws.ra.com"
  }
  deploy_names = {
    deploya = aws_instance.deploya
    deployb = aws_instance.deployb
    deployc = aws_instance.deployc
  }
  host_deploy_names = zipmap(values(local.host_names),values(local.deploy_names))
}
resource "aws_route53_record" "www" {
  for_each        = local.host_deploy_names
  allow_overwrite = true
  zone_id         = data.aws_route53_zone.selected.zone_id
  name            = each.key
  type            = "A"
  ttl             = "300"
  records         = [each.value.private_ip]
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM