Terraform: инфраструктура на уровне кода | страница 93
Конфигурацию некоторых ресурсов Terraform можно определять отдельно или в виде вложенных блоков. При создании модулей всегда следует отдавать предпочтение отдельным ресурсам.
Например, ресурс aws_security_group позволяет определять входящие и исходящие правила в виде вложенных блоков. Вы уже это видели в модуле webserver-cluster (modules/services/webserver-cluster/main.tf):
resource "aws_security_group" "alb" {
name = "${var.cluster_name}-alb"
ingress {
from_port = local.http_port
to_port = local.http_port
protocol = local.tcp_protocol
cidr_blocks = local.all_ips
}
egress {
from_port = local.any_port
to_port = local.any_port
protocol = local.any_protocol
cidr_blocks = local.all_ips
}
}
Вы должны модифицировать этот модуль так, чтобы те же входящие и исходящие правила определялись в виде отдельных ресурсов aws_security_group_rule (не забудьте сделать это для обеих групп безопасности в данном модуле):
resource "aws_security_group" "alb" {
name = "${var.cluster_name}-alb"
}
resource "aws_security_group_rule" "allow_http_inbound" {
type = "ingress"
security_group_id = aws_security_group.alb.id
from_port = local.http_port
to_port = local.http_port
protocol = local.tcp_protocol
cidr_blocks = local.all_ips
}
resource "aws_security_group_rule" "allow_all_outbound" {
type = "egress"
security_group_id = aws_security_group.alb.id
from_port = local.any_port
to_port = local.any_port
protocol = local.any_protocol
cidr_blocks = local.all_ips
}
При попытке одновременного использования вложенных блоков и отдельных ресурсов вы получите ошибки, когда правила маршрутизации конфликтуют и переопределяют друг друга. Поэтому вы должны выбрать что-то одно. В связи с этим ограничением при создании модуля всегда следует использовать отдельные ресурсы вместо вложенных блоков. В противном случае ваш модуль получится менее гибким и конфигурируемым.
Например, если все входящие и исходящие правила в модуле webserver-cluster определены в виде отдельных ресурсов aws_security_group_rule, вы сможете сделать этот модуль достаточно гибким для того, чтобы разрешить пользователям добавлять собственные правила за его пределами. Для этого идентификатор aws_security_group нужно экспортировать в виде выходной переменной внутри modules/services/webserver-cluster/outputs.tf:
output "alb_security_group_id" {
value = aws_security_group.alb.id