如何修复Terraform用for_each创建SQS死信队列时redrive policy配置报错
问题根因
- 你在
redrive_policy的deadLetterTargetArn字段传入了包含两个DLQ ARN的数组,AWS SQS的红驱策略要求该字段只能接收单个字符串格式的ARN,不支持数组格式,这是触发参数无效报错的直接原因。 - 你没有建立业务队列和对应DLQ的绑定关系,两个业务队列都获取了全部DLQ的ARN,无法实现管理队列绑定管理DLQ、数据队列绑定数据DLQ的需求。
修复方案
方案1:保留原有列表变量(适配现有tfvars不修改的场景)
你现有tfvars的两个列表顺序是一一对应的,只需要按索引匹配对应DLQ即可,修改后的main.tf代码如下:
# 先定义DLQ资源,保证依赖顺序正确 resource "aws_sqs_queue" "CloudTrail_SQS_DLQ"{ for_each = toset(var.dead_queue_names) name = each.value tags = var.default_tags } resource "aws_sqs_queue" "CloudTrail_SQS"{ for_each = toset(var.sqs_queue_names) name = each.value redrive_policy = jsonencode({ # 按当前业务队列的索引匹配同位置的DLQ ARN deadLetterTargetArn = element(values(aws_sqs_queue.CloudTrail_SQS_DLQ)[*].arn, index(var.sqs_queue_names, each.value)) maxReceiveCount = var.max_receive_count }) tags = var.default_tags }
注意:使用该方案需要保证sqs_queue_names和dead_queue_names两个列表的顺序始终一一对应,避免关联错误。
方案2:改用映射变量(更稳妥,推荐)
如果可以调整变量定义,改用键值对映射的方式绑定业务队列和DLQ,完全避免顺序搞错的问题:
首先修改tfvars配置:
sqs_to_dlq_map = { "CloudTrail_SQS_Management_Event" = "CloudTrail_DLQ_Management_Event" "CloudTrail_SQS_Data_Event" = "CloudTrail_DLQ_Data_Event" }
对应main.tf代码:
resource "aws_sqs_queue" "CloudTrail_SQS_DLQ"{ for_each = toset(values(var.sqs_to_dlq_map)) name = each.value tags = var.default_tags } resource "aws_sqs_queue" "CloudTrail_SQS"{ for_each = var.sqs_to_dlq_map name = each.key redrive_policy = jsonencode({ deadLetterTargetArn = aws_sqs_queue.CloudTrail_SQS_DLQ[each.value].arn maxReceiveCount = var.max_receive_count }) tags = var.default_tags }
修改完成后重新执行terraform apply即可正常创建资源。
内容的提问来源于stack exchange,提问作者bibi
相关产品推荐
相关产品推荐

