bembas
bembas

Reputation: 771

Multiple zone ids from cloudflare_zones in terraform

So i have a terraform variable type list(string) that is called zones and contains

zones = [
  "example.com",
  "example2.com",
  "example3.com",
  ...
]

and i m using data cloudflare_zones resource to fetch all zones info

data "cloudflare_zones" "zones" {
  for_each = toset(var.zones)
  filter {
    name = each.value
  }
}

Output for each of the zones

data.cloudflare_zones.zones["example.com"]
{
  "filter" = tolist([
    {
      "account_id" = ""
      "lookup_type" = "exact"
      "match" = ""
      "name" = "example.com"
      "paused" = false
      "status" = ""
    },
  ])
  "id" = "9f7xxx3xxxx"
  "zones" = tolist([
    {
      "id" = "e13xxxx"
      "name" = "example.com"
    },
  ])
}

To fetch the zone id you need to parse data.cloudflare_zones as below:

data.cloudflare_zones.zones["example.com"].zones[0].id

What i want to create then is a variable that will be an object with all the zones names as keys and zone ids ad values, so i can use them in other resources.
For Example:

zones_ids = 
{
  "example.com" = "xxxzone_idxxx",
  "example2.com" = "xxxzone_id2xxx",
  "example3.com" = "xxxzone_id3xxx",
  ...
}

I would like to achieve this inside locals block

locals {
... 
}

Upvotes: 0

Views: 751

Answers (2)

Stigs
Stigs

Reputation: 41

The above answers helped me here but did not give me the final answer. For anyone looking to update A records for cloudflare with a list of domain names that gets the zone_ids for you. Here is how I did it:

locals {
  domains = ["example1.com", "example2.com"]
}


data "cloudflare_zones" "zones" {
  count = "${length(local.domains)}"
  filter {
    name = "${element(local.domains, count.index)}"
  }
}


locals {
  zones_ids = { for k,v in data.cloudflare_zones.zones: k => v.zones[0].id }
}


resource "cloudflare_record" "redir-A-record" {
  for_each = local.zones_ids
  zone_id = each.value  
  name    = "@"
  value   = "24.1.1.1"
  type    = "A"
  proxied = false

}


resource "cloudflare_record" "redir-A-record-www" {
  for_each = local.zones_ids
  zone_id = each.value  
  name    = "www"
  value   = "24.1.1.1"
  type    = "A"
  proxied = false

}

Getting output for these values did not seem to work based on the above answer. This could of just been my confusion but I wanted to print out the zone_id for each domain. I found since it is a tuple it requires the use of a number instead of a name so I was required to do the following to get the proper output:

# Get information for Domain 1
output "Domain_Information" {
  value = data.cloudflare_zones.zones[0].zones[0].id
}

# Get information for Domain 2
output "Domain_Information2" {
  value = data.cloudflare_zones.zones[1].zones[0].id
}

There is a way to loop this in output with Terraform but in my case I only had 2 domains and did not need to spend additional time on this.

Now when I want to spin up a server in AWS and have multiple domains point to 1 IP address this code works.

This line here posted by @Marko E was the solution to my issues for looping and saving the data that could be used later.:

locals {
  zones_ids = { for k,v in data.cloudflare_zones.zones: k => v.zones[0].id }
}

Upvotes: 1

Marko E
Marko E

Reputation: 18148

That should be easy:

locals {
  zones_ids = { for k,v in data.cloudflare_zones.zones: k => v.zones[0].id }
}

Or alternatively:

locals {
  zones_ids = { for k,v in data.cloudflare_zones.zones: v.zones[0].name => v.zones[0].id }
}

Upvotes: 1

Related Questions