Terraform使用for_each时出现Missing resource instance key报错如何解决
Terraform SQS for_each批量创建相关报错修复方案
错误根因
- 所有使用
for_each参数批量创建的Terraform资源会以集合形式存在,不能直接调用资源整体的属性,必须指定具体实例索引 each对象仅能在同样配置了for_each参数的resource/module块内部使用,无for_each的块调用each会直接报错
修复步骤
- 给两个
aws_sqs_queue_policy资源块添加和对应SQS资源一致的for_each参数,保证实例key一一对应 - 所有引用批量创建的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
相关产品推荐
相关产品推荐

