Terraform присваивает переменную освещенному блоку

Использую провайдер aws. Для каждой группы безопасности я указываю одно и то же правило для ssh. Как извлечь его в переменную и назначить в список aws_security_group.ingress?

Чего я ожидаю:

variable "ssh_ingress" {
  default = {
    from_port = 22
    protocol = "tcp"
    to_port = 22
    description = "SSH for administration."
  }
}
resource "aws_security_group" "main" {
  ingress += var.ssh_ingress // That not work.

  ingress {
    from_port = 0
    protocol = "-1"
    to_port = 0
    self = true
  }

}

person Belenot    schedule 07.01.2021    source источник


Ответы (2)


Вы можете использовать aws_security_group_rule для добавления правил в существующую группу безопасности. .

Например:

variable "ssh_ingress" {
  default = {
    from_port = 22
    protocol = "tcp"
    to_port = 22
    description = "SSH for administration."
  }
}

resource "aws_security_group" "main" {
  name        = "allow_tls"
  description = "Allow TLS inbound traffic"
  vpc_id      = data.aws_vpc.main.id
}

resource "aws_security_group_rule" "default" {
  type              = "ingress"
  from_port         = 0
  to_port           = 0
  protocol          = -1
  self              = true
  security_group_id = aws_security_group.main.id
}

resource "aws_security_group_rule" "example" {
  type              = "ingress"
  from_port         = var.ssh_ingress.from_port
  to_port           = var.ssh_ingress.to_port
  protocol          = var.ssh_ingress.protocol
  cidr_blocks       = ["10.0.0.0/11"]
  security_group_id = aws_security_group.main.id
}

Альтернатива с несколькими встроенными правилами входа

resource "aws_security_group" "main" {
  name        = "allow_tls"
  description = "Allow TLS inbound traffic"
  vpc_id      = data.aws_vpc.main.id
  
  ingress {
    from_port = 0
    protocol = "-1"
    to_port = 0
    self = true
  }
  
 ingress {
   from_port         = var.ssh_ingress.from_port
   to_port           = var.ssh_ingress.to_port
   protocol          = var.ssh_ingress.protocol
   cidr_blocks       = ["10.0.0.0/11"]
  }
  
}
person Marcin    schedule 07.01.2021
comment
Спасибо, но как насчет этой заметки на странице документа aws_security_group. Не будет ли отменено правило встроенного входящего трафика? Terraform currently provides both a standalone Security Group Rule resource (a single ingress or egress rule), and a Security Group resource with ingress and egress rules defined in-line. At this time you cannot use a Security Group with in-line rules in conjunction with any Security Group Rule resources. Doing so will cause a conflict of rule settings and will overwrite rules. registry.terraform.io/providers/hashicorp/aws / latest / docs / - person Belenot; 07.01.2021
comment
@Belenot Вы правы. Развернется, но лучше не рисковать. Затем вы можете разделить все правила или использовать несколько встроенных правил. Обновлю ответ. - person Marcin; 07.01.2021

Вы можете записать блок ingress со ссылками на атрибуты вашей переменной:

variable "ssh_ingress" {
  type = object({
    from_port   = number
    to_port     = number
    protocol    = string
    description = string
  })

  default = {
    from_port = 22
    protocol = "tcp"
    to_port = 22
    description = "SSH for administration."
  }
}

resource "aws_security_group" "main" {
  ingress {
    from_port   = var.ssh_ingress.from_port
    protocol    = var.ssh_ingress.protocol
    to_port     = var.ssh_ingress.to_port
    description = var.ssh_ingress.description
  }
}

Сам блок ingress представляет собой статическую структуру, а не значение. Вы можете заполнить его аргументы динамическими значениями, но вы не можете генерировать сами аргументы динамически. Terraform проверяет наличие всех ожидаемых аргументов, прежде чем считать конфигурацию действительной.

Однако Terraform считает, что значение null в подобном блоке эквивалентно пропуску аргумента, поэтому, если вызывающий модуль вашего модуля должен был установить, например, description = null, то провайдер AWS увидит это точно так же, как если бы он пропустил description аргумент в целом.

person Martin Atkins    schedule 07.01.2021