Нужна помощь в устранении ошибки цикла в приведенной ниже конфигурации. я не могу найти ссылку на workbench_service ни в одной из групп безопасности. файл locals выглядит следующим образом:
locals {
security_groups = {
ALB_Internal_rules_workbench_prod = {
ingress = {
WCC_user_redirect = {
description = "Wcc Internal users connect to ALB_Internal_rules_workbench_prod"
type = "ingress"
port = 8080
protocol = "tcp"
cidr_blocks = var.workstation_subnets
}
WCC_workspaces_redirect = {
description = "Workspaces users connect to ALB_Internal_rules_workbench_prod"
port = 8080
protocol = "tcp"
cidr_blocks = var.workspace_subnets
}
}
egress = {
all = {
description = "Traffic to workbench service"
type = "egress"
port = 8080
protocol = "tcp"
//cidr_blocks = ["10.103.8.0/24"]
source_security_group_rule = aws_security_group.this["workbench_service"].id
}
}
}
workbench_service = {
ingress = {
from_ALB_Internal_rules_workbench_prod = {
description = "Traffic from ALB_Internal_rules_workbench_prod"
type = "ingress"
port = 8080
protocol = "tcp"
//source_security_group = aws_security_group.this["ALB_Internal_rules_workbench_prod"].id
cidr_blocks = ["10.103.8.0/24"]
}
}
egress = {
all = {
type = "egress"
port = 0
protocol = "-1"
protocl = "tcp"
cidr_blocks = ["10.103.8.0/24"]
}
https = {
description = "HTTPS traffic from ecs services"
type = "egress"
port = 443
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
efs = {
description = "workbench to efs mount points"
type = "egress"
port = 2049
protocol = "tcp"
//source_security_group = aws_security_group.this["efs_mount_sg"].id
cidr_blocks = ["10.103.8.0/24"]
}
}
}
}
security_group_rules_flat = flatten([
for rule_key, rule_value in local.security_groups : [
for rule_type_key, rule_type_attr in rule_value : [
for rule, rule_attr in rule_type_attr : {
security_group = rule_key
protocol = rule_attr.protocol
port = try(rule_attr.port, null)
from_port = try(rule_attr.from_port, null)
to_port = try(rule_attr.to_port, null)
type = rule_type_key
name = rule
description = try(rule_attr.description, null)
cidr_blocks = try(rule_attr.cidr_blocks, null)
source_security_group_key = try(rule_attr.source_security_group_key, null)
}
]
]
])
security_group_rules = { for rule in local.security_group_rules_flat : "${rule.security_group}.${rule.type}.${rule.name}" => rule }
}
группы безопасности определены в файле sg.tf, как показано ниже:
resource "aws_security_group" "this" {
for_each = local.security_groups
name = "${var.cluster_name}/${each.key}"
description = "Security group for ${var.cluster_name}/${each.key}"
vpc_id = var.vpc_id_prod
tags = merge(var.tags, { Name = "${var.cluster_name}/${each.key}" })
}
resource "aws_security_group_rule" "this" {
for_each = local.security_group_rules
security_group_id = aws_security_group.this[each.value.security_group].id
description = try(each.value.description, null)
type = each.value.type
from_port = coalesce(each.value.port, each.value.from_port)
to_port = coalesce(each.value.port, each.value.to_port)
protocol = each.value.protocol
cidr_blocks = try(each.value.cidr_blocks, null)
source_security_group_id = try(coalesce(each.value.source_security_group_id, aws_security_group.this[each.value.source_security_group_key].id), null)
}
Проверка terraform генерирует ошибку ниже, как указано в теме:
Ошибка: Цикл: aws_security_group.this, local.security_groups (развернуть)
Причина цикла зависимости в том, что ваш aws_security_group.this
зависит от local.security_groups
, а ваш вложенный local.security_groups.ALB_Internal_rules_workbench_prod.egress.all.source_security_group_rule
вызывает зависимость от aws_security_group.this
. К сожалению, вы не можете избежать этого, изменив на for_each = toset(keys(local.security_groups))
.
Вам нужно будет исправить это, отделив имена групп безопасности от local.security_groups
с правилами групп безопасности из local.security_groups
. Имена должны быть set
или list
, преобразованными в set
, а правила группы безопасности могут оставаться в структуре, указанной выше. Например:
locals {
security_group_names = toset(["ALB_Internal_rules_workbench_prod", "workbench_service"])
}
а потом:
resource "aws_security_group" "this" {
for_each = local.security_group_names
...
}
спасибо Мэтту за указание на это, я внес изменения, и сейчас они проходят проверку; но при применении конфигурации кажется, что он не может найти идентификатор эталонной группы безопасности: Error: One of ['cidr_blocks', 'ipv6_cidr_blocks', 'self', 'source_security_group_id', 'prefix_list_ids'] must be set to create an AWS Security Group Rule │ │ with aws_security_group_rule.this["ALB_Internal_rules_workbench_prod.egress.all"], │ on r_sg.tf line 12, in resource "aws_security_group_rule" "this": │ 12: resource "aws_security_group_rule" "this" {
@Zuntoo Это другой вопрос по сравнению с исходным.
Не получал ошибку перед выполнением кода, я предполагаю, что предложенные изменения вызвали ошибку, признателен, если вы можете ответить Марко
@Zuntoo Это действительно другой вопрос. Теперь, когда я решил вашу циклическую зависимость, Terraform выдает следующую ошибку из-за другой проблемы в вашем коде.
спасибо Мэтту за указание на это, я внес изменения, и сейчас они проходят проверку; но при применении конфигурации кажется, что он не может найти идентификатор эталонной группы безопасности:
Error: One of ['cidr_blocks', 'ipv6_cidr_blocks', 'self', 'source_security_group_id', 'prefix_list_ids'] must be set to create an AWS Security Group Rule │ │ with aws_security_group_rule.this["ALB_Internal_rules_workbench_prod.egress.all"], │ on r_sg.tf line 12, in resource "aws_security_group_rule" "this": │ 12: resource "aws_security_group_rule" "this" {