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

Terraform使用for_each时出现Missing resource instance key报错如何解决

Terraform SQS for_each批量创建相关报错修复方案

错误根因

  • 所有使用for_each参数批量创建的Terraform资源会以集合形式存在,不能直接调用资源整体的属性,必须指定具体实例索引
  • each对象仅能在同样配置了for_each参数的resource/module块内部使用,无for_each的块调用each会直接报错

修复步骤

  1. 给两个aws_sqs_queue_policy资源块添加和对应SQS资源一致的for_each参数,保证实例key一一对应
  2. 所有引用批量创建的SQS资源属性的位置,补充[each.key]实例索引

修复后完整配置示例

# 原有业务SQS队列配置保持不变
resource "aws_sqs_queue" "CloudTrail_SQS"{
  for_each                   = var.sqs_queue_names
  name                       = each.value
  visibility_timeout_seconds = var.visibility_timeout_seconds
  max_message_size           = var.max_message_size
  message_retention_seconds  = var.message_retention_seconds
  delay_seconds              = var.delay_seconds
  receive_wait_time_seconds  = var.receive_wait_time_seconds
  redrive_policy = jsonencode({
    deadLetterTargetArn    = aws_sqs_queue.CloudTrail_SQS_DLQ[each.key].arn
    maxReceiveCount        = var.max_receive_count
  })
  tags = var.default_tags
}

# 原有死信队列配置保持不变
resource "aws_sqs_queue" "CloudTrail_SQS_DLQ"{
  for_each                   = var.dead_queue_names
  name                       = each.value
  visibility_timeout_seconds = var.visibility_timeout_seconds
  max_message_size           = var.max_message_size
  message_retention_seconds  = var.message_retention_seconds
  delay_seconds              = var.delay_seconds
  receive_wait_time_seconds  = var.receive_wait_time_seconds
  tags = var.default_tags
}

# 修复后的业务SQS队列策略
resource "aws_sqs_queue_policy" "Cloudtrail_SQS_Policy" {
  # 新增for_each,和业务SQS队列用同一个变量保证key对齐
  for_each  = var.sqs_queue_names
  queue_url = aws_sqs_queue.CloudTrail_SQS[each.key].id

  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect   = "Allow"
        Action   = "sqs:SendMessage"
        Resource = aws_sqs_queue.CloudTrail_SQS[each.key].arn
        Principal = {
          Service = "cloudtrail.amazonaws.com"
        }
      }
    ]
  })
}

# 修复后的死信队列策略
resource "aws_sqs_queue_policy" "CloudTrail_SQS_DLQ" {
  # 新增for_each,和死信队列用同一个变量保证key对齐
  for_each  = var.dead_queue_names
  queue_url = aws_sqs_queue.CloudTrail_SQS_DLQ[each.key].id

  # 可根据实际需求调整DLQ的策略规则
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Effect   = "Allow"
        Action   = "sqs:*"
        Resource = aws_sqs_queue.CloudTrail_SQS_DLQ[each.key].arn
        Principal = {
          AWS = "*"
        }
      }
    ]
  })
}

报错对应修复说明

  • 原Missing resource instance key报错:补充[each.key]指定具体实例即可解决
  • 原Reference to "each" in context without for_each报错:给对应资源块加上匹配的for_each参数即可解决

内容的提问来源于stack exchange,提问作者bibi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 14:24:03