Terraform: Неподходящее значение для атрибута «вход» при создании SG

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

Вопрос:

Я создаю группу безопасности, используя terraform, и когда я запускаю план terraform. Это выдает мне ошибку, как будто некоторые поля обязательны, и все эти поля являются необязательными.

Версия терраформирования: v1.0.5

Версия поставщика AWS: v3.57.0

main.tf

 resource "aws_security_group" "sg_oregon" {
  name        = "tf-sg"
  description = "Allow web traffics"
  vpc_id      = aws_vpc.vpc_terraform.id

  ingress = [
    {
      description      = "HTTP"
      from_port        = 80
      to_port          = 80
      protocol         = "tcp"
      cidr_blocks      = ["0.0.0.0/0"]  
    },
  {
      description      = "HTTPS"
      from_port        = 443
      to_port          = 443
      protocol         = "tcp"
      cidr_blocks      = ["0.0.0.0/0"]  
  },

    {
      description      = "SSH"
      from_port        = 22
      to_port          = 22
      protocol         = "tcp"
      cidr_blocks      = ["0.0.0.0/0"]  
    }
  ]


  egress = [
    {
      description      = "for all outgoing traffics"
      from_port        = 0
      to_port          = 0
      protocol         = "-1"
      cidr_blocks      = ["0.0.0.0/0"]
      ipv6_cidr_blocks = ["::/0"]
      
    }
  ]

  tags = {
    Name = "sg-for-subnet"
  }
}
 

ошибка в консоли

 │ Inappropriate value for attribute "ingress": element 0: attributes "ipv6_cidr_blocks", "prefix_list_ids", "security_groups", and "self" are required.

│ Inappropriate value for attribute "egress": element 0: attributes "prefix_list_ids", "security_groups", and "self" are required.
 

Я следую этому документу: https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group

Любая помощь будет признательна.

Ответ №1:

Поскольку вы используете атрибуты в качестве блоков, вы должны указать значения для всех параметров:

 resource "aws_security_group" "sg_oregon" {
  name        = "tf-sg"
  description = "Allow web traffics"
  vpc_id      = aws_vpc.vpc_terraform.id

  ingress = [
    {
      description      = "HTTP"
      from_port        = 80
      to_port          = 80
      protocol         = "tcp"
      cidr_blocks      = ["0.0.0.0/0"]  
      ipv6_cidr_blocks = []
      prefix_list_ids = []
      security_groups = []
      self = false
    },
  {
      description      = "HTTPS"
      from_port        = 443
      to_port          = 443
      protocol         = "tcp"
      cidr_blocks      = ["0.0.0.0/0"]  
      ipv6_cidr_blocks = []
      prefix_list_ids = []
      security_groups = []
      self = false      
  },

    {
      description      = "SSH"
      from_port        = 22
      to_port          = 22
      protocol         = "tcp"
      cidr_blocks      = ["0.0.0.0/0"]  
      ipv6_cidr_blocks = []
      prefix_list_ids = []
      security_groups = []
      self = false      
    }
  ]


  egress = [
    {
      description      = "for all outgoing traffics"
      from_port        = 0
      to_port          = 0
      protocol         = "-1"
      cidr_blocks      = ["0.0.0.0/0"]
      ipv6_cidr_blocks = ["::/0"]
      prefix_list_ids = []
      security_groups = []
      self = false
    }
  ]

  tags = {
    Name = "sg-for-subnet"
  }
}
 

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

1. Я заметил такое поведение только недавно, когда Радек Симко добавил их в документы поставщика AWS. В чем преимущество атрибутов как стиля блоков по сравнению с динамическими блоками? Они оба чувствуют себя немного неуклюжими, поэтому я удивлен, что есть два разных способа делать такие вещи.

2. @ydaetskcoR Вы можете создавать правила, используя циклы, и это помогает при предоставлении значений по умолчанию для параметров с картами. В случае OP, вероятно, было бы проще использовать синтаксис блока. Проблема, которую я нахожу с атрибутами в виде блоков, заключается в том, что некоторые блоки поддерживают этот альтернативный способ, некоторые нет. Так что это не согласуется с TF.

3. Я только что видел github.com/hashicorp/terraform-plugin-framework/issues/85 итак, я предполагаю, что блоки могут быть уничтожены в пользу атрибутов в качестве блоков?

4. похоже ConfigMode: schema.SchemaConfigModeAttr, , что для работы атрибутов в качестве блока ему требуется атрибут. github.com/hashicorp/terraform-provider-aws/commit/… тоже неплохо написано.

5. @AbhishekKumar Документы устарели. И преимущества могут быть выражены в одной строке ingress = var.my_ingress_rules . Это позволит вам установить все правила сразу, используя входную переменную, а не повторять их снова var.my_ingress_rules и использовать динамические блоки. Гораздо проще читать, писать и отлаживать.

Ответ №2:

Вы можете избежать необходимости указывать так называемые необязательные параметры, объявив правила в альтернативном формате:

 resource "aws_security_group" "sg_oregon" {
  name        = "tf-sg"
  description = "Allow web traffics"
  vpc_id      = aws_vpc.vpc_terraform.id

  ingress {
    description = "HTTP"
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    description = "HTTPS"
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    description = "SSH"
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    description      = "for all outgoing traffics"
    from_port        = 0
    to_port          = 0
    protocol         = "-1"
    cidr_blocks      = ["0.0.0.0/0"]
    ipv6_cidr_blocks = ["::/0"]

  }

  tags = {
    Name = "sg-for-subnet"
  }
}