You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修复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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:54:03