#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"
}
}