Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

361
Visualizações
Bucles de Terraform con for_each

¿Cómo se obtendría la identificación de la subred si está usando for_each en lugar de contar? En mi caso, estoy haciendo algo como esto.

 resource "aws_instance" "k8s" { for_each = var.profiles ami = data.aws_ami.latest-ubuntu.id instance_type = "t2.medium" iam_instance_profile = "${each.value}" subnet_id = ?????????????? vpc_security_group_ids = [var.security_group] key_name = var.keyname connection { type = "ssh" host = self.public_ip user = "ubuntu" private_key = file(var.private_key_path) } tags = { Name = "${each.key}" } }

Y esto se debe a que estoy creando instancias similares pero necesito asignarles diferentes perfiles de instancia.

Idealmente, habría hecho algo como

 subnet_id = element(var.subnets, count.index )

para colocar las instancias en diferentes subredes, pero no creo que count y for_each se puedan usar en la misma definición de bloque.

Tengo subredes y 4 instancias y me gustaría recorrer las subredes, colocando cada instancia en una.

¿Alguna idea, por favor? Gracias.

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Si var.profiles es una lista, puede usar each.key para obtener el índice de cada elemento.

over 4 years ago · Santiago Trujillo Relatório

0

puede proporcionar sus perfiles como una lista de objetos:

por ejemplo :

 variable "profiles" { type = list(object({ name = string key = string })) default = [ {name = "exemple" , key = "exemplekey" }, {name = "exemple2" , key = "exemplekey2" } ] }

así, each.key contendrá el índice del elemento en la lista y each.value contendrá el objeto {name,key}

por lo que su código sería así

 resource "aws_instance" "k8s" { for_each = var.profiles ami = data.aws_ami.latest-ubuntu.id instance_type = "t2.medium" iam_instance_profile = each.value subnet_id = element(var.subnets , each.key) vpc_security_group_ids = [var.security_group] key_name = var.keyname connection { type = "ssh" host = self.public_ip user = "ubuntu" private_key = file(var.private_key_path) } tags = { Name = each.value.key }

}

over 4 years ago · Santiago Trujillo Relatório

0

Una buena estrategia general con resource for_each es diseñar la estructura de datos que le pasa para que each.value contenga todos los datos por instancia que necesita dentro del bloque de recursos.

En este caso, eso significa que la expresión for_each para su recurso aws_instance sería un mapa de objetos donde cada objeto tiene un perfil de instancia y una identificación de subred.

Una forma de lograrlo sería escribir una expresión for que transforme var.profiles (que presumiblemente es un set(string) ) en un mapa de objetos que obtendría el resultado que desea. Por ejemplo:

 resource "aws_instance" "k8s" { for_each = { # This assigns a subnet to each of the profiles # by first sorting them by name to produce a list # and then selecting subnets based on the order # of the sort result. for i, profile_name in sort(var.profiles) : profile_name => { iam_instance_profile = profile_name subnet_id = element(var.subnets, i) } } ami = data.aws_ami.latest-ubuntu.id instance_type = "t2.medium" iam_instance_profile = each.value.iam_instance_profile subnet_id = each.value.subnet_id vpc_security_group_ids = [var.security_group] key_name = var.keyname }

El uso de count.index con el element element se basaba en que cada elemento tenía su propio índice, pero ese no es el caso para un conjunto de cadenas, por lo que en lo anterior usé sort para convertir a una lista bajo el supuesto de que para esta situación no Realmente no importa qué subred se asigna a cada instancia, siempre que las instancias terminen distribuidas de manera más o menos uniforme entre las subredes.

Sin embargo, hay una gran implicación de eso a tener en cuenta: si agrega un nuevo elemento a var.profiles más tarde, puede causar que se reasigne el subnet_id para las instancias existentes y, por lo tanto, requerirá que esas instancias se vuelvan a crear. Si no desea que eso sea cierto, deberá hacer que la selección de subred por perfil sea más explícita de alguna manera, lo que podría hacerse haciendo que var.profiles sea una list(string) en lugar de un set(string) y luego, documente que los nuevos perfiles solo deben agregarse al final de esa lista, o alternativamente, puede mover la decisión hacia la persona que llama de su módulo haciendo que var.profiles sea un mapa de objetos donde la persona que llama luego especificaría una subred por perfil :

 variable "profiles" { type = map(object({ subnet_id = string })) }

En ese caso, su bloque de recursos se volvería más simple porque el valor de la variable ya tendría una forma adecuada:

 resource "aws_instance" "k8s" { for_each = var.profiles ami = data.aws_ami.latest-ubuntu.id instance_type = "t2.medium" iam_instance_profile = each.key subnet_id = each.value.subnet_id vpc_security_group_ids = [var.security_group] key_name = var.keyname }
over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda