¿Cómo puedo identificar una referencia circular en Terraform?
Escenario
Tengo un problema donde un módulo Terraform ha definido la cola SQS y su política internamente, pero obtengo el siguiente error al intentar ejecutar el comando terraform plan, apply e incluso refresh. ¿Por qué?
Error
El valor de "count" depende de los atributos de recursos que no se pueden determinar hasta el momento de la aplicación, por lo que Terraform no puede predecir cuántas instancias se crearán. Para solucionarlo, utiliza el argumento -target.
Código del usuario
module "my_sqsqueue" {
source = "[redactado]"
sqs_name = "${local.some_name}"
sqs_policy = <<EOF
{
"Version": "2012-10-17",
"Id": "my_policy",
"Statement": [
{
"Sid": "111",
"Effect": "Allow",
"Principal": {
"AWS": "*"
},
"Action": "sqs:SendMessage",
"Resource": "${module.my_sqsqueue.sqs_queue_arn}",
"Condition": {
"ArnEquals": {
"aws:SourceArn": "[redactado]"
}
}
}
]
}
EOF
}
Definición del módulo
resource "aws<em>sqs</em>queue<em>policy" "main</em>queue<em>policy" {
count = var.sqs</em>policy != "" ? 1 : 0
queue<em>url = aws</em>sqs<em>queue.main</em>queue.id
policy = var.sqs_policy
}
resource "aws<em>sqs</em>queue" "main<em>queue" {
content</em>based<em>deduplication = var.sqs</em>content<em>based</em>deduplication
delay<em>seconds = var.sqs</em>delay<em>seconds
fifo</em>queue = var.sqs<em>fifo</em>queue
kms<em>data</em>key<em>reuse</em>period<em>seconds = var.sqs</em>kms<em>data</em>key<em>reuse</em>period<em>seconds
kms</em>master<em>key</em>id = var.sqs<em>kms</em>master<em>key</em>id
max<em>message</em>size = var.sqs<em>max</em>message<em>size
message</em>retention<em>seconds = var.sqs</em>message<em>retention</em>seconds
name = var.sqs<em>name
receive</em>wait<em>time</em>seconds = var.sqs<em>receive</em>wait<em>time</em>seconds
visibility<em>timeout</em>seconds = var.sqs<em>visibility</em>timeout_seconds
tags = merge(
{
Name = var.sqs<em>name
},
local.default</em>tag_map
)
}
davy.ai
El mensaje de error indica que hay una dependencia circular en el módulo Terraform, específicamente relacionada con el valor count del recurso aws_sqs_queue_policy. El valor count depende de un atributo del recurso que no se puede determinar hasta aplicar, lo que impide que Terraform pueda predecir el número de instancias que se crearán. Como resultado, esta dependencia circular hace que Terraform falle al ejecutar plan, apply o refresh.
Para resolver la dependencia circular, puedes utilizar el argumento -target para especificar explícitamente el orden en el que se crean los recursos. Alternativamente, podrías mover la definición de la política SQS a un módulo separado, que no tendría una dependencia circular con el recurso aws_sqs_queue.