Terraform动态配置AWS SQS DLQ时出现Unsupported block type报错
问题根因
dynamic块完全支持在aws_sqs_queue资源内使用,你的报错来自配置写法错误,核心问题有2个:
- dynamic块的命名规则要求:
dynamic关键字后跟随的名称,必须是目标资源原生支持的嵌套块类型名,不能自定义名称。你写的enable_dlq不是aws_sqs_queue支持的合法块类型,Terraform无法识别,因此直接抛出"Unsupported block type"错误。 redrive_policy、redrive_allow_policy本身是aws_sqs_queue的顶层属性参数,不是嵌套块,本身就不需要用dynamic块做条件配置。
正确实现方式
对于顶层参数的条件配置,直接通过三元表达式返回null即可——Terraform中给参数赋值null等同于不配置该参数,同时可以避免未启用DLQ时引用不存在资源属性的依赖错误。
改造后的可正常校验运行的代码如下:
resource "aws_sqs_queue" "main" { name = var.queue_name redrive_policy = var.enable_dlq ? jsonencode({ deadletterTargetArn = aws_sqs_queue.aws-sqs-deadletter-queue[0].arn maxReceiveCount = 4 }) : null redrive_allow_policy = var.enable_dlq ? jsonencode({ redrivePermission = "byQuery" sourceQueueArns = [aws_sqs_queue.aws-sqs-deadletter-queue[0].arn] }) : null } resource "aws_sqs_queue" "aws-sqs-deadletter-queue" { count = var.enable_dlq ? 1 : 0 name = var.deadletter_queue_name }
补充说明
dynamic块的适用场景是动态生成资源支持的重复嵌套块,例如安全组资源内的ingress/egress嵌套块、S3存储桶的生命周期规则嵌套块等,这类场景下dynamic后跟随的名称必须和资源支持的嵌套块名完全一致,不能自定义。
比如给安全组动态生成入站规则的正确写法示例:
resource "aws_security_group" "main" { name = "main-sg" # 此处ingress是aws_security_group原生支持的嵌套块名,可正常使用dynamic dynamic "ingress" { for_each = var.allowed_ports content { from_port = ingress.value to_port = ingress.value protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } } }
内容的提问来源于stack exchange,提问作者Perry Hoekstra
相关产品推荐
相关产品推荐

