Объединить список с картой в терраформе

#amazon-web-services #terraform #terraform-provider-aws #aws-acm

Вопрос:

Я пишу сценарий terraform для автоматизации предоставления acm для доменов, проблема, с которой я сталкиваюсь, заключается в том, как я могу объединить домен и имена subject_alternative_, как будто он должен выбрать первый домен из имени домена и объединить его с первым блоком в subject_alternative_name и продолжить.

Variable.tf

 variable "domain_name" {
  description = "Configuration for alb settings"
  default = [
    "domain.com",
    "helloworld.com",
    "helloworld2.com",
  ]
}
variable "subject_alternative_names" {
  description = "subject_alternative_names"
  default = [ {
    domain.com = {
    "domain.com",
    "domain2.com",
    "domain3.com",
    },
    helloworld.com = {
    "helloworld1.com",
    "helloworld2.com"
    },
    hiworld.com = {
    "hiworld1.com",
    "hiworld2.com"
    }
  }]
}
variable "region" {
  description = "name of the region"
  default     = "us-east-1"
}
variable "validation_method" {
  description = "name of the region"
  default     = "DNS"
}
variable "tags" {
  description = "name of the region"
  default     = "Test"
}
 

работаем variable.tf

 variable "domain_name" {
  description = "Configuration for alb settings"
  default     = [
    "domain.com",
    "helloworld.com",
    "helloworld2.com",
    "helloworld1.com",
    "helloworld3.com",
  ]
}
variable "subject_alternative_names"{
  description = "subject_alternative_names"
  default     = [
    "domain.com",
    "helloworld.com",
    "helloworld2.com",
    "helloworld1.com",
    "helloworld3.com",
  ]
}
variable "region" {
  description = "name of the region"
  default     = "us-east-1"
}
variable "validation_method" {
  description = "name of the region"
  default     = "DNS"
}
variable "tags" {
  description = "name of the region"
  default     = "Test"
}

 

main.tf

 module "acm" {
  count                     = length(var.domain_name)
  source                    = "./modules/acm"
  domain_name               = var.domain_name[count.index]
  validation_method         = var.validation_method
  tags                      = var.tags
  subject_alternative_names = var.subject_alternative_names
}
 

resource.tf

 variable "domain_name" {
  default     = ""
  description = "Nmae of the domain"
}

variable "validation_method" {
  default     = ""
  description = "Validation method DNS or EMAIL"
}

variable "tags" {
  default     = ""
  description = "tags for the ACM certificate"
}

variable "subject_alternative_names" {
  default     = ""
  description = "subject_alternative_names"
}

resource "aws_acm_certificate" "acm_cert" {
  domain_name               = var.domain_name
  validation_method         = var.validation_method
  subject_alternative_names = var.subject_alternative_names
  lifecycle {
    create_before_destroy = true
  }
  tags = {
    Name = var.tags
  }
}
 

Комментарии:

1. Ваш subject_alternative_names неверный код TF. Можете ли вы на самом деле предоставить код, который отражает вашу ситуацию?

2. Я давал имена subject_alternative_names в виде списка, и он работал, но он добавлял имена со всеми доменами, я пытался, чтобы он выбрал 1 домен из имени домена и первый блок из имен subject_alternative_names, затем второе имя домена и второй блок из имен subject_alternative_names

3. @Marcin Я добавил весь код, который у меня есть в вопросе

4. Это неверный код TF, в нем есть синтаксические ошибки. Итак, исправление синтаксических ошибок-это ваша реальная проблема? Или у вас есть несколько проблем? Также domain_name имеет пять предметов, но имеет subject_alternative_names три предмета. Почему они разные? Почему доменные имена разные?

5. @Marcin Я добавил новый файл переменной в качестве рабочей переменной. tf но мне нужно преобразовать имя subject_alternative_ в карты, чтобы я мог объединить его с доменом. Первый блок с первым доменом и так далее. Я отредактировал вопрос

Ответ №1:

Самым простым способом было бы использовать одну карту:

 variable "domain_name_with_alternate_names" {
  default = {
    "domain.com" = [
      "domain.com",
      "domain2.com",
      "domain3.com",
    ],
    "helloworld.com" = [
      "helloworld1.com",
      "helloworld2.com"
    ],
    "hiworld.com" = [
      "hiworld1.com",
      "hiworld2.com"
    ],
    "hiwodd4.com" = []
  }
}


module "acm" {

  for_each                  = var.domain_name_with_alternate_names
  
  source                    = "./modules/acm"
  domain_name               = each.key
  validation_method         = var.validation_method
  tags                      = var.tags
  subject_alternative_names = each.value
}