Как получить доступ к ресурсу между рабочими пространствами Terraform (DNS)? - PullRequest
0 голосов
/ 04 марта 2019

У меня есть 3 среды для моей инфраструктуры.Все они одинаковые, но разных размеров.Я понимаю, что это хороший пример использования рабочих пространств Terraform.И действительно, это хорошо работает в этом отношении.Но, пожалуйста, поправьте меня, если это не правильный путь.

Теперь моя единственная проблема - это управление DNS в рабочих пространствах.Я использую провайдера Google, и он работает, имея 2 типа ресурсов: google_dns_managed_zone, который представляет зону, и тип google_dns_record_set для каждой записи DNS.
Обратите внимание, что тип набора записей должен иметь ссылку натип управляемой зоны.

Имея это в виду, мне нужно управлять зоной DNS из производственной среды.Я не могу поделиться этим ресурсом в других рабочих пространствах, потому что я должен быть в состоянии уничтожить рабочую область dev или staging без разрушения зоны DNS.
Я пытаюсь решить эту проблему с помощью count.Я использую его как логическое значение, как показано в коде ниже, и нахожу его довольно хакерским, но это то, что я нашел в сообществе Terraform.Любое улучшение приветствуется.
Это позволяет мне иметь зону и производственные записи (как MX, показанный ниже в качестве примера) только в рабочем пространстве prod.

Но тогда я застрял, когда дело доходит до управлениянаборы записей только в определенной рабочей области.Мне это нужно, например, в случае создания nginx в рабочей области dev и автоматического создания для него набора записей DNS, например dev.example.com.
Для этого мне нужен доступ к ресурсу управляемой зоны.Как показано ниже, я использую terraform_remote_state для доступа к ресурсу из рабочей области prod.Насколько я понимаю, это работает с output, который вы можете увидеть ниже.Когда я выбираю рабочую область prod, я действительно могу вывести управляемую зону.И затем, если я выберу другое рабочее пространство, используя удаленное состояние, удастся извлечь управляемую зону из prod.Но моя проблема в том, что Terraform завершается неудачно, когда дело доходит до строки output, поскольку она присутствует только в рабочем пространстве prod и не существует ни в каком другом рабочем пространстве и поэтому не может быть выведена.

Так что это чепуха, и я не понимаю, есть ли лучший способ добиться этого.Я провел немало исследований и спросил сообщество, но не смог найти ответ на этот вопрос.Мне кажется, что управление DNS является общим для всех инфраструктур и должно быть довольно хорошо освещено.Что я делаю не так и как это должно быть сделано?

locals {
  environment="${terraform.workspace}"

  dns_zone_managers = {
    "dev"     = "0"
    "staging" = "0"
    "prod"    = "1"
}

  dns_zone_manager = "${lookup(local.dns_zone_managers, local.environment)}"
}

resource "google_dns_managed_zone" "base_zone" {                                                                                                                                               
  name     = "base_zone"                                                                                                                                                               
  dns_name = "example.com."                                                                                                                                                                    
  count = "${local.dns_zone_manager}"                                                                                                                                                          
}                                                                                                                                                                                              

resource "google_dns_record_set" "mx" {                                                                                                                                                        
  name = "${google_dns_managed_zone.base_zone.dns_name}"                                                                                                                                       
  managed_zone = "${google_dns_managed_zone.base_zone.name}"                                                                                                                                   
  type = "MX"                                                                                                                                                                                  
  ttl  = 300                                                                                                                                                                                   

  rrdatas = [                                                                                                                                                                                  
    "10 spool.mail.example.com.",                                                                                                                                                                
    "50 fb.mail.example.com."                                                                                                                                                                    
  ]                                                                                                                                                                                            
  count = "${local.dns_zone_manager}"                                                                                                                                                          
}

data "terraform_remote_state" "dns" {
    backend = "local"
    workspace = "prod"
}

output "dns_zone_name" {
  value = "${google_dns_managed_zone.base_zone.*.name[0]}"
}

Затем я могу вводить наборы записей только в определенном рабочем пространстве, снова используя count и обращаясь к управляемой зоне через удаленное состояние, вот так:

resource "google_dns_record_set" "a" {
  name = "dev"
  managed_zone = "${data.terraform_remote_state.dns.dns_zone_name}"
  type = "A"
  ttl  = 300

  rrdatas = ["1.2.3.4"]
}
...